我正在做一个项目,我们需要在考试中识别出气泡。 我们一直在根据需求(需要在实时摄像机流上叠加形状)测试不同的图像拍摄方法,以下是结果。
我们可以看到,当直接从Fotoapparat拍摄图像时,精巧检测的效果比OpenCV实现好得多。我尝试过通过其他方法来调整摄像机的分辨率(通过扩展JavaCameraView),但是它们似乎都不起作用,OpenCV捕获总是表现不佳。
有人能指出我正确的方向,以便从OpenCV捕获手机可用的最高分辨率的帧之一吗?
先谢谢您了:)
结果:
OpenCV-原始投资报酬率
OpenCV-投资回报率的Canny转换
Fotoapparat-原始投资报酬率(压缩了31%,所以我可以上传)
Fotoapparat-Cany转换ROI
答案 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)
}