我正在尝试使用网络摄像头快速拍摄两张照片。这是我写的代码:
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
#include <Windows.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat frame;
VideoCapture cap(0);
if (!cap.isOpened()) cout << "it ain't open.\n";
cap.set(CV_CAP_PROP_FRAME_WIDTH, 300);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 300);
namedWindow("1", CV_WINDOW_AUTOSIZE);
printf("before\n");
cout << "read 1 status: " << cap.read(frame) << endl;
imshow("1", frame);
while (1){
if (waitKey(27) >= 0){
destroyAllWindows();
break;
}
}
printf("after 1\n");
Mat frame2;
namedWindow("2", CV_WINDOW_AUTOSIZE);
cout << "read 2 status: " << cap.read(frame2) << endl;
imshow("2", frame2);
while (1){
if (waitKey(27) >= 0){
destroyAllWindows();
break;
}
}
printf("after 2\n");
getchar();
return 0;
}
第一张图片没有问题:
...但是第二张照片在将相机向左移动后仍然是第一张照片:
以下是两张照片拍摄后的打印输出,这似乎表明read()工作正常:
before
read 1 status: 1
after 1
read 2 status: 1
after 2
知道我缺少什么吗?
编辑:Marol提供了这个问题的答案。拍摄第二帧时,我拍了两张照片,将两张照片保存到相同的Mat:
Mat frame2;
namedWindow("2", CV_WINDOW_AUTOSIZE);
cout << "read 2 status: " << cap.read(frame2) << endl;
cout << "read 3 status: " << cap.read(frame2) << endl;
imshow("2", frame2);
这次的图片明显不同。
答案 0 :(得分:2)
它会返回两张不同的照片。尝试拍摄第一张照片时快速移动。您可以看到frame1与第2帧不同,但实际上frame2来自您期望的不同时间。在我的简单网络摄像头的情况下,它确实在一个时间点缓冲两帧(我的意思是一帧,第一帧之后立即第二帧)。
解决方案是丢弃偶数帧(第二,第四等)并仅考虑奇数帧(第一,第三等)。