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 - 트럼프 카드 문양 찾기

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

[에러 메세지]

ACCESS_MASK is ambiguous


[해결 방안]

opencv의 헤더 파일을 기존 헤더 파일보다 우선시 include 시에 문제가 생김

아래와 같이 #include의 위치를 수정하여 해결


#include "stdafx.h"

#include "AIpoker.h"

#include "AIpokerDlg.h"

#include "afxdialogex.h"

#include <opencv2/core/core.hpp> 

#include <opencv2/imgcodecs.hpp>

#include <opencv2/highgui/highgui.hpp> 

using namespace cv;


#include <iostream> 

using namespace std;


[참고]

(C2870 ambiguous symbol error) http://stackoverflow.com/questions/39348845/c2870-ambiguous-symbol-error

[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] 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

[OpenCV 3.2] Canny Edge Detector - 가장자리 검출 알고리즘

영상에서 사각형 혹은 숫자 등의 물체를 인식할 때 형상의 테두리로 알 수 있다.

이미지를 그레이 이미지로 변환한 후 가장자리 검출 알고리즘을 이용하여 이미지를 이진화 하는 방법에 대해 정리한다.


1. Canny Edge Detector란?

Canny 에지 검출 알고리즘은 1986년도에 John F. Canny에 의해 고안되어 대중적으로 많이 사용되고 있다.

Canny 알고리즘은 에지 검출 알고리즘에 있어서 다음 세가지의 기준을 내놓는다.

낮은 에러율 : 실제 에지만을 탐지하는 능력

낮은 오차율 : 실제 에지와 탐지된 에지의 픽실 거리 차이를 최소화

최소한의 응답성 : 각 에지에 대해서는 한 번만의 검출


2. 소스 코드

1) canny 함수

void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )

image : 그레이 이미지

edges : 변환한 에지 이미지

threshold1 : 에지 임계값

threshold2 : threshold1 * ratio

apetureSize : 커널 사이즈


2) MFC에 Canny Edge 슬라이더 컨트롤 변수 추가하기

MFC 관련 소스 코드 참조 : http://poorman.tistory.com/157


3) Canny 함수 추가

3. 실행 결과

다음은 ...




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

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

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

- 푸어맨


[Reference]

(OpenCV Canny 함수) http://www.docs.opencv.org/2.4.10/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

(캐니 알고리즘) http://iskim3068.tistory.com/60

(숫자 인식) http://egloos.zum.com/skaria/v/1083349

(번호판 인식) http://mind3002.blogspot.kr/2016/01/cc-opencv-license-plates-recognition.html

[OpenCV 3.2] Histograms - 4 : Histogram Equalization (평활화)

이번 정리에서는 히스토그램 평활화로 명암대비를 개선시킨 이미지로 변환시킨다.


6. 히스토그램 평활화하기

1) 히스토그램 스트레칭과 히스토그램 평활화

 히스토그램 스트레칭은 이미지의 가장 밝은 픽셀값과 어두운 픽셀값을 기준으로 늘린 것 뿐이라면, 히스토그램 평활화는 이미지의 전체 픽셀 값을 균등하게 재배치한다. 그러므로 히스토그램 평활화는 밝기 값의 차이들이 적어서 명암대비가 세밀하게 이루어진다.

 다음은 위키 페디아에 실린 원본 이미지와 히스토그램 평활화가 이루어진 이미지의 누적 히스토그램을 보여준다.


2) 소스 코드

void cv::equalizeHist ( InputArray src, OutputArray dst )

src : gray image

dst : equalization histogram image

그레이 이미지를 equalizeHist를 한 후 히스토그램을 그려준다. 


3) 실행 결과

원본 이미지와 히스토그램

히스토그램 평활화 후 이미지와 히스토그램

지금까지 1차원 히스토그램을 표시했는데, 2차원 이상의 다차원 히스토그램도 존재한다.

다차원 히스토그램에 대해서는 추후 정리하도록 하고 다음은 Canny를 이용한 Edge(가장자리) 검출 알고리즘에 대해 정리한다.




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

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

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

- 푸어맨


[Reference]

(OpenCV HistogramEqualization) http://docs.opencv.org/3.2.0/d4/d1b/tutorial_histogram_equalization.html

(equalizeHist) http://docs.opencv.org/3.2.0/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e

(위키 페디아) https://en.wikipedia.org/wiki/Histogram_equalization

(히스토그램 프로세싱) http://blog.naver.com/PostView.nhn?blogId=neverabandon&logNo=100053397929&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

(히스토그램 스트레칭) http://m.blog.naver.com/dlwjddns5/220687524811

+ Recent posts