2-4. OpenCV 그리기 함수
다양한 그리기 함수
OpenCV는 영상에서 선(직선, 화살표, 마커 등), 도형(사각형, 원, 타형, 다각형 등), 문자열을 출력하는 그리기 함수를 지원한다. 아래는 강의 영상에서 둘러본 함수들을 정리한 표이다. 직선 그리기 함수에서 정의한 인자와 동일한 입력 인자를 갖는 함수들의 경우 따로 표기하지 않는 것은 동일한 의미를 갖는다.
| 그리기 종류 | 함수 이름 | 인자 | |
| 선 | 직선 | cv2.line(img, pt1, pt2, color, thickness, lineType, shift) -> img |
img: 그림을 그릴 영상 pt1, pt2: (x,y) 튜플 형식으로 시작점과 끝점 color: (B,G,R) 튜플 형식 또는 정수값으로 도형 선 색상 또는 밝기 thickness: 선 두께로 기본값은 1. (-1은 불가능) lineType: 선 종류로 cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA(anti-aliasing 더 깔끔한 직선을 그리고 싶은 경우) 등이 있으며 기본값은 cv2.LINE_8 shift: 그리기 좌표 값의 축소 비율로 기본값은 0. |
| 도형 | 사각형 | cv2.rectangle(img, pt1, pt2, color, thickness, lineType, shift) -> img |
pt1, pt2: (x,y) 튜플 형식으로 사각형의 두 꼭지점 좌표 thickness: -1의 경우 내부를 채움 |
| cv2.rectangle(img, rec, color, thickness, lineType, shift) -> img |
rec: (x,y,w,h) 튜플 형식으로 사각형 위치 정보 thickness: -1의 경우 내부를 채움 |
||
| 원 | cv2.circle(img, center, radius, color, thickness, lineType, shift) -> img |
center: (x,y) 튜플 형식으로 원의 중심 좌표 radius: 원의 반지름 크기 thickness: -1의 경우 내부를 채움 |
|
| 다각형 | cv2.polylines(img, pts, isClosed, color, thickness, lineType, shift) -> img |
pts: numpy.ndarray의 리스트 형식으로 다각형 외각 점들의 좌표 배열. isClosed: Boolean 형식으로 폐곡선 여부 결정 |
|
| 문자열 | cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin) -> img |
text: 출력할 문자열 org: (x,y) 튜플 형식으로 문자열을 출력할 위치의 좌측 하단 좌표 fontFace: 폰트 종류. cv2.FONT_HERSHEY_...로 시작하는 상수 fontScale: 폰트 크기 확대/축소 비율 bottomLeftOrigin: Boolean 형식으로 영상의 좌측 하단을 원점으로 사용할 경우 True여야 하며 기본값은 False |
|
문자열 그리기 함수에 지원되는 폰트 예시: FONT_HERSHEY_SIMPLE, FONT_HERSHEY_PLAIN, FONT_HERSHEY_DUPLEX, FONT_HERSHEY_COMPLEX, FOND_HERSHEY_TRIPLEX, FONT_HERSHEY_COMPLEX_SMALL, FONT_HERSHEY_SCRIPT_SIMPLEX, FONT_HERSHEY_SCRIPT_COMPLEX, FONT_HERSHEY_COMPLEX|FONT_ITALIC ...
주의점:
1) 그리기 알고리즘을 이용하면 영상의 픽셀 값을 변경하기 때문에 원본 영상을 유지해야 하는 경우 copy를 활용하자
2) 그레이스케일 영상에는 컬러로 그리기가 안되므로 cv2.cvtColor()함수로 변환 후 그리기 함수 호출
아래 코드는 강의 예제 코드를 기반으로 글쓴이가 함수들을 테스트하기 위해 작성한 코드이다.
#필요한 패키지 가져오기
import numpy as np
import cv2
# 그림을 그릴 하얀색 배경 영상 생성
img = np.full((500, 500, 3), 255, np.uint8)
#직선 그리기
cv2.line(img, (30, 50), (200, 50), (0, 0, 255)) # 직선-빨간색
cv2.line(img, (30, 60), (175, 65), (0, 255, 0), 5, cv2.LINE_AA) # 대각선-초록색-굵기 5 + anti_aliasing
cv2.line(img, (30, 70), (150, 70), (255, 0, 0), 2, cv2.LINE_4) # 직선-파란색-굵기 2
#사각형 그리기
cv2.rectangle(img, (50, 100), (200, 175), (0, 128, 128), 3) # pt1, pt2 인자 활용 - 채움 x
cv2.rectangle(img, (50, 200), (200, 275), (0, 128, 128), -1) # pt1, pt2 인자 활용 - 채움 o
cv2.rectangle(img, (50, 300, 25, 25), (128, 128, 0), 2) # rec 인자 활용 - 채움 x
cv2.rectangle(img, (50, 350, 25, 25), (128, 128, 0), -1) # rec 인자 활용 - 채움 o
#원 그리기
cv2.circle(img, (300, 75), 60, (255, 0, 255), 1, cv2.LINE_8) # 기본선 - 채움 x
cv2.circle(img, (300, 75), 30, (255, 0, 255), -1, cv2.LINE_8) # 기본선 - 채움 o
cv2.circle(img, (300, 200), 60, (255, 255, 0), 2, cv2.LINE_AA) # anti-aliasing - 채움 x
cv2.circle(img, (300, 200), 30, (255, 255, 0), -1, cv2.LINE_AA) # anti-aliasing - 채움 o
#다각형 그리기
pts0 = np.array([[150, 300], [225, 300], [150, 350], [225, 350]]) # 폐회성 사용 x
pts1 = np.array([[250, 300], [325, 300], [250, 350], [325, 350]]) # 폐회성 사용 o
pts2 = np.array([[250, 370], [325, 370], [300, 420], [250, 420]]) # 폐회성 사용 o & 채우기 사용은 할 수 없다
cv2.polylines(img, [pts0], False, (0, 255, 255), 2)
cv2.polylines(img, [pts1], True, (0, 255, 255), 2)
cv2.polylines(img, [pts2], True, (0, 255, 255), 5)
# 텍스트 그리기
text = 'Hello? OpenCV ' + cv2.__version__
cv2.putText(img, text, (50, 450), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
(0, 0, 255), 1, cv2.LINE_AA)
text2 = 'The record of Polygon'
cv2.putText(img, text2, (50, 475), cv2.FONT_HERSHEY_SCRIPT_COMPLEX, 1,
(0, 0, 255), 1, cv2.LINE_AA)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

