6

我正在使用通过 LVDS 连接到 i.MX6 Quad 的 CSI 接口的 Aptina MT9V024 传感器。我在快照模式下运行传感器,即使用外部信号触发/启动图像捕获。

在软件方面,我正在运行 Yocto Linux 和一个用 C 编写的应用程序,它应该检索捕获的图像数据。

它是这样工作的(部分代码,循环运行):

// wait until camers is triggered
ret = select(video_fd + 1, &fds, NULL, NULL, &tv);

// dq buffer / read image data and save to disk
ret = xioctl(video_fd, VIDIOC_DQBUF, &v4l2buf);
img->imageData = buffers[v4l2buf.index].start;
cvSaveImage(filename, img, 0);

// enqueue another buffer to capture next frame
ret = xioctl(video_fd, VIDIOC_QBUF, &v4l2buf);

调用select(...)阻塞直到有新的帧可用,即相机被触发。

我的问题:检索到的图像是上一次捕获的图像。在初始化期间,我请求两个缓冲区,因为传感器不会以更少开始。但是在 select(...) 返回后,我不能 DQBUF 超过一个缓冲区。所以,我总是卡在一个旧框架上。

有效的不是访问 DQBUF 返回的缓冲区,而是访问“另一个”缓冲区,即在上面代码的第三行中使用buffers[(v4l2buf.index + 1) % 2]而不是 。buffers[v4l2buf.index]但我认为这不是一种非常可靠的方法,因为我正在访问一个缓冲区,根据 v4l2 API,该缓冲区尚未准备好被读取(但实际上它包含我想要的数据)。

4

0 回答 0