1.2 사각형


rectangle() 함수를 이용하여 사각형을 그릴 수 있습니다. rectangle은 모서리의 각이 모두 직각(90)인 사각형이므로 시작점(좌측 상단)과 종료점(우측 하단) 두곳의 좌표만 기입하여 도형을 그립니다.

 

cv2.rectangle(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)


1.2.1 rectangle() 사각형 그리기


시작점의 좌표와 종료점 좌표를 기입하면 직각 사각형을 그릴 수 있습니다.


opencv_rectangle


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.rectangle(img, (10, 10), (100, 100), blue_color, 3)

img = cv2.rectangle(img, (110, 110), (200, 200), green_color, 3)

img = cv2.rectangle(img, (210, 210), (350, 350), red_color, 3)

 

cv2.imshow(‘rectangle’,img)

cv2.waitKey(0)

cv2.destroyAllWindows()


opencv_rectangle


- 채워진 사각형


외곽선의 두께에 -1 값을 주게 되면 내부가 색칠된 사각형을 얻을 수 있습니다.


img = cv2.rectangle(img, (10, 10), (100, 100), blue_color, -1)

img = cv2.rectangle(img, (110, 110), (200, 200), green_color, -1)

img = cv2.rectangle(img, (210, 210), (350, 350), red_color, -1)



opencv_rectangle



1.2.2 clipLine() 사각형 내 직선


cv2.clipLine(imgRect, pt1, pt2) → retval, rpt1, rpt2


parameter

 내용

 imgRect

 검출 하려는 직사각형 영역

 pt1

 직선의 시작점

 pt2

 직선의 종료점

 retval

 결과. True : 사각형 내에 선이 있음, False : 사각형 내에 선이 없음

 rpt1

 사각형 안에 있는 선의 시작점

 rpt2

 사각형 안에 있는 선의 종료점


clipLine() 함수는 직사각형 영역 내에 직선이 존재하는 경우 시작 위치와 종료 위치의 좌표를 얻기 위해 사용 합니다직사각형을 그리고 직선을 그어서 교차점이 어디인지 확인해 보겠습니다.


opencv_rectangle


opencv_rectangle


결과 값이

True (50, 50) (350, 350)


직선이 사각형 내에 있고 직선의 시작 위치와 종료 위치가 표시 됩니다.

 

- 도형 없이 실행


도형은 좌표를 알기 위해 시각화 한 것 뿐입니다. 도형을 주석처리하고 다시 실행해 봅니다.


opencv_rectangle


opencv_rectangle


도형으로 시각화 하지 않아도 사각형 내에 있는 선의 시작, 종료 좌표를 구할 수 있습니다.


- 도형과 관계 없는 좌표


도형은 위의 예처럼 그리고 실제 구하려는 사각형 내의 직선의 시작 위치는 변경을 해보겠습니다그러면 사각형 내에 있는 직선의 시작점과 종료점을 구하게 됩니다.


opencv_rectangle


opencv_rectangle


결과 값

True (60, 60) (350, 350)


retval, pt1, pt2 = cv2.clipLine((50, 50, 350, 350), (60, 60), (350, 350))

clipLine() 함수에 있는 사각형 내부에 존재하는 직선의 시작점과 종료점 값을 잘 구하고 있습니다.



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 커널도 재시작 합니다.

 

opencv를 설치하고 테스트 하는 방법은 아주 다양 합니다저는 anaconda를 설치했기 때문에 그냥 숟가락 하나 더 놓기만 하면 되기 때문에 anaconda에서 테스트를 해보았습니다.


아나콘다 설치는 아래 링크를 참조 하세요.

아나콘다 설치 윈도우즈 7, 10 (Anaconda Version 5.2.0) - 201812



1. opencv 설치

 

Anaconda Prompt를 열고 명령어를 실행 합니다.  


anaconda_opencv_jupyter


 

설치는 명령어 하나면 완료 됩니다.

명령어도 다양한데 저는

 

conda install -c menpo opencv3

동일한데 설치 오류나면 이거

conda install --channel https://conda.anaconda.org/menpo opencv3

 

아니면

pip install opencv-python

또는 

pip install opencv-contrib-python

이것으로 설치를 진행 합니다.


anaconda_opencv_jupyter


중간에 진행 여부를 물어보면


anaconda_opencv_jupyter


y 하고 엔터


anaconda_opencv_jupyter


opencv가 설치 완료 되었습니다.

 

 

2. jupyter notebook 실행

 

시작 버튼에서 아나콘다 메뉴를 선택하고 jupyter notebook을 클릭 합니다.


anaconda_opencv_jupyter


주피터 노트북이 열리면 파일을 하나 새로 만들어 줍니다설치 버전에 따라 Python 3이 아니고 Python 2인 경우도 있을 텐데 관계 없습니다.


anaconda_opencv_jupyter


코딩을 하고 상단 Run을 클릭 합니다.


anaconda_opencv_jupyter


소스는 글씨가 너무 작나요? 인터넷에 바글바글하게 있긴 한데 아래와 같습니다.


import cv2

 

img = cv2.imread('F:/tensordata/number/num3.png')

cv2.imshow('image',img)

cv2.waitKey(0) 

cv2.destroyAllWindows() 


실행을 하면 새 창이 뜨면서 이미지를 볼 수 있습니다.


anaconda_opencv_jupyter



1234

+ Recent posts