Search in sources :

Example 1 with Face

use of android.hardware.Camera.Face in project platform_frameworks_base by android.

the class FaceSquareFilterTest method testFaceSquareFilter.

public void testFaceSquareFilter() throws Exception {
    final int INPUT_WIDTH = 1536;
    final int INPUT_HEIGHT = 2048;
    FrameImage2D image = createFrame(FrameType.image2D(FrameType.ELEMENT_RGBA8888, FrameType.READ_CPU), new int[] { INPUT_WIDTH, INPUT_HEIGHT }).asFrameImage2D();
    FrameValues facesFrame = createFrame(FrameType.array(Camera.Face.class), new int[] { 1, 1 }).asFrameValues();
    Bitmap bitmap = BitmapFactory.decodeStream(assetMgr.open("XZZ019.jpg"));
    image.setBitmap(bitmap);
    injectInputFrame("image", image);
    Face face = new Face();
    Rect faceRect = new Rect();
    // These are the values for image 141 with 1 face
    faceRect.set(-533, -453, 369, 224);
    face.rect = faceRect;
    Face[] faces = new Face[1];
    faces[0] = face;
    facesFrame.setValue(faces);
    injectInputFrame("faces", facesFrame);
    process();
    // ensure the output image has the rectangle in the right place
    FrameImage2D outputImage = getOutputFrame("image").asFrameImage2D();
    int[] pixels = new int[bitmap.getByteCount()];
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    final int FACE_X_RANGE = 2000;
    final int WIDTH_OFFSET = 1000;
    final int HEIGHT_OFFSET = 1000;
    int top = (faceRect.top + HEIGHT_OFFSET) * bitmap.getHeight() / FACE_X_RANGE;
    int bottom = (faceRect.bottom + HEIGHT_OFFSET) * bitmap.getHeight() / FACE_X_RANGE;
    int left = (faceRect.left + WIDTH_OFFSET) * bitmap.getWidth() / FACE_X_RANGE;
    int right = (faceRect.right + WIDTH_OFFSET) * bitmap.getWidth() / FACE_X_RANGE;
    if (top < 0) {
        top = 0;
    } else if (top > bitmap.getHeight()) {
        top = bitmap.getHeight();
    }
    if (left < 0) {
        left = 0;
    } else if (left > bitmap.getWidth()) {
        left = bitmap.getWidth();
    }
    if (bottom > bitmap.getHeight()) {
        bottom = bitmap.getHeight();
    } else if (bottom < 0) {
        bottom = 0;
    }
    if (right > bitmap.getWidth()) {
        right = bitmap.getWidth();
    } else if (right < 0) {
        right = 0;
    }
    for (int j = 0; j < (bottom - top); j++) {
        // Left edge
        if (left > 0 && top > 0) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
        // Right edge
        if (right > 0 && top > 0) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
    }
    for (int k = 0; k < (right - left); k++) {
        // Top edge
        if (top < bitmap.getHeight()) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
        // Bottom edge
        if (bottom < bitmap.getHeight()) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
    }
    Bitmap outputBitmap = outputImage.toBitmap();
    int[] outputPixels = new int[outputBitmap.getByteCount()];
    outputBitmap.getPixels(outputPixels, 0, outputBitmap.getWidth(), 0, 0, outputBitmap.getWidth(), outputBitmap.getHeight());
    int equalCount = 0;
    for (int i = 0; i < outputBitmap.getByteCount(); i++) {
        if (pixels[i] == outputPixels[i])
            equalCount++;
    }
    if (equalCount + (0.05f * outputBitmap.getByteCount()) < outputBitmap.getByteCount()) {
        // Assertion will fail if condition is true
        assertEquals(equalCount, outputBitmap.getByteCount());
    }
}
Also used : Bitmap(android.graphics.Bitmap) Rect(android.graphics.Rect) FrameValues(androidx.media.filterfw.FrameValues) FrameImage2D(androidx.media.filterfw.FrameImage2D) Camera(android.hardware.Camera) Face(android.hardware.Camera.Face)

Example 2 with Face

use of android.hardware.Camera.Face in project platform_frameworks_base by android.

the class FaceSquareFilter method onProcess.

/**
     * @see androidx.media.filterfw.Filter#onProcess()
     */
