OpenCV捕获的图像分辨率与Fotoapparat

时间:2019-02-20 14:59:03

标签: android opencv resolution edge-detection

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

我们可以看到,当直接从Fotoapparat拍摄图像时,精巧检测的效果比OpenCV实现好得多。我尝试过通过其他方法来调整摄像机的分辨率(通过扩展JavaCameraView),但是它们似乎都不起作用,OpenCV捕获总是表现不佳。

有人能指出我正确的方向,以便从OpenCV捕获手机可用的最高分辨率的帧之一吗?

先谢谢您了:)

结果:

OpenCV-原始投资报酬率

enter image description here

OpenCV-投资回报率的Canny转换

enter image description here

Fotoapparat-原始投资报酬率(压缩了31%,所以我可以上传)

enter image description here

Fotoapparat-Cany转换ROI

enter image description here

1 个答案:

答案 0 :(得分:0)

我终于明白了!

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

解决方案是在我自己的实现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)
    }