이번 포스팅에서는 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
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
OpenCV Python을 사용하여 HeatMap 흉내내기 – applyColorMap 사용 (0) | 2023.10.08 |
---|---|
간단히 구현한 RTSP 재접속 및 비디오 다시 재생하는 OpenCV 코드 (0) | 2023.10.07 |
OpenCV 좌표계를 직교 좌표계로 변환하는 Python 코드 (0) | 2023.04.13 |
OpenCV Python - 이미지를 정사각형이 되도록 패딩(padding)하는 예제 (0) | 2022.05.28 |
OpenCV Python - Image Center Crop 예제 (0) | 2022.03.06 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!