OpenCV 捕获的图像分辨率与 Fotoapparat

OpenCV captured image resolution vs Fotoapparat

我正在做一个项目,我们需要将识别气泡作为考试的一部分。 我们一直在根据要求测试不同的图像拍摄方法(我们需要在实时相机流上叠加形状),结果如下。

正如我们所见,当直接从 Fotoapparat 获取图像时,canny 检测比 OpenCV 实现效果好得多。我曾尝试调整相机分辨率(通过扩展 JavaCameraView)以及其他许多东西,但 none 似乎有效,OpenCV 捕获总是表现不佳。

任何人都可以指出正确的方向,让我以 phone 可用的最高分辨率从 OpenCV 捕获其中一帧吗?

提前致谢:)

结果:

OpenCV - 原始投资回报率

OpenCV - ROI 的 Canny 变换

Fotoapparat - 原始 ROI(压缩 31%,以便我可以上传)

Fotoapparat - ROI 的 Canny 转换

我终于明白了!

发生的事情是,当尝试从 OpenCV 的 onCameraFrame 中提取帧时,它默认为一个很小的分辨率(并受屏幕尺寸影响),因为它实际上是在截屏屏幕上的内容当时。

解决方案是在我自己的 class 中实现 camera.takePicture,它实现了 JavaCameraView(类似于问题 here 中显示的那个),然后再采取图片,选择设备上可用的最高分辨率。

代码如下:

    fun takePic(jpgCallback: Camera.PictureCallback) {
        val params = mCamera.parameters
        params.jpegQuality = 100 //doesn't hurt to be sure

        val supportedSizes = params.supportedPictureSizes
        if (supportedSizes.isNullOrEmpty().not()) {
            var w = 0
            var h = 0
            for (size in supportedSizes) {
                if (size.width > w || size.height > h) {
                    w = size.width
                    h = size.height
                }
            }

            Log.e("----", "Using largest supported size... w: $w // h: $h")
            params.setPictureSize(w, h)
        }
        mCamera.parameters = params
        mCamera.takePicture(null, null, jpgCallback)
    }