본문 바로가기

딥러닝

12강 - OpenCV와 함께하는 이미지 기초 - 이미지에 그리기 - 마우스로 이미지에 직접 그리기 - 1부


안녕하세요 여러분, 이번 시간에는 마우스로 직접 이미지에 드로잉하는 법을 알아볼게요
OpenCV로 콜백을 사용해 이미지를 이벤트 기능과 연결할 수 있습니다
또한 콜백은 직접 이미지나 인터렉티브 비디오에도 연결할 수 있게 합니다
강의를 3 파트로 나눠, 우선 콜백 기능 연결부터 보겠습니다
그다음 이벤트 선택을 통한 기능 추가,
마지막으로 이 함수를 확장해서 마우스를 드래그하여 기능하게 해보겠습니다
우선, 실제 이미지에 콜백을 사용하여 어떻게 함수에 연결하는지 보여드릴게요
이 작업들을 할 때, 셀에서 작업하기보다는 파이썬 스크립트에서 작업할 것을 추천해 드립니다
이 작업들을 할 때, 셀에서 작업하기보다는 파이썬 스크립트에서 작업할 것을 추천해 드립니다
저는 지금 셀에서 작업이 가능하지만
특히 맥 OS나 리눅스에서 작업한다면 파이썬 스크립트에서 해야 할 겁니다
기억해 두세요
질문이 있으면 OpenCV 이미지 작업 강의를 다시 보고 오시길 바랍니다
어쨌든 주피터 랩으로 가보겠습니다
우선 뭘 하든 하나의 셀이나 스크립트에서 돌리라고 강조하고 싶습니다
기능을 드로잉에 연결하는 방법을 보여주면서 시작해 볼게요
{import cv2} 그리고 {import numpy as np}를 입력하세요


첫째로, 함수를 위해 특정 섹션을 막는 작업을 할 겁니다
따라서 이 함수는 나중에 작동합니다
그래서 다음 섹션이 바로
실제 이미지를 보여주지요 {SHOWING IMAGE WITH OPENCV}를 입력하세요
'OpenCV와 노트북으로 이미지 보여주기' 강의를 꼭 먼저 보시고 따라오세요

이 2개를 메인 코드로 하겠습니다
이미 익숙한 이미지 불러오기로 시작하겠습니다
먼저 검정색 이미지를 생성할 거라서
{img = np.zeros}를 입력하고
형태에 {(512, 512, 3)}을 입력하세요
다 블랙으로 나올 겁니다 이 부분을 정수로 하기 위해
{np.int8}를 입력하세요

이는 정수 0만 있는 아주 심플한 이미지입니다 이제, 저번에 했던 것처럼 {while True}에
{cv2.imshow}를 입력하고 윈도우 이름을 입력하면 됩니다


이름은 여러분이 정하세요 중간에 공백만 들어가지 않으면 됩니다
{('my_drawing',img)}를 입력하겠습니다
하다 보면 오타가 날 수도 있다는 걸 항상 유의하세요
주어진 노트에서 직접 복사 붙여넣는 것을 추천합니다 이제 while True 반복문에서
빠져나오기 위해서
if 구문이 필요합니다
{if cv2.waitKey(20) & 0xFF == 27}
20 밀리초가 지나고 만약 누군가가 esc 키를 누르면
{break} 이 루프에서 빠져나가는 것입니다


그리고 마지막 부분에 {cv2.destroyALLWindows}를 입력하면 됩니다
새로운 내용이 아닙니다


이 내용을 전에 다룬 적이 있지요
cv2.destroyALLWindows
새로운 부분은, 함수를 보이는 이미지에 연결하고

실제 윈도의 이름을 통해 연결된다는 겁니다
이번 함수 섹션에 함수를 생성할건데
{def draw_circle}을 입력하세요 기본값으로 특정 이미지나 비디오를 콜백해서 연결하면
몇 개의 인자가 나옵니다
{(event,x,y,flags,param)}이죠
지금은 {pass}를 입력하고 넘어갈게요 draw_circle 인자로 할 것은 없습니다


이 함수를 이미지 콜백과 연결할 시간입니다
제가 하는 것을 잘 보세요 {cv2.namedWindow()}를 입력하고
{(winname=' ')}에 일치하는 이름을 입력하면 됩니다


여기 imshow에 입력했던 이름이요
이 문자열을 복사 붙여넣기할게요
이 문자열에 공백이 없다는 걸 유의하세요
따라서 {'my_drawing'}이 됩니다
콜백에 연결할 때는 {cv2.set}에, 나중에 공부해 볼 콜백 종류가 많지만,

마우스 콜백이 가장 흔하기 때문에 {setMouseCallback}을 입력할게요
다시 한번 {'my_drawing'}을 입력하면 됩니다


반드시 일치해야 합니다 주의해 주세요
두번째 인자로는 콜백 함수를 입력합니다 {draw_circle}


