2012-03-21 1 views
0

나는 로고 (로고가 다른 명암, 색조 또는 채도가있을 수 있음)를 감지해야하는 안드로이드 프로젝트를하고 있는데, 안드로이드 용 OpenCV-2.3.1의 히스토그램 비교를 사용하고 있습니다.이미지 로고 비교

다음 단계는 다음과 같습니다.

1)은 저장된 이미지

private List<Integer> histSize; 
    private List<Float> ranges; 


    histSize.add(50); 
    histSize.add(60); 
    histSize.add(10); 

    ranges.add(0f); 
    ranges.add(256f); 

    ranges.add(0f); 
    ranges.add(180f); 

    ranges.add(0f); 
    ranges.add(256f); 

    channels.add(0); 
    channels.add(1); 
    channels.add(2); 


hsv_base1=new Mat(); 
Imgproc.cvtColor(image1,hsv_base1, Imgproc.COLOR_BGR2HSV); 
hsv_base.add(hsv_base1); 
Imgproc.calcHist(hsv_base, channels,new Mat(), hist_base, histSize, ranges,false); 

2) 가 그때마다 촬상 화상의 프레임을 크로 핑하고 HIST의 값을 계산한다. 잘라낸 이미지의 크기는 저장된 이미지의 크기와 동일하며 위와 같은 방법으로 히스토그램 값을 계산합니다.

3) 모두 이미지

double base_test2 = Imgproc.compareHist(hist_base1,hist_baseCamera1,Imgproc.CV_COMP_CHISQR); 

의 저장 HIST 값을 비교 나는 comparehist의 좋은 가치를 얻을. 그러나 문제는 때로는 임의의 캡처 된 이미지, 즉 원치 않는 값에 대해 좋은 값을 제공합니다.

이제 히스토그램 비교와 함께 다른 방법을 사용할 계획입니다. 내 로고는 원으로 구성됩니다.

내 질문은 : 캡처 한 이미지가 저장된 로고의 원과 정확히 같은 크기의 원으로 구성되어 있다는 것을 알 수있는 방법이 있습니까?

또는 내가 사용해야하는 다른 방법, 또는 채널, 범위, histSize의 저장된 값으로 재생할 수 있습니까? 내가 전에 템플릿 매칭을 사용했다

, 매우 느리고 나는이에 어떤 빛을 감사하겠습니다

같은 크기의 이미지에 대한 꽤 어렵다.

답변

0

확실히 다른 방법이 있습니다. 사실 히스토그램을 비교하는 것은 이미 발견 한 것처럼 매우 모호한 방법의 선택입니다.

A roughly created de- and re construction of a greylevel picture

난 당신이 현재 색상으로 로고에서 작업하는 것을 볼 수 있지만, 단순한 접근 방식은 종종 더 나은 결과를 리드 (아래 그림에서 볼 수 있듯이 사진의 무리 같은 히스토그램을 가질 수있다). 그러므로 그레이 스케일 이미지로 작업 할 수 있는지 고려해야합니다 (로고를 색칠 할 수 없다는 의미는 아닙니다. 처리하기 전에 이미지를 분할해야 함을 의미합니다). 더 간단한 접근법은 종종 이미지의 데이터 양이 적기 때문에 런타임이 빨라집니다.

세분화를 완료했다면 이미지를 임계 값으로 처리하고 BLOB 분석 (이진 대형 오브젝트)을 수행 할 수 있습니다. 필요한 알고리즘은 관심 분야에 따라 다르며 그 방법과 설명을 찾을 수 있습니다 OpenCV documentation

내 생각에 matchShapes() 함수가 도움이 될 것입니다. 그러나 히스토그램을 약간 사용한 이미지 프로세싱에 대한 이해가 필요합니다.

물론 OpenCV의 Android 버전에 대한 래퍼를 찾아야합니다.

P. 환경, 프로그래밍 언어 및 플랫폼을 태그에 포함시키는 것을 잊지 마십시오.

+0

세그먼트 화가 더 나은 옵션 인 것 같습니다. openCv에서 세그먼트 화를 구현 한 적이 없지만 이것을 시도해 보겠습니다. – user1249358