如何使用OpenCV在Android中设置相机分辨率?

时间:2012-08-24 07:21:37

标签: android opencv camera resolution

我正在尝试为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,某些数字)使相机返回到我发现的黑色图像。

有没有办法通过OpenCV或Android API获得更高的分辨率而不进行压缩?

如果之前有人问我,我真的很抱歉;我一直在寻找几天,但我一无所获。

感谢您的时间!

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

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

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

在某些条件下工作;请参阅下面的详细信息。

3 个答案:

答案 0 :(得分:2)

您必须致电getSupportedPreviewSizes来获得支持的相机预览结果。

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

答案 1 :(得分: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转换缓冲区的容量,所以我仍然在努力。我将为此提出一个新的单独问题,以使一切更清晰:new thread

答案 2 :(得分:0)

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