함수를 직접 입력했기 때문에 실제로 실행하지 않아도 됩니다 그래서 괄호도 추가로 입력하지 않는 거고요
마지막에 괄호를 닫기만 하면 됩니다
이것이 함수를 윈도우에 나타나는 이미지에 연결하는 방법입니다
namedWindow로 이름을 연결하고, setMouseCallback에 이름과
함수가 주어졌습니다
이 윈도우가 같은 이름을 공유하기에 이 draw_circle 함수에 연결되는 겁니다
이 함수와는 어떻게 상호작용할 수 있는 걸까요?
기본값으로 이 매개변수들을 입력했고, 이 매개변수들은 마우스 콜백을 설정할 때 자동으로 호출되어 입력됩니다


여기 이 x, y는 openCV에 의해 자동으로 적용됩니다
마우스 위치의 x와 y는 어디인지 물어보는 거죠
event는 마우스가 어떤 작동을 했는지, 오른쪽, 왼쪽, 더블 클릭과 같은 것을 말합니다
플래그와 매개변수도 추가 매개변수가 나오거나 경고 플래그가 필요한 경우 입력됩니다


여기 draw_circle의 매개변수들은 setMouseCallback에 대부분 자동으로 채워집니다
그래서 이 함수가 있기는 하지만 따로 호출을 하지는 않는 거죠
저희 같은 경우는
{if event == cv2.EVENT}를 입력하고
탭을 누르면 선택할 수 있는 많은 이벤트가 나타납니다
마우스 휠, 마우스 무빙, 마우스 버튼 업, 라잇 버튼 업 등이 있습니다
예로 들기 쉬운 걸로 하도록 하죠


{EVENT_LBUTTONDOWN}을 입력하세요
이는 왼쪽 버튼이 눌렸다는 의미입니다

왼쪽 버튼을 클릭 후 손을 뗄 때가 아니라 클릭된 순간 이벤트가 발생한다는 것에 주의하세요
왼쪽 마우스 버튼을 클릭한 순간 어떤 효과가 나타난다는 의미입니다
사용자가 손을 뗄 때까지 기다려 주지 않습니다
나중에 왼쪽 버튼 업과 다운을 같이 사용할 거라 꽤 중요한 특징이라 할 수 있죠
만약 이벤트가 왼쪽 버튼 다운이라면 {cv2.circle(img)}와
여기서 보여드린 이미지라는 걸 기억하세요
현재 마우스 위치를 찾을 겁니다 setMouseCallback의 x, y값입니다

그리고 MouseCallback에 입력됐던 event인 걸 기억합니다
이 event는 왼쪽 버튼 다운 클릭이었고, 마우스의 위치에 의해 x, y가 정해지는 것이죠
이제 이미지를 가져다가 특정 x, y 값에 원의 중앙을 위치하면 됩니다
그다음에 좀 더 많은 것을 추가할 수 있지요
원의 반지름과
컬러를 추가 입력할 수 있습니다
초록색으로 나타나게 하고 원을 -1로 채우도록 합시다
전에도 본 적 있는 매개변수죠


원을 그리는 것에서 중앙, 반지름, 컬러, 두께를 확인할 수 있습니다
-1인 경우에는 꽉찬 원이 됩니다
이 변화값들을 저장하세요 저는 하나의 셀에서 이것을 실행해 보겠습니다
여러분들이 맥 OS나 리눅스를 사용한다면, 잊지 마시고 모든 명령어를 .py 스크립트 파일에
복사해서 붙여 넣으세요
이제 실행해 볼게요


실행되고 있다는 별표 표시가 보입니다
여기로 다시 내려와서 그릠을 확인하겠습니다 그림을 클릭할 수 있고
클릭하는 곳마다 초록색 원이 생겨납니다
잘 잘동하는지 확인하시고
esc 키를 누르면 창을 닫습니다


여기서 무슨 일이 일어나고 있냐면

이벤트, x, y, 플래그, 매개변수를 포함한 함수를 특정 이벤트와 연결하여
이미지에 어떤 효과를 나타낼 수 있다는 겁니다
이것을 namedwindow와 setMousecallback으로 연결해서 이미지 자체를 보여줄 수도 있습니다

좋습니다
관련 내용은 이게 다입니다
마지막으로 한마디 덧붙이자면, 아마 이미지가 살짝 흑백인 걸 보았을 텐데요
이는 np.int8을 이용하기 때문입니다
원한다면 제거해도 무방합니다
다시 한번 실행하면 완벽히 검정색으로 나오는 걸 볼 수 있죠
여러분이 하고 싶은대로 하세요
앞으로의 수업에서도 이런 식이라는 걸 기억하면 됩니다
감사합니다
다음 시간에 뵙겠습니다

12강 - OpenCV와 함께하는 이미지 기초 - 이미지에 그리기 - 마우스로 이미지에 직접 그리기 - 1부 (1).ipynb
0.00MB