2016-04-04 8 views
6

मैं Google Apps स्कैनर को एक ऐप पर काम करने के लिए कार्यान्वित करने की कोशिश कर रहा हूं। डिफ़ॉल्ट रूप से इसकी पूरी स्क्रीन गतिविधि और बारकोड पूरी स्क्रीन पर ट्रैक किए जाते हैं।एंड्रॉइड विजन - बार कोड ट्रैकिंग विंडो घटाएं

हालांकि, मुझे एक पूर्णस्क्रीन कैमरा चाहिए लेकिन सीमित स्कैनिंग विंडो के साथ। उदाहरण के लिए, कैमरे के लिए सतह दृश्य पूर्णस्क्रीन होने की आवश्यकता है, इसमें 2 पारदर्शी ओवरले हैं जो स्क्रीन ऊंचाई के 35% पर सेट हैं और नीचे केंद्र में 30% व्यूपोर्ट छोड़ते हैं।

मैंने ग्राफिक ओवरले बदल दिया है, इसलिए यह केवल मध्य व्यूपोर्ट में प्रदर्शित होगा, लेकिन उसी क्षेत्र में बारकोड ट्रैकर को सीमित करने के तरीके को कैसे काम करने में सक्षम है।

कोई विचार?

+0

क्या आप कृपया अपना कोड साझा कर सकते हैं कि आप अपने पारदर्शी ओवरले का उपयोग कैसे करते हैं? क्या आप एक आयताकार वर्ग प्रदर्शित करते हैं? यदि हां, तो आप यह कैसे करते हैं ... मैं इसे समझने के लिए दीवार के खिलाफ अपने सिर को टक्कर लगी हूं ... अगर आप इससे मेरी मदद कर सकते हैं तो मैं बहुत सराहना करता हूं। – Vincy

उत्तर

3

वर्तमान API स्कैन क्षेत्र को सीमित करने का कोई तरीका प्रदान नहीं करता है। हालांकि, आप या तो डिटेक्टर से बाहर आने वाले परिणामों को फ़िल्टर कर सकते हैं या डिटेक्टर में पारित छवि को फसल कर सकते हैं।

फ़िल्टर परिणाम दृष्टिकोण

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

public class CentralBarcodeFocusingProcessor extends FocusingProcessor<Barcode> { 

    public CentralBarcodeFocusingProcessor(Detector<Barcode> detector, Tracker<Barcode> tracker) { 
    super(detector, tracker); 
    } 

    @Override 
    public int selectFocus(Detections<Barcode> detections) { 
    SparseArray<Barcode> barcodes = detections.getDetectedItems(); 
    for (int i = 0; i < barcodes.size(); ++i) { 
     int id = barcodes.keyAt(i); 
     if (/* barcode in central region */) { 
     return id; 
     } 
    } 
    return -1; 
    } 
} 

फिर आप इस तरह डिटेक्टर के साथ इस प्रोसेसर सहयोगी चाहते हैं:

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context).build(); 
    barcodeDetector.setProcessor(
       new CentralBarcodeFocusingProcessor(myTracker)); 

फसल छवियाँ दृष्टिकोण

आप छवि अपने आप को काटने के लिए पहली आवश्यकता होगी, डिटेक्टर को बुलाए जाने से पहले। यह डिटेक्टर सबक्लास को कार्यान्वित करके किया जा सकता है जो बारकोड डिटेक्टर को लपेटता है, प्राप्त छवियों को फसल करता है, और फसल वाली छवियों के साथ बारकोड स्कैनर को कॉल करता है।

उदाहरण के लिए, आप रोकना और इस तरह चित्र काटने के लिए एक डिटेक्टर बनाने चाहते हैं:

class MyDetector extends Detector<Barcode> { 
    private Detector<Barcode> mDelegate; 

    MyDetector(Detector<Barcode> delegate) { 
    mDelegate = delegate; 
    } 

    public SparseArray<Barcode> detect(Frame frame) { 
    // *** crop the frame here 
    return mDelegate.detect(croppedFrame); 
    } 

    public boolean isOperational() { 
    return mDelegate.isOperational(); 
    } 

    public boolean setFocus(int id) { 
    return mDelegate.setFocus(id); 
    } 
} 

आप इस एक के साथ बारकोड डिटेक्टर लपेट चाहते हैं, कैमरा स्रोत और बारकोड के बीच में डालने डिटेक्टर:

BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(context) 
     .build(); 
MyDetector myDetector = new MyDetector(barcodeDetector); 

myDetector.setProcessor(/* include your processor here */); 

mCameraSource = new CameraSource.Builder(context, myDetector) 
     .build(); 
+0

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

+0

मैंने ऊपर एक वैकल्पिक दृष्टिकोण जोड़ा, जहां आप छवि के केंद्रीय क्षेत्र में नहीं होने वाले पहचान परिणामों को फ़िल्टर कर सकते हैं। छवि को फसल करने से यह आसान है, हालांकि यह अभी भी पूरी छवि को स्कैन करेगा। – pm0733464

+2

आप कैसे निर्धारित करते हैं कि बारकोड सेंट्रल फोकसिंग प्रोसेसर के अंदर से कहां है? – JPM

1

कैसे बारकोड कि पूर्वावलोकन के केंद्र के सबसे नजदीक है पाने के लिए का एक उदाहरण के साथ @ pm0733464 के जवाब के आधार पर।

public class CentralBarcodeFocusingProcessor extends FocusingProcessor<Barcode> { 

    public CentralBarcodeFocusingProcessor(Detector<Barcode> detector, Tracker<Barcode> tracker) { 
     super(detector, tracker); 
    } 

    @Override 
    public int selectFocus(Detector.Detections<Barcode> detections) { 

     SparseArray<Barcode> barcodes = detections.getDetectedItems(); 
     Frame.Metadata meta = detections.getFrameMetadata(); 
     double nearestDistance = Double.MAX_VALUE; 
     int id = -1; 

     for (int i = 0; i < barcodes.size(); ++i) { 
      int tempId = barcodes.keyAt(i); 
      Barcode barcode = barcodes.get(tempId); 
      float dx = Math.abs((meta.getWidth()/2) - barcode.getBoundingBox().centerX()); 
      float dy = Math.abs((meta.getHeight()/2) - barcode.getBoundingBox().centerY()); 

      double distanceFromCenter = Math.sqrt((dx * dx) + (dy * dy)); 

      if (distanceFromCenter < nearestDistance) { 
       id = tempId; 
       nearestDistance = distanceFromCenter; 
      } 
     } 
     return id; 
    } 
} 
संबंधित मुद्दे