android - 谷歌移动视觉 api - 将面部裁剪为来自相机的位图
问题描述
我试图在将检测到的人脸转换为位图后从相机中裁剪它onPictureTaken
,但是在人脸区域上没有正确裁剪,如何从相机中裁剪人脸位图?
mCameraSource.takePicture(null, new CameraSource.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDensity = DisplayMetrics.DENSITY_DEFAULT;
opt.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
opt.inScaled = false;
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);
Bitmap croppedFace = Bitmap.createBitmap(bmp, (int) facePosition.x, (int) facePosition.y, (int) faceWidth, (int) faceHeight);
ivProfileImg.setImageBitmap(croppedFace);
}
});
其中 facePosition 来自Tracker
:
private class GraphicFaceTracker extends Tracker<Face> {
private GraphicOverlay mOverlay;
private FaceGraphic mFaceGraphic;
GraphicFaceTracker(GraphicOverlay overlay) {
mOverlay = overlay;
mFaceGraphic = new FaceGraphic(overlay);
}
@Override
public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) {
mOverlay.add(mFaceGraphic);
mFaceGraphic.updateFace(face);
//for cropping face
facePosition = face.getPosition();
faceWidth = face.getWidth();
faceHeight = face.getHeight();
}
}
更新:我设法通过反复试验来裁剪面部,添加代码以调整
bmp
为 1080 宽度,并facePosition
使用 1.5 缩放值,但我仍然不确定替换这些硬编码值的正确代码是什么:
mCameraSource.takePicture(null, new CameraSource.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes) {
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDensity = DisplayMetrics.DENSITY_DEFAULT;
opt.inTargetDensity = DisplayMetrics.DENSITY_DEFAULT;
opt.inScaled = false;
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, opt);//2976, 3968
//resized to 1080
int resizedHeight = 1080*bmp.getHeight()/bmp.getWidth();
bmp = Bitmap.createScaledBitmap(bmp,1080, resizedHeight, true);//1080, 1440
//scale facePosition values to x1.5
float scale = 1.5f;
int screenX = (int)facePosition.x * scale;
int screenY = (int)facePosition.y * scale;
float fw = faceWidth * scale;
float fh = faceHeight * scale;
Bitmap croppedFace = Bitmap.createBitmap(bmp, screenX, screenY, (int) fw, (int) fh);
ivProfileImg.setImageBitmap(croppedFace);
}
});
解决方案
推荐阅读
- python - 获取要删除的行的索引,其中两列为零
- ruby-on-rails - 是否可以将参数传递到模态窗口?需要模态来引用对象
- image - 如何在 Vich Uploader 中提交表单之前显示图像缩略图?
- spring - 模拟原型作用域bean
- shell - 用grep和wc同时过滤和统计结果
- django - Django模型到字段
- windows - 固定的 Windows Git Bash 任务栏图标不尊重 git-bash.exe 快捷方式启动目录
- c# - linq 异步调用以映射到一个对象 2 个具有外键的表
- java - 如何使用opencsv读取没有标题的csv文件?
- php - 当 filter_input 返回不正确的 cookie 值时