C++ 使用OpenCV捕获图像,而不是视频

C++ 使用OpenCV捕获图像,而不是视频,c++,linux,opencv,webcam,v4l2,C++,Linux,Opencv,Webcam,V4l2,我正在使用OpenCV4从相机读取数据。类似于网络摄像头。非常好,代码有点像这样: cv::VideoCapture cap(0); cap.set(cv::CAP_PROP_FRAME_WIDTH , 1600); cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1200); while (true) { cv::Mat mat; // wait for some external event here so I know it is time to t

我正在使用OpenCV4从相机读取数据。类似于网络摄像头。非常好,代码有点像这样:

cv::VideoCapture cap(0);
cap.set(cv::CAP_PROP_FRAME_WIDTH , 1600);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 1200);
while (true)
{
    cv::Mat mat;

    // wait for some external event here so I know it is time to take a picture...

    cap >> mat;
    process_image(mat);
}
问题是,这会产生许多视频帧,而不是单个图像。这很重要,因为在我的情况下,我不想也不需要处理30 FPS。实际上,我有特定的物理事件,在特定时间触发从相机读取图像。因为OpenCV期望调用方需要视频——考虑到该类被称为
cv::VideoCapture
,这并不奇怪——它已经缓冲了很多秒的帧

我在图像中看到的总是几秒钟前的

所以我的问题是:

  • 有没有办法刷新OpenCV缓冲区
  • 或者告诉OpenCV放弃输入,直到我告诉它拍摄另一张图像
  • 或者获取最新的图像而不是最旧的图像

我正在考虑的另一个选择是直接使用V4L2而不是OpenCV。这能让我拍摄个人照片还是像OpenCV那样只流式播放视频?

这能回答你的问题吗:不,我昨晚确实看到了那张照片,并试过了,但它不能解决问题。OpenCV问题列表上还有其他来自不同人士的帖子,这些帖子似乎只针对某些相机实现了该属性,并不适用于所有人。(在我的例子中,我使用的是OpenCV v4.2.0。)在另一个线程中流式传输视频,并从主线程调用图像-这有帮助吗?