[英]Crop Detected Face in Android
我需要的:
從Image中裁剪出唯一精確的面部。
我做了什么:
https://github.com/blundell/FaceDetectionTutorialWithPreview
用這種方式或用
https://github.com/googlesamples/android-vision
兩種方式我都得到了面部檢測。 但是我無法裁剪檢測到的臉部。
我試過了
Matrix matrix = new Matrix();
RectF sourceRect = null , destRect = null;
for (Camera.Face f : mFaces) {
// Draws a circle at the position of the detected face, with the face's track id below.
float x = translateX(f.rect.centerX() + f.rect.width() / 2);
float y = translateY(f.rect.centerY() + f.rect.height() / 2);
//canvas.drawCircle(x, y, FACE_POSITION_RADIUS, mFacePositionPaint);
// canvas.drawText("id: " + mFaceId, x + ID_X_OFFSET, y + ID_Y_OFFSET, mIdPaint);
// canvas.drawText("happiness: " + String.format("%.2f", face.getIsSmilingProbability()), x - ID_X_OFFSET, y - ID_Y_OFFSET, mIdPaint);
// canvas.drawText("right eye: " + String.format("%.2f", face.getIsRightEyeOpenProbability()), x + ID_X_OFFSET * 2, y + ID_Y_OFFSET * 2, mIdPaint);
//canvas.drawText("left eye: " + String.format("%.2f", face.getIsLeftEyeOpenProbability()), x - ID_X_OFFSET*2, y - ID_Y_OFFSET*2, mIdPaint);
// Draws a bounding box around the face.
float xOffset = scaleX(f.rect.width() / 2.0f);
float yOffset = scaleY(f.rect.height() / 2.0f);
float left = x - xOffset;
float top = y - yOffset;
float right = x + xOffset;
float bottom = y + yOffset;
sourceRect = new RectF(0, 0, source.getWidth(), source.getHeight());
destRect = new RectF(left, top, right, bottom);
Log.v("Margins: ","top: "+top+"\n"+"left: "+left+"\n"+"right: "+right+"\n"+"bottom: "+bottom+"\n");
}
matrix.setRectToRect(sourceRect, destRect, Matrix.ScaleToFit.CENTER);
matrix.postRotate(angle);
return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(),
matrix, true);
相同的代碼用於繪制畫布,但裁剪不起作用。
您可以使用Bitmap.createBitmap()
方法裁剪圖像。 您可以指定所需的矩形(開始X,開始Y,寬度,高度),而不是傳遞整個圖像(0,0,寬度,高度)。
嗨大家好,感謝您的時間。 我使用opencv成功地從源位圖中裁剪出圖像。
鏈接我遵循OpenCv代碼
代碼保存裁剪的面部。
if ((facesArray.length>0) && (faceState==SEARCHING))
{
Mat m=new Mat();
m=mGray.submat(facesArray[0]);
mBitmap = Bitmap.createBitmap(m.width(),m.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(m, mBitmap);
Message msg = new Message();
String textTochange = "IMG";
msg.obj = textTochange;
//mHandler.sendMessage(msg);
textTochange = fr.predict(m);
mLikely=fr.getProb();
msg = new Message();
msg.obj = textTochange;
mHandler.sendMessage(msg);
//for saving added below code
bmpToSave = Bitmap.createBitmap(m.width(), m.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(m,bmpToSave);
bmpToSave= Bitmap.createScaledBitmap(bmpToSave, 128, 128, false);
File pictureFile = getOutputMediaFile();
Log.v("path: ", "" + pictureFile.getAbsolutePath());
Log.v("path: ", "" + pictureFile.getPath());
///storage/emulated/0/ABC/MI_04092018_1218.jpg
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
bmpToSave.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
} catch (FileNotFoundException e) {
Log.d("FD", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("FD", "Error accessing file: " + e.getMessage());
}
歸功於麻省理工學院
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.