在 OpenCV 上使用 onCameraFrame Android 来捕获高分辨率帧?

Using onCameraFrame on OpenCV for Android to capture high resolution frame?

我正在尝试使用 Android 的 OpenCV 2.4.10 从一对 Google 眼镜中的相机捕获高分辨率帧 (1280x720)。我在 Activity 中实现了 CameraBridgeViewBase.CvCameraViewListener2 并尝试在 onCameraFrame 方法中抓取框架。到目前为止一切正常,我得到了一个 512x288 的 Mat 对象。

我的问题是 512x288 分辨率不够高,无法满足我的需要。因此,我尝试按照与 OpenCV 示例 3 中相同的方式设置我的项目:http://goo.gl/iDyqQj。问题是它只适用于 512x288 以下的分辨率,一旦我将分辨率提高到这个级别以上,它就会默认恢复为 512x288(没有任何通知)。

我发现了一些建议,http://goo.gl/X2wtM4,即 OpenCV 将帧大小限制为屏幕分辨率的最大值。但是 Google Glass 屏幕应该有 640x360 分辨率?我试着按照答案中的描述去做,但是当我覆盖 calculateCameraFrameSize 和 return 一个大于 512x288 的 Size-object 时,我得到一个扭曲的框架(但尺寸更大,见下文)。

有没有人对如何使用 OpenCV 在 Google Glass 上捕获更高的分辨率提出建议?

所以我找到了解决办法。这似乎是两个不同的问题。正如我在我的问题中所想的那样,您需要覆盖 JavaCameraView 中的 calculateCameraFrameSize 才能获取比 onCameraFrame 中的设备屏幕更高的分辨率。这显然是 OpenCV 的设计选择,并且自版本 2.4.5 以来一直如此。所以这就是为什么我无法获得更高分辨率的帧。

尽管我现在可以获得更高分辨率的帧,但对于大多数预览尺寸来说它仍然是失真的。这是 GDK 中的一个错误,似乎已经知道了很长一段时间(如果我理解正确的话,从 XE10 开始),但仍然没有修复。幸运的是有一个解决方法!通过在获取相机后使用 setPreviewFpsRange 手动设置预览的 FPS 可以避免该问题。

Camera.Parameters params = camera.getParameters();
params.setPreviewFpsRange(30000, 30000);
camera.setParameters(params);