我们在用OpenCV自带的摄像头JavaCameraView时,开启后手机竖屏会是旋转90度的效果,非常不友好,下面的代码即可实现我们用JavaCameraView根据手机横竖屏来获取到对应的图像.
我们要修改的主要有两个地方,一个是获取实时帧的事件onCameraFrame,还有一个是OpenCV里面CameraBridgeViewBase类里的deliverAndDrawFrame方法
onCameraFrame
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) { //获取到显示Mat赋值给frame Mat frame = inputFrame.rgba(); //判断横竖屏用于进行图像的旋转 if (getResources().getConfiguration().orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { //判断是前置摄像头还是后置摄像头,翻转的角度不一样 switch (cameraindex) { case CameraBridgeViewBase.CAMERA_ID_FRONT: Core.rotate(frame, frame, Core.ROTATE_90_COUNTERCLOCKWISE); break; case CameraBridgeViewBase.CAMERA_ID_BACK: Core.rotate(frame, frame, Core.ROTATE_90_CLOCKWISE); break; default: Core.rotate(frame, frame, Core.ROTATE_90_CLOCKWISE); break; } //把旋转后的Mat图像根据摄像头屏幕的大小进行缩放 Size size = new Size(cameraView.getWidth(), cameraView.getHeight()); Imgproc.resize(frame, frame, size); } return frame; }
CameraBridgeViewBase
在CameraBridgeViewBase类里找到deliverAndDrawFrame方法
在catch后面加上
//此处修改如果不对的话释放图片再重新根据大小进行创建 if (mCacheBitmap != null) { mCacheBitmap.recycle(); mCacheBitmap = Bitmap.createBitmap(modified.width(), modified.height(), Bitmap.Config.ARGB_8888); }
把上面两段加好后,我们重新打开摄像头,显示的图像就是正常的图像了.