Fin*_*fin 5 camera android opencv opencv4android
我正在尝试创建一个Android应用.它始终以纵向模式显示相机预览,并对其(某些)帧执行一些繁重的图像处理操作.因此,我正在使用OpenCV(它的OpenCV4Android和本机C/C++组件).问题是当使用CameraBridgeViewBase或JavaCameraView类时,OnCameraFrame返回的帧处于横向模式.
现在,如果将Activity定义为使用横向模式(就像OpenCV的示例应用程序一样),预览看起来很好,但任何其他UI视图都倾斜了90度(如前所述,设备应该以纵向模式运行我的应用程序).
如果"活动"设置为纵向模式,UI视图显然看起来正确,但相机预览将倾斜90度.
如果我尝试通过操作OnCameraFrame上的图像矩阵来旋转每个帧,如下所示:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
Core.transpose(mRgba,mRgbaT);
Core.flip(mRgbaT, mRgbaT, -1);
Imgproc.resize(mRgbaT, mRgbaT, mRgba.size());
return mRgbaT;
}
Run Code Online (Sandbox Code Playgroud)
然后每个相机的框架填充设备的宽度,但不是它的高度(因此,它看起来像拉伸),加上 - 它大大减慢了帧速率.尝试将图像调整为全屏(或任何不同于原始帧大小的大小)会导致根本不显示图像(黑屏)并抛出以下异常:
E/CameraBridge(11183): Utils.matToBitmap() throws an exception: /home/reports/ci/slave_desktop/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:97: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:如何在纵向模式和全屏模式下显示OpenCV的相机预览?
不幸的是,由于我的初学者声誉,我不能附加屏幕截图.此外,我知道之前有过类似问题的问题,但没有一个答案似乎完全解决了问题.
我找到了一个解决方案:创建一个自定义的相机类,它从CameraBridgeViewBase扩展,类似于JavaCameraView从它扩展(大多数部分甚至相同),但在实现内部JavaCameraFrame类时,替换返回Mat对象的方法这样的事情:
public Mat rgba() {
Imgproc.cvtColor(mYuvFrameData, mRgba, Imgproc.COLOR_YUV2BGR_NV12, 4);
if (mRotated != null)
mRotated.release();
mRotated = mRgba.t();
Core.flip(mRotated, mRotated, -1);
return mRotated;
}
Run Code Online (Sandbox Code Playgroud)
有一个伟大的例子在这里(第一个答案,礼貌Zarokka).性能有一些降级,但它远没有像在OnCameraFrame中旋转输出Mat那样严重(无论如何还没有完全解决问题).我在640*480分辨率的预览帧尺寸(全屏)上使用它,它看起来很好,工作也很顺畅,即使不是那么新的设备.