如何设置OpenCV相机在纵向和全屏模式下显示预览

5
我正在尝试创建一个Android应用程序,在其中始终以纵向模式显示相机预览并对其进行一些重度图像处理操作。因此,我使用了OpenCV(包括其OpenCV4Android和本地C / C ++组件)。问题在于,当使用CameraBridgeViewBase或JavaCameraView类时,由OnCameraFrame返回的帧处于横向模式。
现在,如果Activity被定义为使用横向模式(就像OpenCV的示例应用程序一样),预览看起来很好,但任何其他UI视图都会倾斜90度(如前所述,设备应在我的应用程序中以纵向模式运行)。
如果将Activity设置为纵向模式,则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;
}

每个相机的帧都填满设备的宽度,但不填满其高度(因此看起来很拉伸),并且由此大大降低了帧速率。试图将图像调整为全屏(或任何与原始帧大小不同的尺寸)会导致根本没有显示图像(黑屏),并抛出以下异常:

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)

所以,我的问题是:如何在竖屏模式和全屏模式下显示OpenCV的相机预览?
不幸的是,由于我在SO上是初学者,无法附加屏幕截图。同时,我知道之前在SO上曾有类似的问题,但是没有一个答案完全解决了这个问题。
1个回答

5
我找到了一个解决方案: 创建一个自定义相机类,它扩展了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;
    }

这里有一个很好的例子(第一个答案,由Zarokka提供)。性能有所下降,但与在OnCameraFrame中旋转输出Mat时相比,这并不严重(而且这种方式也无法完全解决问题)。我在640 * 480分辨率的预览框架大小(全屏)上使用它,即使在旧设备上看起来也很好,并且运行顺畅。


我也让它运行起来了,但性能下降到了约18帧每秒,这在我的情况下并不理想,但在其他场景中可能是理想的,谢谢。 - Eason PI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接