[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

[딥 러닝] 싱글 뉴런 학습 시키기 - 역전파(back propagation) 구현하기


1. MFC로 다이얼로그 구성

1) Toolbox


2. 소스 코드

1) Neuron 클래스에 back propagation 함수 추가

2) Back-Prop 버튼과 target 에디트 박스 값과 연동


3. 실행 결과

초기값 설정

x : 1, Weight : 2, Bias : 3, y : 5, target : 13




딥 러닝에 대해 독학을 하면서 정리한 걸 적고 있습니다.

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

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

- 푸어맨


[Reference]

(MFC에서 콘솔창 띄우기) http://poorman.tistory.com/63

(역전파 구현하기) http://blog.naver.com/atelierjpro/220703090092

[딥 러닝] 싱글 뉴런의 작동원리 (Feed-forward 구현하기)


1. MFC로 다이얼로그 구성

1) Toolbox

2) Editbox의 CString 값을 Double로 Get, Set하는 함수 생성

2. Feed-foward 함수 클래스 생성 및 계산 결과 표시


3. 실행 결과





딥 러닝에 대해 독학을 하면서 정리한 걸 적고 있습니다.

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

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

- 푸어맨


[Reference]

(위키백과) https://ko.wikipedia.org/wiki/%EB%94%A5_%EB%9F%AC%EB%8B%9D

(C++로 배우는 딥러닝) http://m.blog.naver.com/atelierjpro/220697890605

(C++로 Feed-forward 구현하기) http://blog.naver.com/atelierjpro/220697902502

(인공 뉴런의 작동원리) http://blog.naver.com/atelierjpro/220697901074

[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

1. MFC 공유 라이브러리를 정적 라이브러리로 변경

프로젝트 속성 -> 구성 속성(Configuration Properties) -> 일반(General) -> MFC 사용(Use of MFC) -> 정적 라이브러리 사용(Use MFC in a Static Library) 로 변경


2. 런타임 라이브러리를 MD에서 MT로 변경

프로젝트 속성 -> C/C++ -> 코드 생성(Code Generation) -> 런타임 라이브러리(Runtime Library) -> Multi-threaded (/MT) 로 변경

[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