@Override
protected void onProcess() {
    // Get inputs
    FrameImage2D imageFrame = getConnectedInputPort("image").pullFrame().asFrameImage2D();
    FrameValues facesFrame = getConnectedInputPort("faces").pullFrame().asFrameValues();
    Face[] faces = (Face[]) facesFrame.getValues();
    int[] dims = imageFrame.getDimensions();
    ByteBuffer buffer = imageFrame.lockBytes(Frame.MODE_WRITE);
    byte[] pixels = buffer.array();
    // For every face in faces, draw a white rect around the
    // face following the rect member of the Face
    drawBoxes(pixels, faces, dims);
    imageFrame.unlock();
    OutputPort outPort = getConnectedOutputPort("image");
    outPort.pushFrame(imageFrame);
}
Also used : OutputPort(androidx.media.filterfw.OutputPort) FrameValues(androidx.media.filterfw.FrameValues) FrameImage2D(androidx.media.filterfw.FrameImage2D) Face(android.hardware.Camera.Face) ByteBuffer(java.nio.ByteBuffer)

Example 3 with Face

use of android.hardware.Camera.Face in project android_frameworks_base by ResurrectionRemix.

the class FaceSquareFilterTest method testFaceSquareFilter.

public void testFaceSquareFilter() throws Exception {
    final int INPUT_WIDTH = 1536;
    final int INPUT_HEIGHT = 2048;
    FrameImage2D image = createFrame(FrameType.image2D(FrameType.ELEMENT_RGBA8888, FrameType.READ_CPU), new int[] { INPUT_WIDTH, INPUT_HEIGHT }).asFrameImage2D();
    FrameValues facesFrame = createFrame(FrameType.array(Camera.Face.class), new int[] { 1, 1 }).asFrameValues();
    Bitmap bitmap = BitmapFactory.decodeStream(assetMgr.open("XZZ019.jpg"));
    image.setBitmap(bitmap);
    injectInputFrame("image", image);
    Face face = new Face();
    Rect faceRect = new Rect();
    // These are the values for image 141 with 1 face
    faceRect.set(-533, -453, 369, 224);
    face.rect = faceRect;
    Face[] faces = new Face[1];
    faces[0] = face;
    facesFrame.setValue(faces);
    injectInputFrame("faces", facesFrame);
    process();
    // ensure the output image has the rectangle in the right place
    FrameImage2D outputImage = getOutputFrame("image").asFrameImage2D();
    int[] pixels = new int[bitmap.getByteCount()];
    bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    final int FACE_X_RANGE = 2000;
    final int WIDTH_OFFSET = 1000;
    final int HEIGHT_OFFSET = 1000;
    int top = (faceRect.top + HEIGHT_OFFSET) * bitmap.getHeight() / FACE_X_RANGE;
    int bottom = (faceRect.bottom + HEIGHT_OFFSET) * bitmap.getHeight() / FACE_X_RANGE;
    int left = (faceRect.left + WIDTH_OFFSET) * bitmap.getWidth() / FACE_X_RANGE;
    int right = (faceRect.right + WIDTH_OFFSET) * bitmap.getWidth() / FACE_X_RANGE;
    if (top < 0) {
        top = 0;
    } else if (top > bitmap.getHeight()) {
        top = bitmap.getHeight();
    }
    if (left < 0) {
        left = 0;
    } else if (left > bitmap.getWidth()) {
        left = bitmap.getWidth();
    }
    if (bottom > bitmap.getHeight()) {
        bottom = bitmap.getHeight();
    } else if (bottom < 0) {
        bottom = 0;
    }
    if (right > bitmap.getWidth()) {
        right = bitmap.getWidth();
    } else if (right < 0) {
        right = 0;
    }
    for (int j = 0; j < (bottom - top); j++) {
        // Left edge
        if (left > 0 && top > 0) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + left) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
        // Right edge
        if (right > 0 && top > 0) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * (top + j) + right) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
    }
    for (int k = 0; k < (right - left); k++) {
        // Top edge
        if (top < bitmap.getHeight()) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * top + left + k) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
        // Bottom edge
        if (bottom < bitmap.getHeight()) {
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) + ImageConstants.RED_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) + ImageConstants.GREEN_OFFSET] = (byte) ImageConstants.MAX_BYTE;
            pixels[ImageConstants.PIX_CHANNELS * (bitmap.getWidth() * bottom + left + k) + ImageConstants.BLUE_OFFSET] = (byte) ImageConstants.MAX_BYTE;
        }
    }
    Bitmap outputBitmap = outputImage.toBitmap();
    int[] outputPixels = new int[outputBitmap.getByteCount()];
    outputBitmap.getPixels(outputPixels, 0, outputBitmap.getWidth(), 0, 0, outputBitmap.getWidth(), outputBitmap.getHeight());
    int equalCount = 0;
    for (int i = 0; i < outputBitmap.getByteCount(); i++) {
        if (pixels[i] == outputPixels[i])
            equalCount++;
    }
    if (equalCount + (0.05f * outputBitmap.getByteCount()) < outputBitmap.getByteCount()) {
        // Assertion will fail if condition is true
        assertEquals(equalCount, outputBitmap.getByteCount());
    }
}
Also used : Bitmap(android.graphics.Bitmap) Rect(android.graphics.Rect) FrameValues(androidx.media.filterfw.FrameValues) FrameImage2D(androidx.media.filterfw.FrameImage2D) Camera(android.hardware.Camera) Face(android.hardware.Camera.Face)

