2016-06-03 6 views
6

मेरे पास मानक com.google.android.gms.vision.Tracker example सफलतापूर्वक मेरे एंड्रॉइड डिवाइस पर चल रहा है और अब मुझे वर्तमान चेहरे की आईरिस खोजने के लिए छवि को पोस्ट प्रोसेस करने की आवश्यकता है जिसे घटना के तरीकों में अधिसूचित किया गया है ट्रैकर।ट्रैकर ईवेंट में एंड्रॉइड फेससेक्टर के लिए वर्तमान फ्रेम (बिटमैप के रूप में) कैसे प्राप्त करें?

तो, मैं बिटमैप फ्रेम कैसे प्राप्त करूं जो वास्तव में com.google.android.gms.vision.face से मेल खाता है। मुझे ट्रैकर घटनाओं में क्या मिला है? इसका यह भी अर्थ है कि अंतिम बिटमैप वेबकैम रिज़ॉल्यूशन से मेल खाना चाहिए, न कि स्क्रीन रिज़ॉल्यूशन।

एक बुरा वैकल्पिक समाधान लेने के लिए कॉल करना है मेरे कैमरे स्रोत पर हर कुछ एमएस चित्रित करें और फेसडेटक्टर का उपयोग करके इस तस्वीर को अलग से संसाधित करें। हालांकि यह काम करता है मुझे समस्या है कि वीडियो स्ट्रीम टेकपिक्चर के दौरान फ्रीज करता है और मुझे सिंगल बीएमपी फेसटेक्टर मेमोरी कचरे के बहुत सारे GC_FOR_ALLOC संदेश मिलते हैं।

+1

जो आप खोज रहे हैं वह 'FaceDetector.SparseArray पता लगाने (फ़्रेम var1)' पर उपलब्ध प्रतीत होता है। एक बार जब आप फ्रेम ऑब्जेक्ट पर पकड़ लेते हैं तो आपको बिटमैप() मिलता है जो बहुत ही आशाजनक लगता है। दुर्भाग्यवश वह वर्ग अंतिम है, जिसका अर्थ है कि प्रतिबिंब का उपयोग करके अवरोधन फ्रेम संभव होना चाहिए। – Fabio

+0

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

+0

हमारे पास फ्रेम तक पहुंच नहीं है, जब तक कि आप FaceDetector में सभी विधियों को लपेटें और पहचान विधि को रोकें (प्रतिबिंब स्पष्ट रूप से मदद नहीं करेगा क्योंकि यह अंतिम है)। फ्रेम सहेजें और गेटटर बनाएं, फिर इसे सही जगह पर अन्य स्थानों पर कॉल करें। – Fabio

उत्तर

2

आपको फेस ट्रैकर का अपना संस्करण बनाना होगा जो google.vision फेस डिटेक्टर का विस्तार करेगा। अपने MainActivity या FaceTrackerActivity में वर्ग (गूगल ट्रैकिंग नमूने में) निम्नलिखित के रूप में FaceDetector वर्ग के अपने संस्करण बनाने के लिए:

class MyFaceDetector extends Detector<Face> { 
    private Detector<Face> mDelegate; 

    MyFaceDetector(Detector<Face> delegate) { 
     mDelegate = delegate; 
    } 

    public SparseArray<Face> detect(Frame frame) { 
     YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, frame.getMetadata().getWidth(), frame.getMetadata().getHeight(), null); 
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 
     yuvImage.compressToJpeg(new Rect(0, 0, frame.getMetadata().getWidth(), frame.getMetadata().getHeight()), 100, byteArrayOutputStream); 
     byte[] jpegArray = byteArrayOutputStream.toByteArray(); 
     Bitmap TempBitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length); 

     //TempBitmap is a Bitmap version of a frame which is currently captured by your CameraSource in real-time 
     //So you can process this TempBitmap in your own purposes adding extra code here 

     return mDelegate.detect(frame); 
    } 

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

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

तो फिर तुम इस प्रकार अपने CreateCameraSource विधि को संशोधित करके CameraSource के साथ अपने स्वयं FaceDetector में शामिल होने के लिए है:

private void createCameraSource() { 

    Context context = getApplicationContext(); 

    // You can use your own settings for your detector 
    FaceDetector detector = new FaceDetector.Builder(context) 
      .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS) 
      .setProminentFaceOnly(true) 
      .build(); 

    // This is how you merge myFaceDetector and google.vision detector 
    MyFaceDetector myFaceDetector = new MyFaceDetector(detector); 

    // You can use your own processor 
    myFaceDetector.setProcessor(
      new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory()) 
        .build()); 

    if (!myFaceDetector.isOperational()) { 
     Log.w(TAG, "Face detector dependencies are not yet available."); 
    } 

    // You can use your own settings for CameraSource 
    mCameraSource = new CameraSource.Builder(context, myFaceDetector) 
      .setRequestedPreviewSize(640, 480) 
      .setFacing(CameraSource.CAMERA_FACING_FRONT) 
      .setRequestedFps(30.0f) 
      .build(); 
} 
संबंधित मुद्दे