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());
}
}
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);
}
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());
}
}
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);
}
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();
}
}
Aggregations