android 获取视频流,摄像头旋转后,获取人脸坐标不准确,如何解决?

山城忙碌人 2018-05-31 09:48:15
一:问题描述
在做摄像头开发时,需要检测人脸,在人脸四周,画一个边框,当摄像头未做旋转时,不会有任何问题,当摄像头旋转90度(或270度),获取到的人脸坐标就不准确,代码如下:

PointF pointF = new PointF();
face.getMidPoint(pointF);

二:出现问题的图片



这是摄像头未作旋转时的流,我是手机横着测试的。




这是摄像头旋转90度是的流,我手机是竖着测试的

三:xml布局

<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal">
//摄像头流预览视图
<com.test.MyCameraPreview
android:id="@+id/cameraPreview"
android:layout_width="300dp"
android:layout_height="300dp">
</com.test.MyCameraPreview>

//画人脸边框的视图
<ImageView
android:id="@+id/drawImageView"
android:src="@drawable/xz_new"
android:layout_width="300dp"
android:layout_height="300dp"
android:scaleType="matrix"
android:visibility="visible" />
</RelativeLayout>


代码获取流宽度和高度是(640,480),已将摄像头预览视图,画人脸边框视图,宽高动态设置为(640,480),画人脸边框代码如下:

tempBitmap = Bitmap.createBitmap(640,480,
Bitmap.Config.ARGB_8888);
canvas = new Canvas(tempBitmap);

PointF pointF = new PointF();
face.getMidPoint(pointF);//得到人脸中心点坐标
float eyesDistance = face.eyesDistance();//两眼之前的距离
float index = eyesDistance*2;
int left =(int)(pointF.x-index);
int top = (int)((pointF.y- index));
int right=(int)((pointF.x+ index));
int bottom=(int)((pointF.y+ index));
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
canvas.drawRect(left,top,right,bottom,paint);
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(tempBitmap);
}
});

由于摄像头旋转90度,我偿试将画人脸边框的imageView,旋转90度,还是不行,代码如下:

imageView.setPivotX(imageView.getWidth()/2);
imageView.setPivotY(imageView.getHeight()/2);//支点在图片中心
imageView.setRotation(90);



请问各位大神,如何解决这个问题,如觉得问题未描述清楚,麻烦留言,感谢大家了。
...全文
1414 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
山城忙碌人 2018-06-20
  • 打赏
  • 举报
回复
引用 2 楼 qq_34066274 的回复:
因为横竖屏的坐标不一样,导致你人脸框不准确,你在横竖屏切换时做个判断,执行绘框方法(各角度),横竖屏坐标的区别给个传送门你https://blog.csdn.net/dcispuzzle/article/details/22605591

谢谢你的回复,我的处理方案是,将 画人脸边框的视图 宽高设置为预览视图旋转后宽高,这个问题就解决了,如果android设备是5.0以上,其它可以使用camera2,camera2人脸识别将这个问题处理的,可惜我开发设备是4.x,所以我将 画人脸边框的视图 和 预览视图 宽高一致,将此问题解决
qq_34066274 2018-06-14
  • 打赏
  • 举报
回复
因为横竖屏的坐标不一样,导致你人脸框不准确,你在横竖屏切换时做个判断,执行绘框方法(各角度),横竖屏坐标的区别给个传送门你https://blog.csdn.net/dcispuzzle/article/details/22605591
山城忙碌人 2018-05-31
  • 打赏
  • 举报
回复
补充: 图片上显示的中心点,需要乘以2,才是实际的中心点,因为我在检测人脸时,已经将流压缩了一半。所以此处需要乘以2.

80,354

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