如何解决OpenCV VideoCapture在V4L2设备上以较高分辨率显示不正确的图像
我能够使用OpenCV从连接到Digi SBC的CSI摄像机(ov5640)成功捕获较低分辨率的图像。当我使用更高的分辨率时,图像不正确。一旦指定了一种受支持的格式(即UYVY),颜色就正确了,但是图像看起来像是平铺的图像,由从图像的一部分获取的平铺图像组成。
在将相机设置为更高的分辨率之前,有人遇到过这个问题吗?
相关代码:
cv::VideoCapture Capture;
...
Capture.set(cv::CAP_PROP_FRAME_HEIGHT,720);
Capture.set(cv::CAP_PROP_FRAME_WIDTH,1280);
...
cv::VideoWriter Writer;
std::cout << "UYVY setting successful: " << Capture.set(cv::CAP_PROP_FOURCC,Writer.fourcc('U','Y','V','Y')) << std::endl;
...
cv::Mat Image;
Capture.read(Image);
编辑#1:更新的信息
当我使用dmesg查找错误时,我看到一条消息,指出图像转换器的最大大小为1024,小于我想要的1280图像尺寸。 Digi SBC使用NXP的i.MX6处理器。该处理器首先将图像传递到图像转换器,然后传递到图像DMA控制器。从图像处理器单元指南(Ipu Guide,只有800页!)图37.1看来,我可以绕过IC并转到SMFC,该SMFC应该没有这些尺寸限制,但是我不知道如何完成此操作
我不确定是否有人看到过此问题,但是如果在移至更高分辨率时图像不正确,则可能是类似的问题。
编辑#2:可能的解决方法
基于从Digi camera site链接到的内核驱动程序文件,我们能够绕过IPU来使摄像机以更高的分辨率工作。这些文件指定了ioctl()
调用,这些调用可用于设置正确的数据路径。
代码段:
int fd = open("/dev/video0",O_RDWR | O_NONBLOCK);
...
// Set input to 1 to route camera capture from CSI -> DMA write
int InputType = 1;
ioctl(fd,VIDIOC_S_INPUT,&InputType);
...
// Set the params and format for the updated image size
struct v4l2_streamparm StreamingParams;
// The capture modes correspond to the ov5640_mode enum in ov5640_mipi.c
StreamingParams.parm.capture.capturemode = 6;
ioctl(fd,VIDIOC_S_PARM,&StreamingParams);
struct v4l2_format format;
format.fmt.pix.width = 2592;
format.fmt.pix.height = 1944;
ioctl(fd,VIDIOC_S_FMT,&format);
希望它可以帮助某人。如果有人有其他解决方法,我希望他们能分享。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。