본문 바로가기

프로젝트 (Project)

Opencv를 활용한 동전 검출 프로젝트

대학교 수업 중 Opencv를 사용하는 창의융합 프로젝트 1 과목에서 수행한 프로젝트로 머신러닝 없이 Opencv만으로 동전을 검출하여 총액을 구하는 프로젝트로 총 60개의 이미지에 있는 동전 검출에 성공해야 한다.

1. 이미지 전처리

동전을 검출하려면 동전의 윤곽선을 추출해야 한다. 하지만 60개의 이미지가 다른 배경에서 찍은 사진이라 무늬가 있는 바닥에서는 무늬까지 윤곽선이 추출되어 확인하는데 어려움이 있다. 그러므로 배경 무늬를 제거하기 위해 Gaussian Blur로 강한 배경 경계선을 지운 후 Bilateral Filter로 동전의 윤곽선은 최대한 유지한 채로 남은 배경의 경계선을 지웠다.

<왼쪽: 기본 이미지/중간: Gaussian Blur/오른쪽: Gaussin Blur + Bilateral Filter 적용>

2. 윤곽선에서 원 검출하기 

전처리로 만든 윤곽선 이미지에서 원을 검출해야 했다. 그 이유는 동전이 원의 모양이기 때문이다. 우리팀은 원을 검출할 때 두 가지 방법을 생각하였다.

  1. Hough Circles을 통한 원 검출
  2. Contour를 통한 원 검출

2-1. Hough Circles 통한 원 검출

Hough Circles 방법으로 시도해봤다. 하지만 문제점이 있었는데 위 전처리 사진을 보면 완벽하게 원의 형태로 윤곽선을 추출하지 못한 사진이 많다. 그렇기 때문에 paramter 값을 변경한다면 원을 검출할 수 있었지만 다른 배경의 이미지나 원근감에 따라 검출이 안 되는 문제가 발생하였다. 가장 범용적인 paramter 값으로 위 사진을 검출했을 때의 결과는 아래와 같다.

<Hough Circles 검출>

2-2. Contour를 통한 원 검출

Contour를 통하여 원을 검출한 결과는 아래와 같다. 배경의 윤곽과 원의 호 부분이 검출 되었다. 이진화된 영역이 여러 contour로 나누어 검출된 것을 확인 가능하다. 하지만 이상태로는 원을 검출을 할 방법이 없다.

<Contour로 윤곽선 검출>

3. 최종 원 검출

원 검출방법에 대해 계속 생각하던 도중 한 가지 아이디어가 떠올랐다.

Contour에서 만든 동전의 윤곽선은 호 형태로 나온다.
호를 통하여 원을 그릴수 있지 않을까?

호를 원으로 표현하는 법을 찾다 3점을 지나는 원의 방정식을 찾게 되었다. 3점을 지나는 원의 방정식을 python에서 계산하기 쉽게 행렬로 표현한다면 다음과 같다. ((x1, y1), (x2, y2), (x3, y3)가 3점의 좌표이다.)

 

 

 

 

역행렬이 존재하지 않는 경우는 원의 방정식이 존재하지 않는 경우이다. 위 계산식 유도는 아래 링크에서 확인 가능하다.

https://darkpgmr.tistory.com/60

 

세 점을 지나는 원의 방정식 - 선형대수를 이용한 방법

세 점을 지나는 원의 방정식은 어떻게 될까? 지난 번 포스팅한 최소자승법의 이해와 다양한 활용예 (Least Square Method)에서 원의 방정식을 근사시키는 예제를 적다가 생각났던 내용이다. 세 점을

darkpgmr.tistory.com

임의의 3점은 다음과 같이 정했다 그 이유는 임의의 3점이 너무 근접하게 된다면 큰 원의 작은 각의 호로 판단할 가능성도 있을 거라 생각했기 때문이다.

  1. contour에 두 점 사이의 거리가 최대가 되는 경우의 점을 찍는다.
  2. 가장 거리가 먼 두 점(빨강, 초록)사이의 거리가 사진의 크기의 5%보다 작으면 이상한 원이라고 판단한다.
  3. 파랑과 빨강의 거리와 파랑과 초록의 거리가 유사하면서 각각의 거리가 최대인 점에 파랑점을 찍는다.

위 생각을 코드로 구현했을 때 다음과 같은 결과를 얻을 수 있었다.

4. 동전 분류

동전 분류는 크기와 색상 2가지로 분류했다. 먼저 비교적 갈색 빛을 내는 10원 경우에는 그린 원의 색상 값의 평균을 구해 rgb값의 비율을 계산한 후 일정 비율이라면 10원으로 분류하였다. 나머지 동전 같은 경우 TemplateMatching 혹은 FeatureMatching 기법을 사용하여 동전 안의 숫자를 인식하여 분류하려고 했으나 빛등 여러 요소로 인해 숫자를 통한 분류에 실패하였다. 진행 중 사진 속 코인의 20%는 사용해도 무방하다는 공지가 내려와 사진속 동전을 추출하여 사용하게 되었다.

<사진속 동전 추출>

4-1. 동전 크기에 따른 진리표

사진속 동전 중 20% 사용 가능하여 전체를 매칭 하는 것은 불가능하였다. 그러므로 진리표를 만들어서 전체 동전의 종류를 파악할 수 있는 경우를 확인 후 일부만 추출하여 사용하였다.

50원 여부 100원 여부 500원 여부 templatr Matching 필요한 동전
X X X 10원
X X O 최소 크기 500원
X O X 최대 크기 100원 or 최소 크기 100원
X O O 최소 크기 100원, 최소 크기 500원
O X X 최대 크기 50원 or 최소 크기 50원
O X O 최대 크기 50원, 최소 크기 500원
O O X 최대 크기 50원, 최대 크기 100원
O O O 최대 크기 50원, 최소 크기 500원

5. 결과

그 결과 전체 사진 중 81%로 동전 검출에 성공하였다. Trackbar를 통하여 전처리 paramter 값을 조정했을 때에는 95%의 동전 검출 성공으로 1등으로 마무리하였다. 전체적으로 좋은 검출율을 보였으나, 바닥이 대리석으로 되어있는 경우 검출이 안되거나 크게 되는 경향이 있었다.

6. 발표 PPT

최종발표ppt.pptx
9.50MB