황선규 박사님의 OpenCV 강의를 공부하면서 정리하였습니다.
OpenCV 그리기 함수
OpenCV는 영상에서 선, 도형, 문자열을 출력하는 그리기 함수를 제공합니다.
선 그리기(직선, 화살표, 마커), 도형 그리기(사각형, 원, 타원, 다각형), 문자열 출력 함수를 알아보고 영상에 적용해보겠습니다.
[그리기 함수 사용시 주의할 점]
1. 영상의 픽셀 값 자체를 변경합니다. -> 원본 영상이 필요하면 복사본을 만들어서 그리기&출력을 해야 합니다.
2. 그레이스케일 영상에는 컬러로 그리기가 안됩니다. -> cv2.cvtColor() 함수로 BGR 컬러 영상으로 변환한 후 그리기 함수를 호출합니다.
1. 직선 그리기 - cv2.line()
cv2.ling()을 이용하면 영상에 직선을 그릴 수 있습니다.
함수 설명
cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None) -> img
img : 그림을 그릴 영상
pt1, pt2 : 직선의 시작점과 끝점. (x, y) 튜플
color : 선 색상 또는 밝기. (R, G, B) 튜플 또는 정수값
thickness : 선 두께. 기본값은 1
lineType : 선 타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택
shift : 그리기 좌표 값의 축소 비율. 기본값은 0
예시 코드
# 하양색 영상 생성
# 400X400X3 행렬, 모든 픽셀을 255(하양색), 데이터 타입 : np.unit8
img = np.full((400,400,3), 255, np.unit8)
# 직선 그리기
cv2.line(img, (50, 50), (200, 50), 5) # 두께 5
cv2.line(img, (50, 60), (150, 160))
# 영상 출력
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
영상에 직선 그리기 성공했습니다.
2. 사각형 그리기 - cv2.rectangle()
cv2.rectangle() 함수를 사용하여 사각형을 그릴 수 있습니다.
함수 설명
cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None) -> img
cv2.rectangle(img, rec, color, thickness=None, lineType=None, shift=None) -> img
사각형은 두 가지 방법으로 그릴 수 있습니다.
(1) 사각형의 두 꼭지점 좌표 설정하기
(2) 사각형 위치 정보 (시작점, 높이,길이)
img : 그림을 그릴 영상
pt1, pt2 : 사각형의 두 꼭지점 좌표. (x, y) 튜플
rec : 사각형 위치 정보. (x, y, w, h) 튜플
color : 선 색상 또는 밝기. (B, G, R) 튜플 또는 정수값
thickness : 선 두께. 기본값은 1. 음수(-1)를 지정하면 내부를 채움.
shift : 그리기 좌표 값의 축소 비율. 기본값은 0
예시 코드
cv2.rectangle(img, (50, 200, 150, 100), (0, 255, 0), 2)
cv2.rectangle(img, (70, 220), (180, 200), (0, 128, 0), -1) # -1은 내부 색 칠하기
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
영상에 사각형이 추가되었습니다.
3. 원 그리기 - cv2.circle()
cv2.circle() 함수를 이용하여 영상에 원을 그릴 수 있습니다.
함수 설명
cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None) -> img
img : 그림을 그릴 영상
center : 원의 중심 좌표. (x, y) 튜플
radius : 원의 반지름
color : 선 색상 또는 밝기. (B, G, R) 튜플 또는 정수값.
thickness : 선 두께. 기본값은 1, 음수(-1)를 지정하면 내부를 채움
lineType : 선 타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택
shift : 그리기 좌표 값의 축소 비율. 기본값은 0
예시 코드
cv2.circle(img, (300, 100), 30, (255, 255, 0), -1, cv2.LINE_AA)
cv2.circle(img, (300, 100), 60, (255, 0, 0), 3, cv2.LINE_AA)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
4. 다각형 그리기 - cv2.polylines
cv2.polylines() 를 이용하여 다각형을 그릴 수 있습니다.
함수 설명
cv2.polyines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None) -> img
img : 그림을 그릴 영상
pts : 다각형 외각 점들의 좌표 배열. numpy.ndarray의 리스트, ex) [np.array([[10, 10], [50, 50], [10, 50]], dtype=np.int32)]
isClosed : 폐곡선 여부. True 또는 False 지정.
color : 선 색상 또는 밝기. (B,G,R) 튜플 또는 정수값
thickness : 선 두께. 기본값은 1, 음수(-1)를 지정하면 내부를 채움
lineType : 선 타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택
shift : 그리기 좌표 값의 축소 비율. 기본값은 0
예시 코드
# 다각형 외각 점들의 좌표를 np.array list 형태로 지정
pts = np.array([[250, 200], [300, 200], [350, 300], [250, 300]])
cv2.polylines(img, [pts], True, (255, 0, 255), 2) # [pts] 리스트 값으로 입력
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
좌측 하단에 다각형이 생성되었습니다.
5. 문자열 출력 - cv2.putText
마지막으로 영상에 문자열을 출력하는 함수입니다.
cv2.putText() 함수를 이용하면 문자열을 출력할 수 있습니다.
함수 설명
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None,
lineType=None, bottomLeftOrigin=None) -> img
img : 그림을 그릴 영상
text : 출력할 문자열
org : 영상에서 문자열을 출력할 위치의 좌측 하단 좌표. (x, y) 튜플
fontFace : 폰트 종류. cv2.FONT_HERSHEY_ 로 시작하는 상수 중 선택
fontScale : 폰트 크기 확대/축소 비율
color : 선 색상 또는 밝기. (B, G, R) 튜플 또는 정수값.
thickness : 선 두께. 기본값은 1, 음수(-1)를 지정하면 내부를 채움
lineType : 선 타입. cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA 중 선택
bottomLeftOrigin : True이면 영상 좌측 하단을 원점으로 간주. 기본값은 False
예시 코드
# 우선 출력할 텍스트 문자열을 지정해줍니다.
text = 'Hello? OpenCV ' + cv2.__version__
cv2.putText(img, text, (50, 350), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
(0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()
문자열이 출력되었습니다.
'Python > 파이썬 OpenCV 공부' 카테고리의 다른 글
[파이썬 OpenCV] 동영상 저장하기 - cv2.VideoWriter 클래스 (0) | 2020.09.27 |
---|---|
[파이썬 OpenCV] 카메라와 동영상 열기, 속성값 참조, 프레임 받아오기 - cv2.VideoCapture 클래스 (11) | 2020.09.27 |
[파이썬 OpenCV] 마스크 연산과 ROI - cv2.copyTo 함수 이용 방법 (0) | 2020.09.25 |
[파이썬 OpenCV] 영상의 생성, 복사, 부분 영상 추출 (0) | 2020.09.25 |
[파이썬 OpenCV] 영상의 속성과 픽셀 값 참조 (0) | 2020.09.25 |