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: 선 그리기 형식
      1. cv2.LINE_4: 4 연결 선 알고리즘
      2. cv2.LINE_8: 8 연결 선 알고리즘
      3. 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()

 

실행 결과 이미지