2016-06-02 5 views
7

मैं जावा में ओपनसीवी 3 का उपयोग कर रहा हूं, मैं अन्य छवियों पर छोटी छवियों (जैसे 25x25 पिक्सेल) खोजने की कोशिश कर रहा हूं। लेकिन फीचरडिएक्टर डिटेक्शन (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 आकार मिल रहा है, और यह सुनिश्चित करें पता लगाने के काम नहीं कर रहा।

लेकिन अगर मैं 150x150 पिक्सल जैसी बड़ी छवियों पर यह कोशिश करता हूं जो ठीक काम कर रहा है। कोई सुझाव? धन्यवाद।

यहां मैं नमूने जोड़ रहा हूं। हम इस स्रोत छवि है: This is source image

और यह कहते हैं कि हम पी पत्र के लिए टेम्पलेट करते हैं, तो हम स्रोत छवि पर इस पी का पता लगाने की जरूरत है। This is template

अच्छी तरह से, उच्च रिज़ॉल्यूशन पर छवि स्केलिंग मेरे लिए काम नहीं करेगी। वह समय और संसाधन खो जाएगा। आदर्श रूप से यह रोटेशन-स्केल इनवेरिएंट होना चाहिए। लेकिन घूर्णन और पैमाने के बिना सरल समाधान भी ठीक है।

ओपनसीवी को छोड़कर अन्य समाधान मेरे लिए स्वीकार्य नहीं है। (उदाहरण के लिए टेसेरैक्ट का उपयोग कर)

+0

क्या आप कुछ इनपुट डेटा भी प्रदान कर सकते हैं जिस पर आप काम कर रहे हैं? – ZdaR

+0

मुझे लगता है कि सबसे अच्छा नमूना पाठ पहचान होगा, कल्पना करें कि आपके पास प्रत्येक अक्षर के आइकन हैं, जैसे 20x25 पिक्सल, इसलिए इन छवियों को अन्य छवियों से पहचानने का प्रयास करें। सादगी के लिए कहें कि फ़ॉन्ट परिवार और फ़ॉन्ट वजन नमूने के साथ समान है। – RustamIS

+0

हाँ, लेकिन अगर आप सीधे उस डेटा सेट को प्रदान कर सकते हैं जिस पर आप काम कर रहे हैं, तो हम समस्या को पुन: उत्पन्न करने में सक्षम होंगे। – ZdaR

उत्तर

1

ऐसा लगता है कि आप व्यक्तिगत आईडी गुणों को पढ़ने का प्रयास करते हैं। मूल रूप से छवियों की तैयारी कर रहा है, इसे सदिश बनाना (इसलिए इसका स्केल और रोटेशन इनवेरिएंट) और तुलना/मिलान करें। यह ओपनसीवी में किया जा सकता है।

  1. तैयारी: अक्सर आप रंग और चमक को कम करते हैं। यदि आपका पत्र प्रमुख है तो आप थ्रेसहोल्ड (चमक/रंग/percolorChannel) का उपयोग कर सकते हैं और उन रंगों को हटा सकते हैं। आप के लिए आप सबकुछ कम कर सकते हैं, लगभग काला नहीं बल्कि सफेद बनने के लिए। आप अतिरिक्त sharpening और यहां तक ​​कि किनारे का पता लगाने के साथ प्रयोग करना चाह सकते हैं।

  2. वेक्टरेशन बहुत सरल हो गया है और इसे और बेहतर किया जा सकता है क्योंकि आप जानते हैं कि आप केवल कुछ प्रतीकों में रूचि रखते हैं, आपको अतिरिक्त गुण मिलना चाहिए जो वेक्टरेशन के परिणाम में सुधार करने के लिए उपयोग कर सकते हैं (शोर को दबाकर, बेहतर चयन और सुधार कुछ किनारों/कोणों आदि)।

  3. मिलान करना काफी आगे होना चाहिए। चूंकि आप लक्ष्य फ़ॉन्ट और संभावित प्रतीकों को जानते हैं, इसलिए मिलान से बहुत ही कम सकारात्मक परिणाम बहुत पतले त्रुटि मार्जिन के साथ उत्पन्न हो सकते हैं। इसके अलावा अधिकांश त्रुटियों को आसानी से पहचानने योग्य होना चाहिए ताकि कुछ त्रुटियां मौजूद हों, आप सत्यापन के लिए किसी व्यक्ति को भेज सकते हैं।

संभावित सुधार:

  1. एक भग्न दृष्टिकोण का उपयोग कर स्केलिंग अक्सर पत्र के गुणों और संख्या संरक्षण है बहुत अच्छी तरह से और परिणाम की गुणवत्ता बढ़ा सकते हैं।

  2. आईडी के विभिन्न भाग का पता लगाने से आप पहचान के लक्षित क्षेत्र की पहचान करने में मदद करेंगे। यह आपको परिणामों को और बेहतर बनाने की अनुमति देता है। अक्सर लोग जो ध्यान केंद्रित करना चाहते हैं उस पर ध्यान केंद्रित करते हैं और अतिरिक्त अनियंत्रित जानकारी के बारे में भूल जाते हैं। लेकिन ये जानकारी आपको संभावित त्रुटि के बारे में एक विचार देती हैं जो आप पहचान में कर सकते हैं। इसलिए यदि आप सही नाम को पहचान नहीं सकते हैं तो संभव है कि आप आईडी पर भी असफल हो जाएं।इसलिए आईडी की सभी जानकारी प्राप्त करने का प्रयास करना एक अच्छा संकेतक है यदि तस्वीर की गुणवत्ता पर्याप्त जानकारी के बारे में निश्चित है जो आप वास्तव में देखभाल करते हैं।

  3. यदि आप जानते हैं कि आपका लक्षित क्षेत्र कैसा है, तो आप लक्ष्य क्षेत्र को एक निश्चित आकार में स्केल कर सकते हैं और प्रति पिक्सेल मिलान का उपयोग कर सकते हैं। चूंकि आप वास्तव में जिस फ़ॉन्ट का ख्याल रखते हैं उसे जानते हैं, इस तरह के एक पहचान में एक आश्चर्यजनक उच्च पहचान दर हो सकती है। प्रति पिक्सेल मिलान और वेक्टरनाइज़ेशन का उपयोग करने से आपको बेहतर पहचान दर मिल जाएगी। वेक्टरेशन की तुलना में प्रति पिक्सेल मिलान भी बहुत तेज़ है।

  4. चूंकि आप अपेक्षित प्रतीकों के स्थान और आकार को जानते हैं, इसलिए आप गुणों (प्रतीक के वास्तविक आकार, कुछ क्षेत्रों में काले रंग का वितरण आदि) के आधार पर निर्णय पेड़ बना सकते हैं। यह प्रश्न 35 में से एक से चार या उससे भी कम में से एक प्रश्न को नीचे लाएगा। पाठ मान्यता के लिए

1

Keypoint का पता लगाने का सबसे अच्छा समाधान है, क्योंकि आप कई विशेषताएं जो एक जैसे दिखते हैं मिल जाएगा और अगर टेम्पलेट्स बहुत छोटे होते हैं, फिसलने खिड़की पर्याप्त पता चला सुविधाओं उत्पन्न नहीं करेंगे नहीं है। link, एक उदाहरण here से लिया और कई अन्य लोगों के साथ here लगता है:

आप के लिए

लकी, OpenCV 3 योगदान भंडार में एक पाठ का पता लगाने/मान्यता मॉड्यूल शामिल

/* 
* 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

आप छवि resample कर सकते हैं, इसकी बहुत तो तेजी से स्केलिंग और पर बहुत तेजी से प्रक्रिया अपने पर, अपने बस पिक्सल का एक सेट करने के लिए प्रत्येक पिक्सेल तक संकल्प के रूप में अनुरोध किया गया है मानचित्रण, opencv में आप कर सकते हैं कि आकार बदलने समारोह और INTER_AREA ध्वज के साथ: http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html

एक और समाधान छवि को एक बड़ी खाली छवि में कॉपी करने और बड़े पर पहचान चलाने के लिए हो सकता है।

संबंधित मुद्दे