2012-10-03 13 views
5

मैं रीयल-टाइम ओसीआर का उपयोग कर एंड्रॉइड एप्लिकेशन पर काम कर रहा हूं। मैं ओपनसीवी और टेसेरैक्ट लाइब्रेरी का उपयोग कर रहा हूं। लेकिन प्रदर्शन मेरे गैलेक्सी एसआईआईआई पर भी बहुत खराब है। प्रदर्शन में सुधार करने के लिए कोई तरीका हैं?Android पर ओपनसीवी के साथ टेस्सेरैक्ट प्रदर्शन में सुधार

Mat mGray = new Mat(); 
capture.retrieve(mGray); 
Bitmap bmp = Bitmap.createBitmap(mGray.cols(), mGray.rows(), Bitmap.Config.ARGB_8888); 
tessBaseApi.setImage(bmp); 
String recognizedText = tessBaseApi.getUTF8Text(); 
Log.i("Reg", recognizedText); 

Tesseract ओसीआर की गति Tesseract एपीआई के बिटमैप पास करके कम किया जाएगा: यह मेरा कोड है? टेस्सेक्ट एपीआई में जाने से पहले मुझे पूर्व प्रसंस्करण करना चाहिए?

+0

क्या आप गति या पहचान सटीकता के बारे में बात कर रहे हैं? – rmtheis

+1

मैं गति ले रहा हूं, यह बहुत धीमी है। –

+0

अरे @QuiLlHoN क्या आपको इतने धीमी प्रदर्शन के लिए कोई समाधान मिला? मुझे एक ही समस्या का सामना करना पड़ रहा है:/ – Vucko

उत्तर

0

कुछ बातें कर सकता है कि यह तेजी से कर रहे हैं:

  • mGray से एक छोटे क्षेत्र में, जहां अपने पाठ createBitmap से पहले, है का चयन करें - तो अधिक भारी तरीकों कि एक छोटी छवि प्रक्रिया का पालन करें।
  • Bitmap.Config.RGB_565 को बदलने Bitmap.Config.ARGB_8888 - अपनी छवि ग्रेस्केल है, यह एक ARGB बिटमैप जरूरत नहीं होगी।
+0

टेसबेसैपी केवल ARGB_8888 छवि स्वीकार करता है। टेक्स्ट क्षेत्र खोजने के लिए कोई एल्गोरिदम हैं? धन्यवाद। –

1

आप Tesseract हो सकता है केवल, मान्यता पास 1 करना इतना है कि यह छोड़ देता है तो गुजरता 2 से 9 तक, जब यह recog_all_words() कहता है।

बदलें baseapi.cpp में निम्न पंक्ति और अपने Tesseract पुस्तकालय परियोजना के पुनर्निर्माण:

if (tesseract_->recog_all_words(page_res_, monitor, NULL, NULL, 0)) { 

करने के लिए इसे बदलें: प्रयास करने के लिए

if (tesseract_->recog_all_words(page_res_, monitor, NULL, NULL, 1)) { 
+0

मैंने कोड संपादित किया और लाइब्रेरी का पुनर्निर्माण किया। लेकिन गति अभी भी बहुत धीमी है। –

2

एक बात अनुकूली थ्रेशोल्डिंग का उपयोग कर छवि binarize है (adaptiveThreshold ओपनसीवी में)।

+1

टेसेरैक्ट पहले से ही यह आंतरिक रूप से प्रदर्शन करता है। यह ओत्सु की थ्रेसहोल्डिंग का उपयोग करता है। https://code.google.com/p/tesseract-ocr/source/browse/ccstruct/otsuthr.cpp – Raghav

+0

ओत्सु की विधि एक वैश्विक दहलीज का उपयोग करती है। प्रकाश व्यवस्था पूरी तरह से वर्दी नहीं होने पर यह अनुकूलक थ्रेसहोल्डिंग के साथ-साथ अनुकूल नहीं है (उदाहरण के लिए http://docs.opencv.org/trunk/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html#adaptive- थ्रेसहोल्डिंग देखें) – ojs

+0

वास्तव में ओत्सु महान काम नहीं करता है, लेकिन यह अभी भी बहुत तेज़ है। इसलिए जब यह परिशुद्धता के मुद्दों को हल कर सकता है, यह प्रदर्शन को बहुत प्रभावित नहीं करता है। –

0

बहु सूत्रण का प्रयोग करें, लेकिन TessBaseAPI के लिए धागा प्रति एक उदाहरण बनाने के लिए बारे में पता होना। उन्हें विभिन्न धागे के बीच साझा न करें। एन धागे (एन> = कोर की संख्या) बनाएं, और जावा सुनिश्चित करेगा कि आप कम से कम कोर बार की संख्या बढ़ाएं।

मुझे क्या करना एन धागे जो उनके स्वयं के संदर्भ में TessBaseAPI वस्तुओं को बनाने के (रन विधि में) और जब तक बाधित एक पाश में ओसीआर अनुरोध के लिए प्रतीक्षा पैदा कर रही है।

... 
    ... 
    @Override 
    public void run() { 

     TessBaseAPI tessBaseApi = new TessBaseAPI(); 

     tessBaseApi.init(Ocrrrer.DATA_PATH, "eng"); 

     setTessVariable(tessBaseApi, "load_system_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_freq_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_unambig_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_punc_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_number_dawg", "0"); 
     setTessVariable(tessBaseApi, "load_fixed_length_dawgs", "0"); 
     setTessVariable(tessBaseApi, "load_bigram_dawg", "0"); 
     setTessVariable(tessBaseApi, "wordrec_enable_assoc", "0"); 
     setTessVariable(tessBaseApi, "tessedit_enable_bigram_correction", "0"); 
     setTessVariable(tessBaseApi, "assume_fixed_pitch_char_segment", "1"); 
     setTessVariable(tessBaseApi, TessBaseAPI.VAR_CHAR_WHITELIST, "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ<"); 

     Log.d(TAG, "Training file loaded"); 


     while (!interrupted()) { 
     reentrantLock.lock(); 
     try { 
      Log.d(TAG, this.getName() + " wait for OCR"); 
      jobToDo.await(); 
      Log.d(TAG, this.getName() + " input arrived. Do OCR"); 
      this.ocrResult = doOcr(tessBaseApi); 
      ocrDone.signalAll(); 
     } catch (InterruptedException e) { 
      return; 
     } finally { 
      try { 
      reentrantLock.unlock(); 
      } catch (Exception ex) { 
      } 
     } 
     } 

    } 
    ... 
    ... 

आप देख सकते हैं कि tessBaseApi वस्तु रन विधि करने के लिए स्थानीय है, इसलिए पूरी तरह से साझा नहीं किया।

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