설치


sudo pip install opencv-python

sudo pip install opencv-contrib-python

(추가)

sudo pip install matplotlib


예제



실행결과




참고


https://pypi.org/project/opencv-python/

1. OpenCV 3.2 다운로드

http://opencv.org/releases.html


2. opencv-3.2.0-vc14.exe 실행

압축을 풀 폴더를 지정 -> Extract 

(필자는 D:\opencv_lib 지정)


3. 비주얼 스튜디오 2017 프로젝트 생성


4. 프로젝트 속성에 VC++ Directories 에서 64비트로 설정

Configuration Manager -> Active solution platform : x64로 설정


5. 프로젝트 속성에 OpenCV 라이브러리 설정

1) C/C++ -> 일반 -> 추가 포함 디렉터리 -> 포함 디렉터리 추가

D:\opencv_lib\opencv\build\include

D:\opencv_lib\opencv\build\include\opencv

D:\opencv_lib\opencv\build\include\opencv2

2) 링커 -> 일반 -> 추가 라이브러리 디렉터리 -> 라이브러리 디렉터리 추가

D:\opencv_lib\opencv\build\x64\vc14\lib

3) 링커 -> 입력 -> 추가 종속성 -> 라이브러리 추가

opencv_world320.lib

opencv_world320d.lib


6. 실행 파일 폴더에 dll 폴더 복사

opencv_ffmpeg320.dll

opencv_world320.dll

opencv_world320d.dll

7. OpenCV 코드 실행

1) 소스 코드

2) 실행 결과




[OpenCV 3.2] Template Matching with Multiple Objects (다중 물체 찾기)

minMaxLoc 함수를 사용하면 단일 물체 찾기는 편하지만 다중 물체 찾기에 이용할려니 매번 matchTemplate 함수를 반복해서 속도가 상당히 느릴 뿐더러 오인식의 경우가 생긴다.

한 이미지에 대해 대응하는 복수의 물체를 찾을 때는 matchTemplate 결과의 배열 값을 직접 분석하는 방법으로 속도와 인식률을 높일 수 있다.

 

1. 소스 코드


2. 실행 결과

1 : 스페이드, 2: 다이아몬드, 3 : 하트, 4 : 클로버 로 표시

실행 결과 속도와 인식률이 개선되었다.

보완할 점으로 하트와 다이아의 경우 인접한 픽셀 값들이 한계값 내에 있어서 중복하여 표시해주는데 좌표 값 사이를 조정하면 쉽게 해결된다.

개선 후의 matchTemplate 함수의 카드 문양 인식률이 상당히 좋아졌다.

다음은 나란히 배열되는 문양의 위치를 ROI (관심영역)로 지정하고 1부터 A까지의 숫자, 문양을 인식하여 현재 보이는 패의 족보와 확률 값을 계산한다.

영상 인식을 통해 족보와 확률 값이 확립되면 컴퓨터에게 포커 및 여러 카드 게임을 가르치고 딥러닝을 이용하여 인공지능 포커 플레이어를 만들 에정이다.




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(Template Matching Python) http://docs.opencv.org/3.2.0/d4/dc6/tutorial_py_template_matching.html

[OpenCV 3.2] Template Matching - 트럼프 카드 문양 찾기

matchTemplate 함수를 이용하여 트럼프 카드의 스페이드, 하드, 다이아, 클로버 문양들을 찾아 분류한다.


1. 소스 코드

1) MFC 다이얼로그 꾸미기

2) 소스 코드

같은 문양의 카드는 최대 13장이므로 최대 13번 반복한다.

우선적으로 스페이드, 다이아몬드, 하트, 클로버 순으로 한번씩 템플릿 매칭을 해나간다.

템플릿 매칭 결과 값이 있는 문양은 다음 순에도 찾는다.


2. 실행 결과

1) 원본 이미지

2) 찾을 이미지 (스페이드, 다이아몬드, 하트, 클로버)

3) 결과 이미지

1 : 스페이드, 2: 다이아몬드, 3 : 하트, 4 : 클로버 로 표시


4) 개선 사항

- 카드의 배경이 다른 경우 문양을 오인식한다.

- 문양이 아닌 배경을 오인식하는 경우가 있다.

- 스페이드와 클로바가 서로 틀리는 경우가 있다.

=> ROI 영역 지정과 다른 배경 카드(히든 카드)의 이미지 처리가 필요




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(매칭률 구하기) http://action713.tistory.com/entry/%EB%A7%A4%EC%B9%AD%EB%A5%A0-%EA%B5%AC%ED%95%98%EA%B8%B0

[OpenCV 3.2] Template Matching - 유사 이미지 모두 찾기

matchTemplate 함수를 이용하여 유사 이미지를 찾아본다.


1. 소스 코드

