OpenCV视频捕获抓取和检索

OpenCV Videocapture Grab and Retrieve

本文关键字:检索 抓取 视频 OpenCV      更新时间:2023-10-16

我遇到这个问题已经很长时间了,我不确定发生了什么。所以我有一个调用nextFrame的循环,现在问题在于imshow实际显示了什么。

我特别希望每次调用cap.grab()cap.retrieve()时都有一个图像,但它似乎在"cap"对象内部有这个缓冲区,所以在获取单个即时图像时,我会在点击图像时获得一个图像序列,然后在3/4帧后获得一个新序列。

如何获得单帧?

cap是VideoCapture对象,maxCount是矢量的大小。

void CamLoop::nextFrame() {
.
.
.
//if first loop fill a vector<Mat> with random Mats from camera
if (firstLoop) {
Mat buff;
cap >> buff;
for(int i = 0; i<(maxCounter); i++) {
buffer.push_back(buff);
}
}
projector.nextCode();
if (!customImages) {
cap.grab();
Mat buff;
cap.retrieve(buff);

//tried this way too
//cap >> buff;
buffer[counter] = buff;
setMouseCallback( "Camera", mouseFunc, this );
imshow("Camera", buffer[counter]);
waitKey(1);
}
.
.
.
counter++;
}

我在Eclipse Mars 上使用Linux Mint Rosa和OpenCV 3.1.0

EDIT问题是VideoCapture有一个缓冲区,请在调试模式下在您自己的计算机上尝试,帧不是实时的,我该如何解决这个问题?

我试过使用

cap.set(CV_CAP_PROP_BUFFERSIZE,1);

但它给了我这个错误。

VIDEOIO ERROR: V4L2: setting property #38 is not supported

也尝试过

cap.set(CV_CAP_PROP_MODE,1);

但它给了我这个错误。

VIDEOIO ERROR: V4L2: setting property #9 is not supported

编辑可能是带有缓冲区的相机,而不是VideoCapture对象本身。

一个缓慢而作弊的修复方法可能是进行

cap.open( *CAMERA_NUM* );

在循环中,这是缓慢的,但它在没有缓冲区的情况下实现了静止图像。