use of androidx.media.filterfw.FrameImage2D in project android_frameworks_base by crdroidandroid.
the class Camera2Source method onProcess.
@Override
protected void onProcess() {
Log.v(TAG, "on Process");
if (nextFrame()) {
OutputPort outPort = getConnectedOutputPort("video");
// Create a 2D frame that will hold the output
int[] dims = new int[] { mWidth, mHeight };
FrameImage2D outputFrame = Frame.create(mOutputType, dims).asFrameImage2D();
rgbConverter.forEach(mAllocationOut);
mAllocationOut.copyTo(mBitmap);
outputFrame.setBitmap(mBitmap);
outPort.pushFrame(outputFrame);
outputFrame.release();
OutputPort orientationPort = getConnectedOutputPort("orientation");
FrameValue orientationFrame = orientationPort.fetchAvailableFrame(null).asFrameValue();
// FIXME: Hardcoded value because ORIENTATION returns null, Qualcomm
// bug
Integer orientation = mProperties.get(CameraCharacteristics.SENSOR_ORIENTATION);
float temp;
if (orientation != null) {
temp = orientation.floatValue();
} else {
temp = 90.0f;
}
orientationFrame.setValue(temp);
orientationPort.pushFrame(orientationFrame);
}
}
use of androidx.media.filterfw.FrameImage2D in project android_frameworks_base by crdroidandroid.
the class IfElseFilter method onProcess.
@Override
protected void onProcess() {
OutputPort outPort = getConnectedOutputPort("output");
FrameImage2D trueFrame = getConnectedInputPort("trueResult").pullFrame().asFrameImage2D();
FrameImage2D falseFrame = getConnectedInputPort("falseResult").pullFrame().asFrameImage2D();
FrameValue boolFrameValue = getConnectedInputPort("condition").pullFrame().asFrameValue();
boolean condition = (Boolean) boolFrameValue.getValue();
FrameBuffer2D outputFrame;
// If the condition is true, then we want to use the camera, else use the gallery
if (condition) {
outputFrame = trueFrame;
} else {
outputFrame = falseFrame;
}
outPort.pushFrame(outputFrame);
}
use of androidx.media.filterfw.FrameImage2D in project android_frameworks_base by crdroidandroid.
the class ImageGoodnessFilter method onProcess.
/**
* @see androidx.media.filterfw.Filter#onProcess()
*/
@Override
protected void onProcess() {
FrameValue sharpnessFrameValue = getConnectedInputPort("sharpness").pullFrame().asFrameValue();
float sharpness = ((Float) sharpnessFrameValue.getValue()).floatValue();
FrameValue overExposureFrameValue = getConnectedInputPort("overExposure").pullFrame().asFrameValue();
float overExposure = ((Float) overExposureFrameValue.getValue()).floatValue();
FrameValue underExposureFrameValue = getConnectedInputPort("underExposure").pullFrame().asFrameValue();
float underExposure = ((Float) underExposureFrameValue.getValue()).floatValue();
FrameValue colorfulnessFrameValue = getConnectedInputPort("colorfulness").pullFrame().asFrameValue();
float colorfulness = ((Float) colorfulnessFrameValue.getValue()).floatValue();
FrameValue contrastRatingFrameValue = getConnectedInputPort("contrastRating").pullFrame().asFrameValue();
float contrastRating = ((Float) contrastRatingFrameValue.getValue()).floatValue();
FrameValue brightnessFrameValue = getConnectedInputPort("brightness").pullFrame().asFrameValue();
float brightness = ((Float) brightnessFrameValue.getValue()).floatValue();
FrameValue motionValuesFrameValue = getConnectedInputPort("motionValues").pullFrame().asFrameValue();
float[] motionValues = (float[]) motionValuesFrameValue.getValue();
float vectorAccel = (float) Math.sqrt(Math.pow(motionValues[0], 2) + Math.pow(motionValues[1], 2) + Math.pow(motionValues[2], 2));
String outStr;
FrameValue capturingFrameValue = getConnectedInputPort("capturing").pullFrame().asFrameValue();
boolean capturing = (Boolean) capturingFrameValue.getValue();
FrameImage2D inputImage = getConnectedInputPort("image").pullFrame().asFrameImage2D();
// TODO: get rid of magic numbers
float score = 0.0f;
score = computePictureScore(vectorAccel, sharpness, underExposure, overExposure, contrastRating, colorfulness, brightness);
if (scoreMean == 0)
scoreMean = score;
else
scoreMean = scoreMean * (1 - DECAY) + score * DECAY;
if (motionMean == 0)
motionMean = vectorAccel;
else
motionMean = motionMean * (1 - DECAY) + vectorAccel * DECAY;
float classifierScore = classifierComputeScore(vectorAccel, sharpness, underExposure, colorfulness, contrastRating, score);
// Log.v(TAG, "ClassifierScore:: " + classifierScore);
final float GREAT_SCORE = 3.5f;
final float GOOD_SCORE = 2.5f;
final float OK_SCORE = 1.5f;
final float BAD_SCORE = 0.5f;
if (score >= GREAT_SCORE) {
outStr = GREAT;
} else if (score >= GOOD_SCORE) {
outStr = GOOD;
} else if (score >= OK_SCORE) {
outStr = OK;
} else if (score >= BAD_SCORE) {
outStr = BAD;
} else {
outStr = AWFUL;
}
if (capturing) {
if (outStr.equals(GREAT)) {
// take a picture
Bitmap bitmap = inputImage.toBitmap();
new AsyncOperation().execute(bitmap);
final float RESET_FEATURES = 0.01f;
sharpnessMean = RESET_FEATURES;
underExposureMean = RESET_FEATURES;
overExposureMean = RESET_FEATURES;
contrastMean = RESET_FEATURES;
colorfulnessMean = RESET_FEATURES;
brightnessMean = RESET_FEATURES;
}
}
OutputPort outPort = getConnectedOutputPort("goodOrBadPic");
FrameValue stringFrame = outPort.fetchAvailableFrame(null).asFrameValue();
stringFrame.setValue(outStr);
outPort.pushFrame(stringFrame);
OutputPort scoreOutPort = getConnectedOutputPort("score");
FrameValue scoreFrame = scoreOutPort.fetchAvailableFrame(null).asFrameValue();
scoreFrame.setValue(score);
scoreOutPort.pushFrame(scoreFrame);
}
use of androidx.media.filterfw.FrameImage2D in project android_frameworks_base by crdroidandroid.
the class AvgBrightnessFilter method onProcess.
@Override
protected void onProcess() {
FrameImage2D inputImage = getConnectedInputPort("image").pullFrame().asFrameImage2D();
float brightness;
ByteBuffer inputBuffer = inputImage.lockBytes(Frame.MODE_READ);
brightness = brightnessOperator(inputImage.getWidth(), inputImage.getHeight(), inputBuffer);
inputImage.unlock();
if (mLogVerbose)
Log.v(TAG, "contrastRatio: " + brightness);
OutputPort brightnessPort = getConnectedOutputPort("brightnessRating");
FrameValue brightnessOutFrame = brightnessPort.fetchAvailableFrame(null).asFrameValue();
brightnessOutFrame.setValue(brightness);
brightnessPort.pushFrame(brightnessOutFrame);
}
use of androidx.media.filterfw.FrameImage2D 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());
}
}
Aggregations