인프런 커뮤니티 질문&답변

이현우님의 프로필 이미지
이현우

작성한 질문수

C# OpenCV 컴퓨터비전 입문 강좌

코너검출 일정 부분검출이 가능한 것인가요?

작성

·

408

0

혹시 포커카드와 같이 특정 문양과 숫자있는 부분만 코너 검출로 뽑아 낼 수 있는지 알고 싶습니다. 코너 검출이 특정 크기에 적용될 수 있는지 묻고싶습니다.  윤곽선 검출로 뽑아내야하는 건지 어떤 방식을 사용해야할지 감이 잡히지 않아서 질문드립니다.

답변 4

0

윤대희님의 프로필 이미지
윤대희
지식공유자

안녕하세요. 이현우님 윤대희입니다.

구현하신 코드를 보았을 때, 카메라의 프레임마다 실시간으로 corner.png와 부합되는 영역을 찾는 것으로 이해 됩니다.

만약, 카메라에서 불러오는 이미지(src)가 ◆가 여러 개 있는 이미지고, 템플릿 매칭 이미지(temp)가 ◆가 하나라면, 현재 코드에서는 좌측 상단의 ◆만 인식되는 것으로 이해됩니다.

 

◆ 위치를 하나의 이미지에서 여러 번 검색하는 방법은 다음과 같습니다.

1. 템플릿 매칭이 검출된 (minloc.X, minloc.Y, templit.Width, templit.Height) 좌표를 src 에 덮어씌운다음에 TemplitImage 메서드를 다시 반복하는 방법

 

2. 템플릿 매칭을 통해 반환된 calc 이미지에 최솟값을 갖는 location 뿐만아니라, 두 번째, 세 번째, 네 번째 ... 등까지 검색하는 방법입니다. 말씀하신 threshold는 최대 개수 제한치로 고려하시면 됩니다.

 

- 2번 방법이 가장 효율적인 방법이지만, 두 번째, 세 번째, ... N 번째까지 찾으셔야 하기 때문에 세밀한 조건 설정이 필요합니다. 이 조건에 if문을 사용하시면 될 것 같습니다.

만약, 여러 문양을 비교하시려면 TemplitImage를 여러 번 실행하셔야 합니다.

 

감사합니다. 윤대희 드림.

 

 

 

 

이현우님의 프로필 이미지
이현우
질문자

답변 감사합니다.

0

이현우님의 프로필 이미지
이현우
질문자

제가 구현한 코드입니다. 실시간으로 다이아를 인식하도록 구현했는데 잘 작동한 것을 알수 있었습니다. 

제가 이렇게 코드를 짜서 실시간으로 템플릿 매칭을 할 때 if문이 어디에 들어가야 하나요 form쪽에 들어가야 하나요 아니면 class에 들어가야 하나요 혹시 비교할때 threshold를 사용하는 것이 더 정확한 결과를 도출 할수 있는 것인가요?

IplImage temp=new IplImage("../../../dia7.png")

IplImage temp1=new IplImage("../../../dia8.png") 처럼 여러가지 문양들을 비교 하고 싶은데 이렇게 써도 되는 것인지 궁금합니다. 

 

답변감사합니다.

0

윤대희님의 프로필 이미지
윤대희
지식공유자

안녕하세요. 이현우님 윤대희입니다. 

하나의 화면에서 여러 개의 템플릿 매칭을 수행하는 방법으로는 반복문을 활용하여 적용하는 방법입니다.

템플릿 매칭은 주사선 방향으로 검색했을 때 가장 먼저 발견되는 매치 객체를 반환합니다. (상단, 좌측 우선)

그러므로, 처음 객체를 발견한 다음, 원본 이미지에 해당 영역만큼 마스크(하얀색, 검은색 등)를 씌워 해당 영역에서 객체를 삭제하고 다시 검색을 진행하시면 됩니다.

 

예를 들어

반복문:

    템플릿 매칭(검색하려는 이미지, 검색 대상)

     if 검색에 성공했다면:

          검색하려는 이미지 = 검색한 대상을 덮어씌운(삭제한) 이미지

    else: # 더이상 발견하지 못했다면

         종료

 

다음과 같은 형태로 구현할 수 있습니다.

위와 같은 방식으로 적용하신 코드를 구현하셨다면, 간단히 피드백 드리도록 하겠습니다.

 

감사합니다.

윤대희 드림

0

윤대희님의 프로필 이미지
윤대희
지식공유자

안녕하세요. 이현우님 윤대희입니다.

특정 문양이나 숫자와 같은 의미가 있는 데이터의 경우 코너 검출이나 윤곽선 검출로는 어려울 수 있습니다.

OpenCV에서는 다음과 같은 함수로 검출이 가능합니다.

1. ORB (Oriented FAST and Rotated BRIEF)

2. SIFT (Scale-Invariant Feature Transform)

3. Template matching

4. 머신러닝/덥러닝 활용

- Support Vector Machine

- Darknet You only look once (YOLO)

5. 텐서플로, 파이토치를 활용하여 Object Detection Model 학습

주로 위와 같은 방법을 활용하여 객체 검출을 진행합니다.

 

특정 크기라는 것이 주 키포인트라면, 윤곽선의 면적을 계산하는 방법이 있습니다. 

cv.ContourArea 메서드입니다.

이현우님의 프로필 이미지
이현우
질문자

그러면 혹시 하나의 화면에서 여러개의 templit matching을 하는 방법은 어떤 것인가요?

혹시 제가 짠 코드 한번 봐주 실수 있나요 ?

 

이현우님의 프로필 이미지
이현우

작성한 질문수

질문하기