11

我正在尝试为 Android 开发一个应用程序,我需要从相机中获取分辨率尽可能高的未压缩图片。我尝试了 takePicture 的 rawCallback 和 postviewCallback,但它们不起作用。

现在我正在尝试使用 VideoCapture 使用 OpenCV(2.4 版),但我被困在默认的 960x720 中,这对我的需要来说很差;而我的手机,三星 Galaxy S3,理论上能够提供高达 8Mpx(图片为 3,264×2,448,视频为 1,920×1,080,根据维基百科)。VideoCapture.set(Highgui.CV_CAP_PROP_FRAME_WIDTH/HEIGHT, some number) 使相机返回我发现的黑色图像。

有什么方法可以通过 OpenCV 或 Android API 获得更高的分辨率,而无需压缩?

如果以前有人问过这个问题,我真的很抱歉;我一直在寻找几天,我什么也没找到。

感谢您的时间!

编辑:虽然这不是我要问的,但我发现有一种方法可以做一些非常相似的事情:如果您为相机设置 OnPreviewCallback,使用 setPreviewCallback,您确实会从相机获取原始图片数据(至少在我正在使用的 S3 中)。我把它留在这里,以防将来有人发现它有用。

编辑:在下面的答案中解释了部分解决方案。总结一下,

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth);
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight);

在某些条件下工作;请参阅下文了解更多详情。

4

3 回答 3

2

您必须通过调用获得支持的相机预览解决方案getSupportedPreviewSizes

在此之后,您可以使用方法设置任何分辨率setPreviewSize。最后不要忘记setParameters。实际上,许多 OpenCV Android 示例都包含此信息(查看 sample3)。

于 2012-08-25T15:03:10.720 回答
1

万一有人发现这很有用,我找到了一个(部分)解决方案:如果您的 VideoCapture 变量被称为 vc,这应该可以工作:

vc.set(Highgui.CV_CAP_PROP_FRAME_WIDTH, desiredFrameWidth);
vc.set(Highgui.CV_CAP_PROP_FRAME_HEIGHT, desiredFrameHeight);

请注意,宽度和高度的组合必须是您的相机支持的图片格式之一,否则只会得到黑色图像。您可以通过 Camera.Parameters.getSupportedPictureSizes() 获取这些信息。

但是,设置高分辨率似乎超出了 YUV 转换缓冲区的容量,所以我仍在为此苦苦挣扎。我将为此提出一个新的单独问题,以使一切更清楚:新线程

于 2012-08-24T09:24:39.823 回答
0

setPreviewSize 不设置图片分辨率。setPictureSize 可以。

于 2014-11-18T22:18:06.083 回答