Search in sources :

Example 16 with FrameValues

use of androidx.media.filterfw.FrameValues in project android_frameworks_base by crdroidandroid.

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)

Aggregations

FrameValues (androidx.media.filterfw.FrameValues)16 OutputPort (androidx.media.filterfw.OutputPort)12 Face (android.hardware.Camera.Face)8 FrameImage2D (androidx.media.filterfw.FrameImage2D)8 Bitmap (android.graphics.Bitmap)4 Rect (android.graphics.Rect)4 Camera (android.hardware.Camera)4 FrameValue (androidx.media.filterfw.FrameValue)4 ByteBuffer (java.nio.ByteBuffer)4