영상처리/OpenCV

각종 그리기 함수

성혜영 2022. 6. 8. 13:32

직선 그리기

이미지나 영상 위에 단순한 선을 그림. 두 점을 이어 검출결과를 인식하기 쉽게 표시하거나 이미지의 특정 영역을 보정하기 위해 사용

# 직선 그리기 함수

cv2.line(

    img,

    pt1,

    pt2,

    color,

    thickness = None,

    lineType = None

    shift = None

)

 

이미지(img) 위에 시작좌표(pt1)부터 도착좌표(pt2) 까지의 직선을 그림

색상(color)은 bgr 형식이며, 설정된 두께(thinckness)로 그려짐.

선형타입(lineType)을 설정하여 연결성을 택하고, 비트시프트(shift)에는 실숫값으로

처리할 좌표(pt)의 비트 값을 할당.

 

 

사각형 그리기

이미지나 영상 위에 단순한 사각형을 그림. 영역을 설정하기 위한 변수값으로 활용하거나,

검출된 결과를 사용자가 인식하기 쉽게 표시하는 데 사용

# 사각형 그리기 함수

cv2.rectangle(

    img,

    pt1,

    pt2,

    color,

    thickness = None,

    lineType = None,

    shift = None

)

 

이미지(img) 위에 좌측 상단 모서리 좌표(pt1)부터 우측 하단 모서리 좌표(pt2) 까지의 직사각형을 그림. 색상(color)은 bgr 형식이며, 설정된 두께(thinckness)로 그려짐.

선형타입(lineType)을 설정하여 연결성을 택하고, 비트시프트(shift)에는 실숫값으로

처리할 좌표(pt)의 비트 값을 할당.

 

 

원 그리기

이미지나 영상 위에 단순한 원을 그림. 검출된 좌표값을 사용자가 인식하기 쉽게 표시하는데 사용

# 원 그리기 함수

cv2.circle(

    img,

    center,

    radius,

    color,

    thickness = None,

    lineType = None,

    shift = None

)

이미지(img) 위에 원의 중심(center)로부터 반지름(radius) 크기를 갖는 원을 그린다.

색상(color)은 bgr 형식이며, 설정된 두께(thickness)로 그려진다.

선형타입(lineType)을 설정해 연결성을 택하고 비트 시프트(shift)는 실수값으로 처리할 중심점(center)과 반지름(radius)의 비트 값을 할당.



호 그리기

이미지나 영상 위에 단순한 호나 타원을 그린다. 검출된 타원이나 호를 그리거나 타원 객체의 부정확한 영역을 보정하기 위해 사용

# 호 그리기 함수

cv2.ellipse(

    img,

    center,

    axes,

    angle,

    startAngle,

    endAngle,

    color,

    thickness = None,

    lineType = None,

    shift = None

)

 

이미지(img) 위에 원의 중심(center)로 부터 장축과 단축(axes) 크기를 갖는 호를 그림

각도(angle)는 장축이 기울어진 각도, 시작각도(startAngle)와 도착각도(endAngle)를 설정해 호의 형태를 구성. 색상(color)은 bgr 형식이며, 설정된 두께(thickness)로 그려진다.

선형타입(lineType)을 설정해 연결성을 택하고 비트 시프트(shift)는 실수값으로 처리할 중심점(center)과 장축과 단축(axes)의 비트 값을 할당

 

내부가 채워지지 않은 다각형 그리기

이미지나 영상 위에 여러 개의 다각형 곡선을 그림.

복잡한 형상의 다각형을 그리거나 검출된 윤곽선의 일부를 시각적으로 확인할 때 사용

 

# 내부가 채워지지 않은 다각형 그리기 함수

cv2.polylines(

    img,

    pts,

    isClosed,

    color,

    thickness = None,

    lineType = None,

    shift = None

)

 

이미지(img) 위에 선들의 묶음(pts)으로 이뤄진 N개의 내부가 채워지지 않은 다각형을 그림

닫힘 여부(isClosed)를 설정해 처음 좌표와 마지막 좌표의 연결 여부를 설정

색상(color)은 bgr 형식이며, 설정된 두께(thickness)로 그려짐.

선형타입(lineType)을 설정해 연결성을 택하고 비트 시프트(shift)는 실수값으로 처리할 좌표(pt)의 비트 값을 할당.

 

N개의 다각형을 한 번에 그리기 가능. 한 개의 다각형을 그리기 위해서는 점들이 의미있는 순서로 배치된 2차원 배열이 필요. 다각형 그리기 함수는 N개의 다각형을 그리는 함수이므로 앞선 2차원 배열을 N개 가지고 있어야 함. 그러므로 3차원 형태의 배열이 필요




내부가 채워진 다각형 그리기

이미지나 영상 위에 내부가 채워진 여러 개의 다각형 곡선을 그림