matchTemplate 결과 이미지에서 minMaxLoc 함수를 이용하여 가장 유사한 이미지를 찾을 수 있다.

가장 유사한 이미지 공간을 백그라운드 색으로 칠한 후에 matchTemplate 함수를 사용하는 방법으로 유사 이미지를 반복하여 찾는다.


2. 실행 결과

MAX_COUNT를 10으로 지정하여 총 10개의 유사 이미지를 찾는다.

유사한 순으로 9,8,7,...,0을 지정하여 숫자가 높을수록 유사도가 높다.

1) 원본 이미지

2) 다이아몬드 템플렛 이미지

3) 하트 템플렛 이미지

4) 별 템플렛 이미지

matchTemplate 함수는 비슷한 크기의 이미지를 찾을 때 상당히 유효하지만 크기의 차이가 크거나 변환 된 이미지에서 유효하지 않다.




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

[Template Matching] http://docs.opencv.org/2.4/doc/tutorials/imgproc/histograms/template_matching/template_matching.html

[Template Similar image] http://stackoverflow.com/questions/34690774/opencv-template-match-similar-object

[OpenCV 3.2] Circle Detection (원 검출)

HoughCircles 함수를 이용하여 원을 검출한다.


1. 소스 코드

검출 과정은 1)그레이스케일 2)이진화 3)에지 검출 4)원 검출 5)검출 결과 표시 순이다.


2. 실행 결과




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(HoughCircles) http://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=houghcircles

(공 검출) http://zeal74.tistory.com/1171

(오목 UI) http://lyzqm.blogspot.kr/2015/07/3.html#more

[OpenCV 3.2] Shape Detection (다각형 검출)

사각형 검출에서 다각형의 꼭지점 개수로 사각형을 구분하였는데 4개의 선분 이상의 다각형에서는 화살표, 블록, 별 모양 등의 도형을 구분할 수 없다.

그래서 꼭지점 개수와 각 코너의 각도를 구해서 다각형을 검출하겠다.

http://webnautes.tistory.com/1097 에서 소스 코드를 참고하였다.

기존 코드에서는 각 코너의 각도를 계산하는 방식으로 정다각형만 검출을 하는데 코드를 수정하여 정다각형이 아닌 경우도 검출하도록 하였다.


1. 소스 코드


2. 실행 결과

원본이미지 - 출처 : http://webnautes.tistory.com/1097

검출 이미지




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(Shape Detection) http://webnautes.tistory.com/1097

(Contour 영역 내에 텍스트 쓰기) https://github.com/bsdnoobz/opencv-code/blob/master/shape-detect.cpp

(세 점이 주어질 때 사이 각도 구하기) http://stackoverflow.com/a/3487062

[OpenCV 3.2] Detect Rectangle - 1 (사각형 검출)

OpenCV의 findContours와 approxPolyDP함수를 이용하여 사각형을 검출한다.


1. 사각형을 검출할 이미지를 생성한다.


2. 사각형을 검출할 이미지를 Canny함수로 에지 이미지로 변환한다.

1) 소스 코드

2) 실행 결과


3. 에지 이미지를 morphologyEx 함수로 형태를 뭉갠다.

1) 소스 코드

2) 실행 결과


4. Morph 이미지를 contours함수를 이용하여 도형들을 그룹화 한 후 그려준다.

1) 소스 코드

디버그 모드로 findContours 함수 사용에서 에러가 발생했는데 릴리즈 모드로 바꿔서 빌드하니 해결이 되었다.

2) 실행 결과


5. contours 이미지를 approxPolyDP를 이용하여 선분을 간략화한 후에 4개의 꼭지점을 갖는 도형을 검출한다.

1) 소스 코드

처음에 convexHull을 사용해 봤는데, convexHull는 십자가나 별표 모양의 안쪽으로 굽어진 도형들이 있는 경우에 내부 점들을 무시하기 때문에 다각형 검출에 적절하지 못하다.

2-1) appoxPolyDP의 실행 결과

2-2) 4개의 꼭지점의 도형만 검출 결과


6. 사각형 검출 최종 순서도


다음은 주어진 이미지와 비슷한 이미지를 검출하는 것에 대해 정리한다.




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(Detect rectagle from corners) http://stackoverflow.com/questions/34377943/opencv-is-it-possible-to-detect-rectangle-from-corners

(Ramer–Douglas–Peucker algorithm) https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm

(contours2.cpp) https://github.com/opencv/opencv/blob/master/samples/cpp/contours2.cpp

(형태학 필터)  http://hongkwan.blogspot.kr/2013/01/opencv-5-2-example.html

(approxPolyDP) http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html

(외곽선 찾기) http://hns17.tistory.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-ConvexHull-Grahams-Scan

[OpenCV 3.2] Harris corner detector - 모서리 검출 알고리즘