인증 타임
오늘은 OpenCV에서 지원하는 다양한 그리기 함수를 테스트해 보았다. 영상에서 가로가 x, 세로가 y인 점이 계속 헷갈려서 테스트 코드 작성 시 원하는 pt 값 찾는데 시간이 좀 걸렸다. 지금은 지정 값으로 넣어뒀지만 loop를 활용해서 규칙적으로 도형을 그려 패턴을 그려본다던가 하는 방식으로 응용해서 코드를 작성해 볼 수 있겠다는 생각이 들었다. 이후 강의에서 그리기 함수들이 어디에 어떻게 쓰이게 될지 좀 궁금하다.

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #OpenCV를 활용한 컴퓨터비전과 딥러닝 올인원 패키지 Online
패스트캠퍼스(FastCampus) 강의 둘러보러 가기
↓ ↓ ↓
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'남돈내배 > 2022_FastCampus_환급이벤트' 카테고리의 다른 글
| 패스트캠퍼스 챌린지 12일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.04 |
|---|---|
| 패스트캠퍼스 챌린지 11일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.03 |
| 패스트캠퍼스 챌린지 09일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.02.01 |
| 패스트캠퍼스 챌린지 08일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.01.31 |
| 패스트캠퍼스 챌린지 07일차 - Ch2. OpenCV-Python 기초 사용법 (0) | 2022.01.30 |