当前位置: 首页 > 最新文章 > 正文

opencv人脸识别设备在前置摄像头竖屏下的问题解决记录

最近在做人脸识别的设备,开始公司配的设备是平板,当时程序一切运行正常,因为opencv默认的程序在横屏下运行均没有问题。后来换了个坚屏的设备后,问题就来了,一个是前置摄像头,再一个坚屏要么出现显示图像歪的问题,要么人脸识别不了,或是矩形方框无法显示。最后发现国内高手有了解决记录,经过测试完美解决了问题。把过程记录一下。上面的代码运行后可以正常运行在:前置、竖屏的android设备中。最近在做人脸识

admin

最近在做人脸识别的设备,开始公司配的设备是平板,当时程序一切运行正常,因为opencv默认的程序在横屏下运行均没有问题。后来换了个坚屏的设备后,问题就来了,一个是前置摄像头,再一个坚屏要么出现显示图像歪的问题,要么人脸识别不了,或是矩形方框无法显示。最后发现国内高手有了解决记录,经过测试完美解决了问题。把过程记录一下。上面的代码运行后可以正常运行在:前置、竖屏的android设备中。

最近在做人脸识别的设备,开始公司配的设备是平板,当时程序一切运行正常,因为opencv默认的程序在横屏下运行均没有问题。后来换了个坚屏的设备后,问题就来了,一个是前置摄像头,再一个坚屏要么出现显示图像歪的问题,要么人脸识别不了,或是矩形方框无法显示。总之各种问题。最后发现国内高手有了解决记录,经过测试完美解决了问题。把过程记录一下。

在你的人脸识别Activity中的onCameraFrame方法中增加代码处理:

//判断横竖屏用于进行图像的旋转
if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
Mat rotatedRgbMat =
null;
Mat rotatedGrayMat =
null;
//厂商把后置摄像头映射成前置摄像头了
Core.flip(mRgba, mRgba, 1);//使用了前置摄像头,又设置了drawSource=false,需要翻转左右,不然旋转90度之后会有问题
rotatedRgbMat = new Mat(mRgba.cols(), mRgba.rows(), mRgba.type());
Core.
rotate(mRgba, rotatedRgbMat, Core.ROTATE_90_CLOCKWISE);//旋转之后得到正确的预览图像
mRgba=rotatedRgbMat;
Core.
flip(mGray, mGray, 1);//使用了前置摄像头,又设置了drawSource=false,需要翻转左右,不然旋转90度之后会有问题
rotatedGrayMat = new Mat(mGray.cols(), mGray.rows(), mGray.type());
Core.
rotate(mGray, rotatedGrayMat, Core.ROTATE_90_CLOCKWISE);//旋转之后得到正确的预览图像
mGray=rotatedGrayMat;
}
//判断横竖结束

opencv人脸识别设备在前置摄像头竖屏下的问题解决记录

CameraBridgeViewBase类增加方法:AllocateCache2

public void AllocateCache2(int mFrameWidth, int mFrameHeight) {
if (null != mCacheBitmap) {
mCacheBitmap.recycle();
}
mCacheBitmap = Bitmap.createBitmap(mFrameWidth, mFrameHeight, Bitmap.Config.ARGB_8888);
this.mFrameWidth = mFrameWidth;
this.mFrameHeight = mFrameHeight;
}

onCameraViewStarted方法增加代码:

mOpenCvCameraView.AllocateCache2(height, width);

opencv人脸识别设备在前置摄像头竖屏下的问题解决记录

JavaCameraView.java中initializeCamera中处理scale

//start前置竖屏的处理
if (mFrameWidth < width || mFrameHeight < height) {
float scaleWidth = width * 1.0f / mFrameWidth;
float scaleHeight = height * 1.0f / mFrameHeight;
float maxScale = Math.max(scaleHeight, scaleWidth);
mScale = maxScale;//用自带的缩放系数(当然也可以自己来缩放Mat 或者bitmap达到同样的效果)
} else {
mScale = 1.0f;
}
//前置竖屏的处理

opencv人脸识别设备在前置摄像头竖屏下的问题解决记录

以上代码没有对横屏、竖屏最先判断处理,有时间的朋友可以进行处理,自动根据屏幕进行判断处理。上面的代码运行后可以正常运行在:前置、竖屏的android设备中。


上一篇: 桩基检测桩帽(桩基检测桩帽) 下一篇:王冰冰之后,又一央视女记者火了:女性最致命的魅力,是清纯感?
返回顶部