복잡한 형상의 다각형을 그리거나 검출된 결과를 이미지 위에 덮어 씌울 때 사용

 

# 내부가 채워진 다각형 그리기 함수

cv2.fillPoly(

    img,

    pts,

    color,

    lineType = None,

    shift = None,

    offset = None

)

 

이미지(img) 위에 선들의 묶음(pts)으로 이뤄진 N개의 내부가 채워지지 않은 다각형을 그림

닫힘 여부(isClosed)는 이미 내부가 채워져 있으므로 불필요

색상(color)은 bgr 형식이며, 설정된 두께(thickness)로 그려짐.

선형타입(lineType)을 설정해 연결성을 택하고 비트 시프트(shift)는 실수값으로 처리할 좌표(pt)의 비트 값을 할당.



문자 그리기

이미지나 영상 위에 문자를 표시. 검출된 결과에 시각적으로 라벨을 표시할 때 사용

문자를 이미지에 입력하는 것이 아닌, 문자를 그리는 방식

 

# 문자 그리기 함수

cv2.putText(

    img,

    text,

    org,

    fontFAce,

    fontScale,

    color,

    thickness = None,

    lineType = None,

    bottonLeftOrigin = None

)

이미지(img) 위에 문자열(text)을 텍스트 박스의 좌측 상단 모서리(org)를 기준으로 그림

이미지 위에 텍스트를 그리기 위해 글꼴(fontFace)과 글자크기(fontScale)를 설정

색상(color)은 bgr 형식이며, 설정된 두께(thickness)로 그려짐.

선형타입(lineType)을 설정해 연결성을 택하고 기준좌표(bottonLeftOrigin)로 텍스트 박스 좌측 상단 모서리가 아닌 텍스트 박스 좌측 하단 모서리를 사용할 경우 기준 좌표에 true 지정

글꼴과 글자크기는 그래픽스나 문자열 입력값에서 사용하는 글꼴과 글자 크기 단위가 아님

 

 

# 그리기 함수 활용



import numpy as np

import cv2



img = np.zeros((768, 1366, 3), dtype = np.uint8)



cv2.line(img, (100, 100), (1200, 100), (0, 0, 255), 3, cv2.LINE_AA)

cv2.circle(img, (300, 300), 50, (0, 255, 0), cv2.FILLED, cv2.LINE_4)

cv2.rectangle(img, (500, 200), (1000, 400), (255, 0, 0), 5, cv2.LINE_8)

cv2.ellipse(img, (1200, 300), (100, 50), 0, 90, 180, (255, 255, 0), 2)



pts1 = np.array([[[100, 500], [300, 500], [200, 600]], [[400, 500], [500, 500], [600, 700]]])

pts2 = np.array([[700, 500], [800, 500], [700, 600]])

cv2.polylines(img, pts1, True, (0, 255, 255), 2)

cv2.fillPoly(img, [pts2], (255, 0, 255), cv2.LINE_AA)



cv2.putText(img, "OpenCV", (900, 600), cv2.FONT_HERSHEY_COMPLEX | cv2.FONT_ITALIC, 2, (255, 255, 255), 3)



cv2.imshow("img", img)

cv2.waitKey(0)

cv2.destroyAllWindows()

 

모든 배열을 Numpy 배열로 처리해서 적용한다. 

 

# 꼭짓점의 개수가 다른 다각형 여러개 그리기 잘못된 예시

pts1 = np.array([[[100, 500], [300, 500], [200, 600]], [[400, 500], [500, 500], [600, 700], [500, 650]]])



# 올바른 예시

pt1 = np.array([[100, 500], [300, 500], [200, 600]])

pt2 = np.array([[400. 500], [500, 500], [600, 700], [500, 650]])

pts1 = np.array([pt1, pt2])

 

꼭짓점의 개수가 다른 다각형을 여러개 기를 때 위 예시처럼 단순히 꼭짓점 개수를 추가한다면 TypeError가 발생한다. 

-> pts1은 list 들의 묶음이 들어간 Numpy 배열이다. 그러므로 내부 원소는 Numpy 배열이 아니므로 오류를 반환한다. 꼭짓점 개수가 ㄷ서로 다른 다각형을 그리려면 각 하위 Numpy 배열을 생성한 후 상위 Numpy 배열에 포함시켜야 한다. 꼭짓점 개수가 서로 다른 배열은 명시적으로 np.array() 함수를 사용해 하나의 Numpy 배열로 묶은 후, 다시 pts로 묶어 사용해야 한다.

 

'영상처리 > OpenCV' 카테고리의 다른 글

색상 공간 변환  (0) 2022.06.08
트랙바 생성  (0) 2022.06.08
도형 그리기  (0) 2022.06.08
이미지 연결  (0) 2022.06.07
동영상 출력  (0) 2022.06.07