| /* |
| * Copyright 2013 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package androidx.media.filterfw.samples.simplecamera; |
| |
| |
| import android.content.res.AssetManager; |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.net.Uri; |
| import android.provider.MediaStore; |
| |
| import androidx.media.filterfw.Filter; |
| import androidx.media.filterfw.FrameImage2D; |
| import androidx.media.filterfw.FrameType; |
| import androidx.media.filterfw.FrameValues; |
| import androidx.media.filterfw.MffContext; |
| import androidx.media.filterfw.MffFilterTestCase; |
| |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.util.concurrent.ExecutionException; |
| import java.util.concurrent.TimeoutException; |
| |
| import android.hardware.Camera; |
| import android.hardware.Camera.Face; |
| import android.graphics.Rect; |
| |
| |
| public class FaceSquareFilterTest extends MffFilterTestCase { |
| |
| private AssetManager assetMgr = null; |
| @Override |
| protected Filter createFilter(MffContext mffContext) { |
| assetMgr = mffContext.getApplicationContext().getAssets(); |
| return new FaceSquareFilter(mffContext, "faceSquareFilter"); |
| } |
| |
| 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()); |
| } |
| } |
| } |