【问题标题】:Crop face from the CameraSource从 CameraSource 裁剪人脸
【发布时间】:2017-04-26 11:21:34
【问题描述】:

我正在实现google-vision face tracker 中给出的示例。 MyFaceDetector类:

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类:

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.");
    }
}

我需要裁剪脸部并将其设置为ImageView。我无法在这里实现我的自定义Frame。 frame.getBitmap() 总是在 detect(Frame frame) 中返回 null。我如何做到这一点?

【问题讨论】:

标签: android android-camera android-vision


【解决方案1】:

frame.getBitmap() 只会在帧最初是从位图创建时返回一个值。 CameraSource 以 ByteBuffers 而不是位图的形式提供图像信息,因此这是可用的图像信息。

frame.getGrayscaleImageData() 将返回图像数据。

frame.getMetadata() 将返回图像尺寸和图像格式等元数据。

【讨论】:

  • 你是对的!如果其他人看起来类似,我将在下面发布代码。
  • 如果我想使用当前帧进行图像处理?
【解决方案2】:

这是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);

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 1970-01-01
    • 2013-02-09
    • 2018-05-08
    • 2012-10-25
    • 2016-07-03
    • 2015-06-17
    • 2019-08-27
    • 2011-04-27
    相关资源
    最近更新 更多