Opencv 공부
[openCV] 그림 그리기
권벡터
2023. 4. 30. 16:24
openCV 는 캡처한 영상이나 이미지에 그림을 그릴 수 있는 기능을 지원해준다. 이번 포스트에는 그림을 그리는 방법을 공부해 보고자 한다.
1. 직선 그리기
직선 그리는 매서드
cv2.line()
기능
- cv2.line(img,start,end,color,[thickness,lineType]) : 직선 그리기 매서드
- img: 그림을 그릴 대상 이미지 (Numpy 배열)
- start: 선 시작 지점 좌표 (x,y)
- end: 선 끝 지점 좌표 (x, y)
- color: 선 색상, (blue, green, red), 0~255
- thickness =1: 선 두께 =1
- lineType: 선 그리기 형식
- cv2.LINE_4: 4 연결 선 알고리즘
- cv2.LINE_8: 8 연결 선 알고리즘
- cv2.LINE_AA: 안티에일리어싱(antialiasing,계단 현상 없는 선)
실행 코드
import cv2
# 흰색 배경 500 x 500 이미지 불러오기
img = cv2.imread('C:/Users/kycky/opencv/blankFile.jpg')
cv2.line(img,(50,50),(150,50),(255,0,0)) # 파란색 1 px 선
cv2.line(img,(200,50),(300,50),(0,255,0)) # 초록색 1 px 선
cv2.line(img,(350,50),(450,50),(0,0,255)) # 빨간색 1 px 선
# 하늘색 10 px 선
cv2.line(img,(100,100),(400,100),(255,255,0),10)
# 분홍색 10 px 선
cv2.line(img,(100,150),(400,150),(255,0,255),10)
# 노란색 10 px 선
cv2.line(img,(100,200),(400,200),(0,255,255),10)
# 회색 10 px 선
cv2.line(img,(100,250),(400,250),(200,200,200),10)
# 검은색 10 px 선
cv2.line(img,(100,300),(400,300),(0,0,0),10)
# 4연결 선
cv2.line(img,(100,350),(400,400),(0,0,255),20,cv2.LINE_4)
# 8연결 선
cv2.line(img,(100,400),(400,450),(0,0,255),20,cv2.LINE_8)
# 안티에일리어싱 선
cv2.line(img,(100,450),(400,500),(0,0,255),20,cv2.LINE_AA)
# 이미지 전체에 대각선
cv2.line(img,(0,0),(500,500),(0,0,255))
cv2.imshow('lines',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 사각형 그리기
사각형 그리는 매서드
cv2.rectangle( )
기능
- cv2.rectangle(img,start,end,color,[thickness,lineType]) : 사각형 그리기
- img: 그림을 그릴 대상 이미지 (Numpy 배열)
- start: 사각형 시작 꼭짓점(x,y)
- end: 사각형 끝 꼭짓점(x,y)
- color: 색상 (blue, green, red)
- thickness: 선 두께 (-1 = 채우기)
- lineType: 선 타입, cv2.line()과 동일
실행 코드
import cv2
img = cv2.imread('C:/Users/KWON/Pictures/500.png')
cv2.rectangle(img,(50,50),(150,150),(255,0,0)) #좌상 우하 좌표, 파랑
cv2.rectangle(img,(300,300),(100,100),(0,255,0),10) #우하 좌상 좌표, 초록, 두께 10
cv2.rectangle(img,(450,200),(200,450),(0,0,255),-1) #우상 좌하 좌표, 빨강, 채움
cv2.imshow('rectangle',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 다각형 그리기
다각형 그리는 매서드
cv2.polylines( )
기능
- cv2.polylines(img, points, isClosed, color, [thickness, lineType])
- img: 그림 그릴 대상 이미지
- points: 꼭짓점 좌표, NumPy 배열 리스트
- isClosed: 닫힌 도형 여부, true/false
- color: 색상(blue,green.red)
- thickness: 선 두께
- lineType: 선 타입, (cv2.line() 과 동일)
실행 코드
import cv2
img = cv2.imread('C:/Users/KWON/Pictures/500.png')
# 번개모양 좌표
pts1=np.array([[50,50],[150,150],[100,140],[200,240]],dtype=np.int32)
# 삼각형 좌표
pts2 = np.array([[350,50],[250,200],[450,200]],dtype=np.int32)
# 삼각형 좌표
pts3 = np.array([[150,300],[50,450],[250,450]],dtype=np.int32)
# 5각형 좌표
pts4 = np.array([[350,250],[450,350],[400,450],[300,450],[250,350]],dtype=np.int32)
# 다각형 그리기 함수
cv2.polylines(img,[pts1],False,(255,0,0))
cv2.polylines(img,[pts2],False,(0,0,0),10)
cv2.polylines(img,[pts3],True,(0,0,255),10)
cv2.polylines(img,[pts4],True,(0,0,0))
cv2.imshow('polyline',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 원, 타원, 호 그리기
원 그리는 매서드
cv2.circle( )
원(circle) 기능
- cv2.circle(img, center, radius, color, [thickness, lineType]) : 원 그리기 매서드
- img: 대상 이미지
- center: 원점 좌표(x,y)
- radius: 원의 반지름 값
- color: 색상(blue,green.red)
- thickness: 선 두께
- lineType: 선 타입, (cv2.line() 과 동일)
타원, 호 그리는 매서드
cv2.ellipse( )
타원 기능
- cv2.ellipse(img, center, axes, angle, from, to, color, [thickness, lineType]) : 타원, 호 그리는 함수
- img: 대상 이미지
- center: 원점 좌표(x,y)
- axes: 기준 축 길이
- angle: 기준 축 회전각도
- from, to: 호를 그릴 시작 각도와 끝 각도
실행 코드
import cv2
# 흰색 배경 500 x 500 이미지 불러오기
img = cv2.imread('C:/Users/kycky/opencv/blankFile.jpg')
#여기는 원그리기
# 원점(150,150), 반지름 100, 파랑
cv2.circle(img,(150,150),100,(255,0,0))
# 원점(300,150), 반지름 70, 초록, 두께 5
cv2.circle(img,(300,150),70,(0,255,0),5)
# 원점(400,150), 반지름 50, 빨강, 채움
cv2.circle(img,(400,150),50,(0,0,255),-1)
# 여기는 타원, 호 그리기
# 원점(50,300) 반지름 50, 0~360도 그리기, 빨강
cv2.ellipse(img,(50,300),(50,50),0,0,360,(0,0,255))
# 원점(150,300) 반지름 50, 0~180도 그리기, 파랑
cv2.ellipse(img,(150,300),(50,50),0,0,180,(255,0,0))
# 원점(200,300), 반지름 50, 181~360도 그리기, 빨강
cv2.ellipse(img,(200,300),(50,50),0,181,360,(0,0,255))
# 원점(325,300) 반지름(75,50),0~360도 그리기, 초록
cv2.ellipse(img,(325,300),(75,50),0,0,360,(0,255,0))
# 원점(450,300) 반지름(50,75) 0~360도 그리기, 분홍
cv2.ellipse(img,(450,300),(50,75),0,0,360,(255,0,255))
# 원점(50,425) 반지름(50,75), 회전 15도, 0~360도 그리기, 검정
cv2.ellipse(img,(50,425),(50,75),15,0,360,(0,0,0))
# 원점(200.425), 반지름(50,75), 회전45도, 0~360도 그리기, 검정
cv2.ellipse(img,(200,425),(50,75),45,0,360,(0,0,0))
# 원점(300,425), 반지름(50,75), 회전 45도, 0~180도 그리기, 빨강
cv2.ellipse(img,(300,425),(50,75),45,0,180,(0,0,255))
# 원점(400,425), 반지름(50,75), 회전 45도, 181~360도 그리기, 파랑
cv2.ellipse(img,(400,425),(50,75),45,181,360,(255,0,0))
cv2.imshow('circle',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 글씨 그리기
그리기 매서드
cv2.putText()
기능
- cv2.putText(img, text, point, fontFace, fontSize, color,[thickness, linType])
- img: 글씨를 표시할 이미지
- text: 표시할 문자열
- point: 글씨를 표시할 좌표
- fontFace: 글꼴
- cv2.FONT_HERSHEY_PLAIN: 산세리프체 작은꼴
- cv2.FONT_HERSHEY_SIMPLEX: 산세리프체 일반 글꼴
- cv2.FONT_HERSHEY_DUPLEX: 산세리프체 진한 글꼴
- cv2.FONT_HERSHEY_COMPLEX_SMALL: 세리프체 작은 글꼴
- cv2.FONT_HERSHEY_COMPLEX: 세리프체 일반 글꼴
- cv2.FONT_HERSHEY_TRIPLEX: 세리프체 진한 글꼴
- cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 필기체 산세리프 글꼴
- cv2.FONT_HERSHEY_SCRIPT_COMPLEX: 필기체 세리프 글꼴
- cv2.FONT_ITALIC: 이탈릭체
- fontSize: 폰트 크기
- color,thickness, lineType: cv2.rectangle() 과 동일
실행 코드
import cv2
# 흰색 배경 500 x 500 이미지 불러오기
img = cv2.imread('C:/Users/kycky/opencv/blankFile.jpg')
# sans-serif small
cv2.putText(img,"Plane",(50,30),cv2.FONT_HERSHEY_PLAIN,1,(0,0,0))
# sans-serif normal
cv2.putText(img,"Simplex",(50,70),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,0))
# sans-serif bold
cv2.putText(img,"Duplex",(50,110),cv2.FONT_HERSHEY_DUPLEX,1,(0,0,0))
# sans-serif normal x2
cv2.putText(img,"Simplex",(200,110),cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,250))
# serif small
cv2.putText(img,"Complex Small",(50,180),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,0,0))
# serif normal
cv2.putText(img,"Complex ",(50,220),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,0))
# serif bold
cv2.putText(img,"Triplex",(50,260),cv2.FONT_HERSHEY_TRIPLEX,1,(0,0,0))
# serif normal x2
cv2.putText(img,"Complex",(200,260),cv2.FONT_HERSHEY_TRIPLEX,2,(0,0,255))
# hand-writing sans-serif
cv2.putText(img,"Script Simplex",(50,330),cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,1,(0,0,0))
# hand-writing serif
cv2.putText(img,"Script Complex",(50,370),cv2.FONT_HERSHEY_SCRIPT_COMPLEX,1,(0,0,0))
# sans-serif + italic
cv2.putText(img,"Plane Italic",(50,430),cv2.FONT_HERSHEY_PLAIN|cv2.FONT_ITALIC,1,(0,0,0))
# serif + italic
cv2.putText(img,"Complex Italic",(50,470),cv2.FONT_HERSHEY_COMPLEX|cv2.FONT_ITALIC,1,(0,0,0))
cv2.imshow('draw text',img)
cv2.waitKey(0)
cv2.destroyAllWindows()