영상을 인식하는데 있어서 물체의 같은 색상의 픽셀은 구분하기가 힘들다.

픽셀의 값이 크게 바뀌는 물체의 윤곽선이나 모서리를 특징점이라고 한다.

모서리 검출 알고리즘으로 유명한 Harris 모서리 검출을 정리한다.


1. Harris 모서리 검출 함수

void cornerHarris(InputArray src, OutputArray dst, int blockSize, int ksize, double k, int borderType=BORDER_DEFAULT )

1) src : 모서리 검출 할 gray 이미지

2) dst : 모서리 검출 결과 이미지

3) blcokSize : 이웃 사이즈

4) ksize : Sobel()동작을 위한 Aperture 매개변수

5) k : Harris detector free parameter (아래 공식 참고)

6) borderType : 픽셀 보간 타입

\texttt{dst} (x,y) =  \mathrm{det} M^{(x,y)} - k  \cdot \left ( \mathrm{tr} M^{(x,y)} \right )^2

Harris 모서리 검출 함수는 이론을 정확히 알지 못하면 매개변수들의 의미를 잘모르겠다. 시간이 날 때 다시 찾아보겠다.


2. 소스 코드

주석 처리 부분은 모서리 부분에 초록색 동그라미를 그리고 싶었으나 실패한 소스 코드이다.

결국 맨붕해서 소스 코드 정리도 하지 않은 채 올리게 되었다. 이것도 시간이 날 때 다시 정리하겠다.


3. 실행 결과



Harris Corner Detector가 잘 되면 이걸로 도형을 인식하고 싶었으나, 지식 습득 부족으로 다음 시간에 findContours()를 이용하여 도형을 찾는 방법을 정리하겠다.




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(OpenCV documentation) http://docs.opencv.org/3.0-beta/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html

(Harris corner detector) http://blog.naver.com/sh1nk1y/80051220061

(영상 특징점 추출법) http://darkpgmr.tistory.com/131

(Shape Detection - English) http://opencv-srf.blogspot.kr/2011/09/object-detection-tracking-using-contours.html

(Shape Detection - 번역) http://m.blog.naver.com/ledzefflin/220503059357

[OpenCV 3.2] Labeling (레이블링, 라벨링)


1. 레이블링이란?

이진화 한 이미지에서 형체를 알아보기 위해 같은 픽셀 값들끼리 그룹화하여 번호를 매긴 것을 레이블링이라고 한다.

레이블링은 크게 4방향과 8방향으로 나누어진다.

4방향은 한 픽셀을 중심으로 좌우상하로 인접한 픽셀을 그룹화하고, 8방향은 좌우상하에 대각선4방향과 인접한 픽셀을 그룹화한다.

 

 

 

 

 

1

 

 

2

2

 

 

1

 

 

2

 

 

3

 

 

 

 

 

3

3

 

 

 

 

 

 

 

 

4

5

 

6

6

 

4

 

 

7

 

6

 

 

4방향 레이블링

 

 

 

 

 

1

 

 

2

2

 

 

1

 

 

2

 

 

1

 

 

 

 

 

1

1

 

 

 

 

 

 

 

 

3

4

4

 

4

4

 

3

 

 

4

 

4

 

 

8방향 레이블링


2. 소스 코드

int cv::connectedComponentsWithStats ( InputArray image, OutputArray labels, OutputArray stats, OutputArray centroids, int connectivity = 8, int ltype = CV_32S )

1) image : 레이블링할 이미지

2) labels : 레이블링한 결과 이미지

3) stats : 레이블링 된 이미지 배열

4) centroids : 레이블링 된 이미지의 중심좌표

소스 코드 참조 : http://webnautes.tistory.com/823


3. 실행 결과




컴퓨터 비전과 영상 처리에 대해 독학을 하면서 정리한 걸 적고 있습니다.

전공과 무관하며 전문적인 지식이 아니므로 개인적인 의견과 부족하고 틀린 점이 많습니다.

추가 지식 및 잘못된 점을 지적해주시면 공부하는데 많은 도움이 되겠습니다. 감사합니다^^

- 푸어맨


[Reference]

(스텍 레이블링) http://devmonster.tistory.com/22

(십자 모양 레이블링) http://webnautes.tistory.com/823

(OpenCV 레이블링 함수) http://lab.deepaivision.com/2015/04/opencv-30-blob-or-labeling-algorithm.html

(번호판 인식 절차) http://dslab.konkuk.ac.kr/Class/2014/14CD1/%EC%A1%B8%EC%97%85%EC%9E%91%ED%92%88%202%EC%B0%A8%20%EB%B3%B4%EA%B3%A0%EC%84%9C_200511347_%EC%9D%B4%ED%83%9C%ED%99%94,200811447_%EC%9D%B4%EC%9E%AC%ED%98%95__2_.pdf

+ Recent posts