1. 도형 그리기

 

도형을 그리려면 캔버스와 같은 대상이 있어야 하기 때문에 필요한 크기의 배열을 만들어서 거기에 도형을 그리고 화면에 출력 하면 됩니다배열은 numpyzeros() 함수를 이용하여 생성 합니다.


numpy.zeros(shape[, dtype=float, order='C'])


zeros() 함수는 shapedtype으로 정의된 형태의 zero로 채워진 배열을 리턴 합니다.

Parameter 

내용 

 shape

 int를 이용한 배열, int가 요소인 튜플을 이용한 다차원 배열

 dtype

 자료형 numpy.int8, numpy.float64

 order

 데이터 저장 순서.  C : row-major,  F : column-major 


도형을 그리는 좌표는 좌측 상단이 (0, 0)이 됩니다.  x축은 오른쪽으로 증가 하지만 y측은 아래로 내려가면서 증가 합니다.

(50, 50) 좌표에서 (450, 450) 까지 선을 그었을 경우 그림처럼 선은 좌측 상단에서 우측 하단으로 이어집니다.


opencv_line


zeros()255를 더하면 배경 색을 흰색으로 변경 가능 합니다.


opencv_line


이제 도형을 그릴 수 있는 준비가 된것 같습니다.



1.1 , 직선



line() 함수를 이용하여 두 좌표를 잇는 선을 그을 수 있습니다점은 두 좌표를 동일 하게 하면 됩니다.


cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → img


Parameter

 내용

 img

 이미지 파일 

 pt1

 시작점 좌표 (x, y)

 pt2

 종료점 좌표 (x, y)

 color

 색상 (blue, green, red) 0 ~ 255

 thickness

 선 두께 (default 1)

 lineType

 선 종류 (default cv.Line_8)

 - LINE_8 : 8-connected line

 - LINE_4 : 4-connecterd line

 - LINE_AA : antialiased line

 shift

 fractional bit (default 0)


opencv_line


import numpy as np

import cv2

 

# color 설정

blue_color = (255, 0, 0)

green_color = (0, 255, 0)

red_color = (0, 0, 255)

white_color = (255, 255, 255)

 

# 모두 0으로 되어 있는 빈 Canvas(검정색)

img = np.zeros((384, 384, 3), np.uint8)

img = cv2.line(img, (10, 10), (350, 10), blue_color, 5)

img = cv2.line(img, (10, 30), (350, 30), green_color, 5)

img = cv2.line(img, (10, 50), (350, 50), red_color, 5)

# line_4

img = cv2.line(img, (10, 90), (350, 90), blue_color, 5, 4)

# line_aa

img = cv2.line(img, (10, 110), (350, 110), green_color, 5, cv2.LINE_AA)

# shift 1

img = cv2.line(img, (10, 130), (350, 130), red_color, 5, 4, 1)

#

img = cv2.line(img, (150, 150), (150, 150), red_color, 5)

 

cv2.imshow('image',img)

cv2.waitKey(0)

cv2.destroyAllWindows()


색상별 3개의 선, line 종류별 1개씩, 그리고 shift를 적용하여 직선을 그렸습니다점은 두께 5의 선으로 표현 한 경우의 모습입니다점이라 하기는 그렇지만 동일 좌표로 점도 하나 찍어 보았습니다.


opencv_line


배경 색상을 하얀색으로 하기 위해

img = np.zeros((384, 384, 3), np.uint8) + 255

를 적용한 경우.


opencv_line


배경 색상은 255에서 0사이의 값을 주면 흰색에서 검은색 까지 변경을 시킬 수 있습니다.

img = np.zeros((384, 384, 3), np.uint8) + 222

를 적용한 경우.


opencv_line


- arrowedLine()


화살표가 있는 선을 그립니다파라미터는 line() 함수와 동일 한데 마지막에 화살표의 크기를 설정하는 tipLength가 하나 더 있습니다.

 

cv2. arrowedLine(img, pt1, pt2, color, thickness=1, line_type=8, shift=0, tipLength=0.1)


Parameter

 내용

 img

 이미지 파일 

 pt1

 시작점 좌표 (x, y)

 pt2

 종료점 좌표 (x, y)

 color

 색상 (blue, green, red) 0 ~ 255

 thickness

 선 두께 (default 1)

 lineType

 선 종류 (default cv.Line_8)

 - LINE_8 : 8-connected line

 - LINE_4 : 4-connecterd line

 - LINE_AA : antialiased line

 shift

 fractional bit (default 0)

 tipLength 화살표 크기


import numpy as np

import cv2

 

# color 설정

blue_color = (255, 0, 0)

green_color = (0, 255, 0)

red_color = (0, 0, 255)

white_color = (255, 255, 255)

 

# 모두 0으로 되어 있는 빈 Canvas(검정색)

img = np.zeros((384, 384, 3), np.uint8)

 

cv2.arrowedLine(img, (50, 50), (250, 250), green_color, thickness=2)

cv2.arrowedLine(img, (50, 250), (250, 50), white_color, thickness=20, tipLength=0.1)

cv2.arrowedLine(img, (90, 340), (340, 90), white_color, thickness=20, tipLength=0.5)

 

 

cv2.imshow('arrowedLine',img)

cv2.waitKey(0)

cv2.destroyAllWindows()


opencv_line



- cv2.imshow('window title', image name)

 

여기서 오류가 발생한다는 의견이 있어서 추가로 작성해 드립니다.

이 함수는 그려진 이미지를 출력하는 기능입니다. 'window title'은 자유롭게 기입이 가능하고 입력을 하지 않아도 문제가 되지 않습니다.  


opencv line 그리기


이렇게 윈도우 창 타이틀이 없이 나옵니다.

 

오류가 발생 한다면 이 함수는 cv2.waitKey(0)와 함께 사용해야 작동을 합니다.  cv2.waitKey(0)를 생략하면 어떻게 나오느냐 하면


opencv line 그리기


이렇게 응답 없음으로 나옵니다.  코드는 아래처럼 wailKey()destroy…()도 주석으로 해서 테스트 해봅니다.

opencv line 그리기


오류가 나고 jupyter 커널도 재시작 합니다.


+ Recent posts