반응형

이번 포스팅에서는 OpenCV Python의 좌표계와 그리기 함수를 사용하기 전에 알아야 하는 개념에 대해서 설명합니다. 

 

 

2015.  1.  2 - 최초 작성

2023. 4. 13 - 최종작성



관련 포스트

OpenCV 좌표계를 직교 좌표계로 변환하는 Python 코드

https://webnautes.tistory.com/1812

 

OpenCV 좌표계 변환( Top Left ↔ Bottom Left )

https://webnautes.tistory.com/1815

 

 

OpenCV Python에서는 좌표를 튜플로 나타냅니다. 튜플의 첫번째 원소가 x 좌표, 두번째 원소가 y좌표입니다. 

 

( x , y )



이미지의 왼쪽 위가 원점 (0,0)입니다. 오른쪽으로 갈수록 x값이 증가하고 아래쪽으로 갈수록 y 값이 증가합니다. 

 



이미지를 생성하여 윈도우 창에 보여주는 예제 코드입니다. 

우선 전체 코드를 실행시켜 결과를 확인해보세요.

 

import numpy as np
import cv2 as cv

width = 640
height = 480
bpp = 3

img = np.zeros((height, width, bpp), dtype=np.uint8)


img_h, img_w, img_bpp = img.shape

print(img_h, img_w, img_bpp)

cv.imshow("drawing", img)
cv.waitKey(0)



실행해보면 아래 캡쳐화면처럼 윈도우 창이 검은색으로 채워집니다.  

 



그리고 다음 값이 출력됩니다. 순서대로 이미지의 높이, 이미지의 너비, bpp(=bits per pixel)가 출력됩니다. 

 

480 640 3



1.  Mat 객체에 저장했던 C++용 OpenCV와  달리 Python에서는 NumPy 라이브러리의 ndarray 객체에  이미지 데이터를 저장합니다. 

그래서 numpy 모듈을 임포트(import)해야 하는 경우가 많습니다.

 

이후 ndarray 객체와 이미지를 같은 의미로 혼용해서 사용합니다.  

 

import numpy as np
import cv2 as cv



2. 크기가 width x height x bpp인 ndarray 객체를 생성하고 있습니다.

컬러 이미지의 경우 하나의 픽셀마다 3개의 채널을 가지기 때문에 bpp를 3으로 해야 하며 픽셀의 한 채널당 크기가 8비트이기 때문에 타입은 np.uint8로 지정해줍니다. 

 

width = 640
height = 480
bpp = 3


img = np.zeros((height, width, bpp), dtype=np.uint8)



그레이스케일 이미지의 경우에는 하나의 채널만 가지기 때문에 bpp를 1로 해야 합니다. 

 

width = 640
height = 480
bpp = 1


img = np.zeros((height, width, bpp), dtype=np.uint8)



np.zeros 함수를 호출하면  0으로 초기화된 ndarray 객체를 생성합니다. 

이렇게 하면 이미지를 구성하는 모든 픽셀 값이 0이되어 검은색으로 화면에 표현됩니다.



3. ndarray 객체의 shape 속성을 통해 이미지의 높이와 너비, bpp를 가져올 수 있습니다. 

shape 속성의 첫번째 차원은 이미지의 높이, 두번째 차원은 이미지의 너비, 세번째 차원은 이미지의 bpp 입니다. 

 

img_h, img_w, img_bpp = img.shape




4. imshow 함수를 호출하면 검은색으로 채워진 윈도우 창 “drawing”이 보여집니다.

이후 waitKey 함수의 아규먼트가 0이기 때문에 사용자가 키보드를 누르기 전까지 대기합니다. 

 

waitKey 함수가 없으면 바로 프로그램이 종료되기 때문에 이미지 기반 OpenCV 프로그래밍을 하려면 꼭 호출해줘야 합니다. 

 

cv.imshow("drawing", img)
cv.waitKey(0)



다음 포스팅부터는 OpenCV Python에서 그리기 함수를 사용하는 방법을 알아봅니다. 

 

OpenCV Python 그리기 예제 1. OpenCV의 좌표계

https://webnautes.tistory.com/580 

 

OpenCV 강좌 C++ & Python - 원을 그리는 circle 함수 사용법

https://webnautes.tistory.com/1814 

 

반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts