Python과 OpenCV – 3 : 코드로 이미지에 도형 그리기

참조한 글은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_drawing_functions/py_drawing_functions.html 입니다.

이미지는 사진이나 동영상을 통해 얻을 수도 있지만 코드를 통해서도 생성할 수 있습니다. 아래의 코드는 512×512 크기의 3개의 채널로 되어 있으며 채널의 구성 데이터 타입은 unit8입니다.

이 이미지 위에 다양한 도형을 그리는 코드를 정리해 볼텐데요. 먼저 두점으로 구성된 선분을 그리는 코드입니다.

위의 코드는 좌표(0,0)에서 좌표(512,512)로 구성된 선분을 색상은 (B,G,R) 순서인 (255,0,0)인 파란색으로 굵기는 5pixel로 그립니다. 다음 코드는 사각형을 그리는 코드입니다.

위의 코드는 좌상단 (384,0)과 우하단 (510,128)인 지사각형을 초록색(0,255,0)으로 3Pixel 굵기로 그립니다. 다음은 원을 그리는 코드입니다.(

위의 코드는 중심점 (447,63)이고 반지름은 63인 원을 빨간색(0,0,255)으로 하여 굵기속성은 -1로 함으로써 도형을 채움형태로 그리는 코드입니다. 다음은 타원을 그리는 코드입니다.

위의 코드는 중심점이 (256,256)이고 가로 반지름과 세로 반지름을 각각 (100,50)이며, 45도 시계방향으로 회전하고 시작각 0도 종료각 180도인 타원을 빨간색(0,0,255)로 채워진(-1) 타원을 그리는 코드입니다. 다음은 폴리라인을 그리는 코드입니다.

위의 코드는 총 4개의 좌표로 구성된 pts를 이용해 색상은 BRG값이 각각 (0,255,255)로 하여 폴리곤을 그리는 코드인데.. cv2.polylines의 3번째를 True로 지정하여 폐합(시작점과 끝점을 연결)하도록 그립니다. 마지막으로 문자를 그리는 코드입니다.

위치 (10,500)에 OpenCV라는 문자열을 폰트 크기 4로 하여 백색(255,255,255)로 하여 굵기는 2로 그리는 코드입니다.

지금까지 그린 이미지를 화면에 표시하기 위해 아래의 코드를 덧붙입니다.

Python과 OpenCV – 2 : 비디오를 가지고 시작하기

원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html 입니다. OpenCV에는 카메라를 통해서도 이미지를 받을 수 있습니다. 아래의 코드는 컴퓨터에 연결된 카메라를 통해 영상을 받아 표시하는 코드입니다.

4번 코드에서 첫번째(0) 카메라를 VideoCapture 타입의 객체로 얻어옵니다. 6번은 이 카메라의 영상에 대한 가로, 세로에 대한 픽셀 길이를 출력합니다. 필자의 경우 640 480이 출력되었습니다. 8,9번 코드를 통해 가로와 세로의 크기를 각각 320×240으로 변경합니다. q 키를 누를때까지 11번의 반복문이 무한 반복됩니다. 12번에서 카메라로부터 현재의 영상 하나를 읽어오고, 14번에서 이 영상을 Gray로 변환합니다. 16번에서 이 Gray 영상을 Window에 표시합니다. q 키를 눌러 Window를 닫게 되면 프로그램이 종료되는데, 이때 사용한 카메라에 대한 리소스 해제에 대한 코드가 20번입니다.

카메라로부터 영상을 표시할 수도 있지만, 이를 파일로 기록할 수도 있습니다. 이래의 코드처럼요.

7번의 코드에서 기록할 동영상 파일명과 프레임률(20), 영상의 크기(640, 480)을 지정합니다. 파일명의 확장자는 mp4나 avi 등이 가능한데, 확장자에 따라 만들어지는 영상의 포멧이 결정됩니다. 실제 영상의 저장은 13번 코드입니다. 테스트로 12번 코드에서 영상을 뒤집어 기록하도록 하였습니다. q 키를 눌러 영상을 기록하는 반복문이 종료되면 비디오 객체를 해제해야 하는데 해당 코드가 바로 21, 22번입니다.

카메라가 아닌 동영상 파일로부터도 영상을 얻어 표시할 수 있는데, 해당 코드는 아래와 같습니다.

카메라를 통한 영상 표시에 대한 코드와 모두 동일한데, 차이점은 단지 4번의 VideoCapture 함수의 인자가 카메라 인덱스가 아닌 파일명이라는 점입니다.