Example 4 with Face

use of android.hardware.Camera.Face in project android_frameworks_base by crdroidandroid.

the class FaceSquareFilter method onProcess.

/**
     * @see androidx.media.filterfw.Filter#onProcess()
     */
@Override
protected void onProcess() {
    // Get inputs
    FrameImage2D imageFrame = getConnectedInputPort("image").pullFrame().asFrameImage2D();
    FrameValues facesFrame = getConnectedInputPort("faces").pullFrame().asFrameValues();
    Face[] faces = (Face[]) facesFrame.getValues();
    int[] dims = imageFrame.getDimensions();
    ByteBuffer buffer = imageFrame.lockBytes(Frame.MODE_WRITE);
    byte[] pixels = buffer.array();
    // For every face in faces, draw a white rect around the
    // face following the rect member of the Face
    drawBoxes(pixels, faces, dims);
    imageFrame.unlock();
    OutputPort outPort = getConnectedOutputPort("image");
    outPort.pushFrame(imageFrame);
}
Also used : OutputPort(androidx.media.filterfw.OutputPort) FrameValues(androidx.media.filterfw.FrameValues) FrameImage2D(androidx.media.filterfw.FrameImage2D) Face(android.hardware.Camera.Face) ByteBuffer(java.nio.ByteBuffer)

Example 5 with Face

use of android.hardware.Camera.Face in project android_packages_apps_Camera by CyanogenMod.

the class PhotoModule method startFaceDetection.

@TargetApi(ApiHelper.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void startFaceDetection() {
    if (!ApiHelper.HAS_FACE_DETECTION)
        return;
    // Workaround for a buggy camera library
    if (Util.noFaceDetectOnFrontCamera() && (CameraHolder.instance().getCameraInfo()[mCameraId].facing == CameraInfo.CAMERA_FACING_FRONT)) {
        return;
    }
    if (mFaceDetectionStarted || mCameraState != IDLE)
        return;
    if (mParameters.getMaxNumDetectedFaces() > 0) {
        mFaceDetectionStarted = true;
        mFaceView.clear();
        mFaceView.setVisibility(View.VISIBLE);
        mFaceView.setDisplayOrientation(mDisplayOrientation);
        CameraInfo info = CameraHolder.instance().getCameraInfo()[mCameraId];
        mFaceView.setMirror(info.facing == CameraInfo.CAMERA_FACING_FRONT);
        mFaceView.resume();
        mFocusManager.setFaceView(mFaceView);
        mCameraDevice.setFaceDetectionListener(new FaceDetectionListener() {

            @Override
            public void onFaceDetection(Face[] faces, android.hardware.Camera camera) {
                mFaceView.setFaces(faces);
            }
        });
        mCameraDevice.startFaceDetection();
    }
}
Also used : FaceDetectionListener(android.hardware.Camera.FaceDetectionListener) Face(android.hardware.Camera.Face) CameraInfo(android.hardware.Camera.CameraInfo) TargetApi(android.annotation.TargetApi)

Aggregations

Face (android.hardware.Camera.Face)9 FrameImage2D (androidx.media.filterfw.FrameImage2D)8 FrameValues (androidx.media.filterfw.FrameValues)8 Bitmap (android.graphics.Bitmap)4 Rect (android.graphics.Rect)4 Camera (android.hardware.Camera)4 OutputPort (androidx.media.filterfw.OutputPort)4 ByteBuffer (java.nio.ByteBuffer)4 TargetApi (android.annotation.TargetApi)1 CameraInfo (android.hardware.Camera.CameraInfo)1 FaceDetectionListener (android.hardware.Camera.FaceDetectionListener)1