2016-06-02 5 views
7

Java에서 Opencv 3을 사용하고 있는데 다른 이미지에 작은 이미지 (예 : 25x25 픽셀)를 찾으려고합니다. 그러나 FeatureDetector 감지 (0,0) 크기 작은 이미지에 매트.작은 이미지에 Opencv FeatureDetecter를 사용하는 방법

Mat smallImage = ... 

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); 
    DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); 
    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 

    Mat descriptorsSmall = new Mat(); 
    MatOfKeyPoint keyPointsSmall = new MatOfKeyPoint(); 

    detector.detect(smallImage, keyPointsSmall); 
    descriptor.compute(smallImage, keyPointsSmall, descriptorsSmall); 

여기서 keyPointsSmall 및 descriptorsSmall 크기가 0으로 지정되어 있으며 감지가 제대로 작동하지 않습니다.

하지만 150x150 픽셀과 같이 더 큰 이미지를 사용해도 정상적으로 작동합니다. 제안 사항이 있으십니까? 고맙습니다.

여기 샘플을 추가합니다. 우리는이 소스 이미지가 있습니다 This is source image

을 그리고 우리가 P 문자에 대한 템플릿이 있다고 가정 해 보자, 그래서 우리는 소스 이미지에이 P를 감지해야합니다. This is template

음 이미지를 더 높은 해상도로 스케일링하면 나에게 적합하지 않습니다. 그것은 시간과 자원을 잃을 것입니다. 이상적으로 그것은 회전 스케일 불변이어야합니다. 그러나 회전 및 규모가없는 간단한 솔루션도 좋습니다.

OpenCv를 제외한 다른 솔루션은 허용되지 않습니다. (예 : Tesseract 사용)

+0

작업중인 입력 데이터도 제공 할 수 있습니까? – ZdaR

+0

나는 최상의 샘플이 텍스트 인식이 될 것이라고 생각한다. 20x25 픽셀과 같은 각 문자의 아이콘이 있다고 상상해보십시오. 따라서 다른 이미지에서이 문자를 인식하려고 시도하십시오. 간단히하기 위해 폰트 패밀리와 서체 가중치는 샘플과 동일하다고 말할 수 있습니다. – RustamIS

+0

그래도 작업중인 데이터 세트를 직접 제공 할 수 있다면 문제를 재현 할 수 있습니다. – ZdaR

답변

1

개인 ID 속성을 읽는 것처럼 보입니다. 현저하게 이미지를 준비하고 그것을 벡터화 (그래서 스케일 및 회전 불변)하고 비교/일치를 수행합니다. 이것은 OpenCV에서 할 수 있습니다.

  1. 준비 : 종종 색상과 밝기를 줄입니다. 글자가 눈에 잘 띄는 경우 임계 값 (밝기/색상/perColorChannel)을 사용하여 해당 색상을 제거 할 수 있습니다. 당신은 위의 모든 것을 거의 검게하지 않고 단지 흰색이 될 수 있습니다. 추가로 선명하게하고 가장자리를 감지 할 수도 있습니다.

  2. 벡터화는 매우 간단하며 특정 기호에만 관심이 있다는 것을 알고 있으므로 벡터화 결과를 개선하는 데 사용할 수있는 추가 특성을 찾아야합니다 (노이즈 억제, 더 나은 선택 및 수정 특정 모서리/각도 등).

  3. 일치는 매우 간단합니다. 대상 글꼴 및 잠재적 인 기호를 알고 있기 때문에 일치는 매우 작은 오류 마진으로 많은 긍정적 인 결과를 가져와야합니다. 또한 대부분의 오류는 사용자가 확인할 수 있도록 몇 가지 오류가 존재할 수 있도록 쉽게 알아볼 수 있어야합니다.

