2017-04-26 15 views
5

Tôi đang triển khai ví dụ được đưa ra trong google-vision face tracker. MyFaceDetector lớp:Cắt mặt từ CameraSource

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

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

    public SparseArray<Face> detect(Frame frame) { 
     return mDelegate.detect(frame); 
    } 

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

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

} 

FaceTrackerActivity lớp:

private void createCameraSource() { 

    imageView = (ImageView) findViewById(R.id.face); 

    FaceDetector faceDetector = new FaceDetector.Builder(this).build(); 
    myFaceDetector = new MyFaceDetector(faceDetector); 
    myFaceDetector.setProcessor(new MultiProcessor.Builder<>(new GraphicFaceTrackerFactory()) 
      .build()); 
    mCameraSource = new CameraSource.Builder(this, myFaceDetector) 
      .setRequestedPreviewSize(640, 480) 
      .setFacing(CameraSource.CAMERA_FACING_FRONT) 
      .setRequestedFps(60.0f) 
      .build(); 

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

tôi cần phải cắt mặt và cài đặt nó trên ImageView. Tôi không thể triển khai Frame tùy chỉnh của mình tại đây. frame.getBitmap() luôn trả về null trong detect(Frame frame). Làm thế nào để đạt được điều này?

+0

Look đây https://stackoverflow.com/questions/32299947/mobile-vision-api-concatenate-new-detector-object-to-continue-frame-processing/ 32314136 # 32314136 – George

Trả lời

2

frame.getBitmap() sẽ chỉ trả về giá trị nếu khung hình ban đầu được tạo từ bitmap. CameraSource cung cấp thông tin hình ảnh như ByteBuffers chứ không phải bitmap, vì vậy đó là thông tin hình ảnh có sẵn.

frame.getGrayscaleImageData() sẽ trả về dữ liệu hình ảnh.

frame.getMetadata() sẽ trả về siêu dữ liệu chẳng hạn như kích thước hình ảnh và định dạng hình ảnh.

+0

Bạn đã đúng! Tôi sẽ đăng đoạn mã dưới đây nếu có ai khác tìm kiếm một cái gì đó tương tự. – Andro

0

này đi trong CameraSource.java

Frame outputFrame = new Frame.Builder() 
    .setImageData(mPendingFrameData, mPreviewSize.getWidth(), 
        mPreviewSize.getHeight(), ImageFormat.NV21) 
    .setId(mPendingFrameId) 
    .setTimestampMillis(mPendingTimeMillis) 
    .setRotation(mRotation) 
    .build(); 

int w = outputFrame.getMetadata().getWidth(); 
int h = outputFrame.getMetadata().getHeight(); 
SparseArray<Face> detectedFaces = mDetector.detect(outputFrame); 
Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 

if (detectedFaces.size() > 0) { 
    ByteBuffer byteBufferRaw = outputFrame.getGrayscaleImageData(); 
    byte[] byteBuffer = byteBufferRaw.array(); 
    YuvImage yuvimage = new YuvImage(byteBuffer, ImageFormat.NV21, w, h, null); 

    Face face = detectedFaces.valueAt(0); 
    int left = (int) face.getPosition().x; 
    int top = (int) face.getPosition().y; 
    int right = (int) face.getWidth() + left; 
    int bottom = (int) face.getHeight() + top; 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    yuvimage.compressToJpeg(new Rect(left, top, right, bottom), 80, baos); 
    byte[] jpegArray = baos.toByteArray(); 
    bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length); 
} 
((FaceTrackerActivity) mContext).setBitmapToImageView(bitmap); 
Các vấn đề liên quan