1. 도형 그리기
도형을 그리려면 캔버스와 같은 대상이 있어야 하기 때문에 필요한 크기의 배열을 만들어서 거기에 도형을 그리고 화면에 출력 하면 됩니다. 배열은 numpy의 zeros() 함수를 이용하여 생성 합니다.
numpy.zeros(shape[, dtype=float, order='C'])
zeros() 함수는 shape과 dtype으로 정의된 형태의 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) 까지 선을 그었을 경우 그림처럼 선은 좌측 상단에서 우측 하단으로 이어집니다.
zeros()에 255를 더하면 배경 색을 흰색으로 변경 가능 합니다.
이제 도형을 그릴 수 있는 준비가 된것 같습니다.
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) |
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의 선으로 표현 한 경우의 모습입니다. 점이라 하기는 그렇지만 동일 좌표로 점도 하나 찍어 보았습니다.
배경 색상을 하얀색으로 하기 위해
img = np.zeros((384, 384, 3), np.uint8) + 255
를 적용한 경우.
배경 색상은 255에서 0사이의 값을 주면 흰색에서 검은색 까지 변경을 시킬 수 있습니다.
img = np.zeros((384, 384, 3), np.uint8) + 222
를 적용한 경우.
- 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() |
- cv2.imshow('window title', image name)
여기서 오류가 발생한다는 의견이 있어서 추가로 작성해 드립니다.
이 함수는 그려진 이미지를 출력하는 기능입니다. 'window title'은 자유롭게 기입이 가능하고 입력을 하지 않아도 문제가 되지 않습니다.
이렇게 윈도우 창 타이틀이 없이 나옵니다.
오류가 발생 한다면 이 함수는 cv2.waitKey(0)와 함께 사용해야 작동을 합니다. cv2.waitKey(0)를 생략하면 어떻게 나오느냐 하면
이렇게 응답 없음으로 나옵니다. 코드는 아래처럼 wailKey()와 destroy…()도 주석으로 해서 테스트 해봅니다.
오류가 나고 jupyter 커널도 재시작 합니다.
'Tensorflow > OpenCV' 카테고리의 다른 글
OpenCV 1. 도형 그리기 문자 (Python) (5) | 2019.04.01 |
---|---|
OpenCV 1. 도형 그리기 다각형 (Python) (0) | 2019.03.30 |
OpenCV 1. 도형 그리기 원 타원 (Python) (0) | 2019.03.28 |
OpenCV 1. 도형 그리기 사각형 (Python) (1) | 2019.03.26 |
anaconda에 opencv 설치하고 jupyter로 테스트 (9) | 2019.03.22 |