잠재적 인 개선 : 프랙탈 접근 방식을 사용

  1. 스케일링은 종종 아주 잘 문자의 특성과 숫자를 유지하고 결과의 품질을 높일 수 있습니다.

  2. ID의 다른 부분을 감지하면 탐지 대상 영역을 식별하는 데 도움이됩니다. 이렇게하면 결과를 더 향상시킬 수 있습니다. 종종 사람들은 불필요한 추가 정보를 인식하고 잊고 싶은 것에 집중합니다. 그러나이 정보는 탐지시 발생할 수있는 잠재적 오류에 대한 아이디어를 제공합니다. 따라서 이름을 올바르게 인식 할 수없는 경우 ID에 실패 할 가능성이 있습니다.그래서 ID의 모든 정보를 얻으려는 것은 그림의 품질이 당신이 정말로 신경을 쓰는 정보에 대해 확신을 가질만큼 좋은 것이라면 좋은 지표입니다.

  3. 대상 영역이 정확히 무엇인지 알면 대상 영역을 고정 크기로 확장하고 픽셀 단위로 일치시킬 수 있습니다. 관심있는 글꼴을 정확하게 알고 있기 때문에 이러한 검색에는 놀랄만 한 높은 검색 속도가 적용될 수 있습니다. 픽셀 단위 매칭 및 벡터화를 사용하면 우수한 탐지율을 얻을 수 있습니다. 벡터 매칭은 벡터화와 비교할 때 매우 빠릅니다.

  4. 예상되는 기호의 위치와 크기를 알고 있기 때문에 속성 (기호의 실제 크기, 특정 영역의 검은 색 분포 등)을 기반으로 의사 결정 트리를 만들 수 있습니다. 이렇게하면 35 개 중 하나에서 4 개 중 하나 또는 그 이하로 질문이 내려집니다. 당신이 닮았 많은 기능을 얻을 것이다 템플릿이 매우 작은 경우, 슬라이딩 윈도우가 충분히 감지 기능을 얻을 수 없기 때문 텍스트 인식을위한

1

키포인트 감지, 최적의 솔루션이 아닙니다. here를 찾기 위해 here에서 가져온 예를 들어, 많은 다른 사람들과, link : 당신을 위해

럭키, OpenCV의 3이있는 contrib 저장소에서 텍스트 탐지/인식 모듈을 포함

/* 
* cropped_word_recognition.cpp 
* 
* A demo program of text recognition in a given cropped word. 
* Shows the use of the OCRBeamSearchDecoder class API using the provided default classifier. 
* 
* Created on: Jul 9, 2015 
*  Author: Lluis Gomez i Bigorda <lgomez AT cvc.uab.es> 
*/ 

#include "opencv2/text.hpp" 
#include "opencv2/core/utility.hpp" 
#include "opencv2/highgui.hpp" 
#include "opencv2/imgproc.hpp" 

#include <iostream> 

using namespace std; 
using namespace cv; 
using namespace cv::text; 

int main(int argc, char* argv[]) 
{ 

    cout << endl << argv[0] << endl << endl; 
    cout << "A demo program of Scene Text Character Recognition: " << endl; 
    cout << "Shows the use of the OCRBeamSearchDecoder::ClassifierCallback class using the Single Layer CNN character classifier described in:" << endl; 
    cout << "Coates, Adam, et al. \"Text detection and character recognition in scene images with unsupervised feature learning.\" ICDAR 2011." << endl << endl; 

    Mat image; 
    if(argc>1) 
     image = imread(argv[1]); 
    else 
    { 
     cout << " Usage: " << argv[0] << " <input_image>" << endl; 
     cout << "   the input image must contain a single character (e.g. scenetext_char01.jpg)." << endl << endl; 
     return(0); 
    } 

    string vocabulary = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; // must have the same order as the clasifier output classes 

    Ptr<OCRHMMDecoder::ClassifierCallback> ocr = loadOCRHMMClassifierCNN("OCRBeamSearch_CNN_model_data.xml.gz"); 

    double t_r = (double)getTickCount(); 
    vector<int> out_classes; 
    vector<double> out_confidences; 

    ocr->eval(image, out_classes, out_confidences); 

    cout << "OCR output = \"" << vocabulary[out_classes[0]] << "\" with confidence " 
     << out_confidences[0] << ". Evaluated in " 
     << ((double)getTickCount() - t_r)*1000/getTickFrequency() << " ms." << endl << endl; 

    return 0; 
} 
1

당신은 이미지를 다시 샘플링 할 수 있습니다, 그 많이 빠르게 확장하고 매우 빠른 절차 다음의에, 해상도가 요청 될 때까지 그는 픽셀의 세트에 각 픽셀 매핑, OpenCV의에서 은 당신이 할 수있는 크기 조정 기능과 INTER_AREA 플래그 : http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html

,

또 다른 해결책은 더 큰 빈 이미지에 이미지를 복사하고 더 큰 이미지에서 감지를 실행하는 것입니다.

관련 문제