这些是我希望这个项目使用 OpenCV 遵循的步骤:
1) 当我按下 1 键时捕获一帧。
2) 移动网络摄像头
3) 当我按下 2 键时捕获第二帧。
4) 显示两张图片。
这是我正在使用的代码:
int main(int, char**){
VideoCapture cap(1);
Mat img1, img2;
int input;
namedWindow("Imagen 1",CV_WINDOW_AUTOSIZE);
namedWindow("Imagen 2",CV_WINDOW_AUTOSIZE);
for(;;){
input = cvWaitKey(40);
if((char) input ==27)
break;
if ((char) input == 49){
cap >> img1;
imshow("Imagen 1",img1);
}
if ((char) input == 50){
cap >> img2;
imshow("Imagen 2",img2);
}
}
return 0;
}
但是,当我运行它时,我在两个窗口中得到了相同的图像。谁能解释为什么会这样?我该怎么做才能让它按照我解释的方式工作?
最佳答案
如果您在 Linux 上工作,那么您将不得不清空捕获设备的缓冲区。我通过运行一个单独的线程来读取帧并只记住最后一个。当我想拍摄一帧进行进一步处理时,我会克隆现在记住的那个。但是,在您的情况下,这可能有点矫枉过正。
另外,你可能喜欢做这样的事情而不是你当前的主循环:
cv::Mat temp,img1,img2;
cv::VideoCapture cap(1);
char control=' ';
cv::namedWindow("current",CV_AUTOSIZE);
cv::namedWindow("img1",CV_AUTOSIZE);
cv::namedWindow("img2",CV_AUTOSIZE);
do{
if(49 == control){
img1=temp.clone();
cv::imshow("img1",img1);
}else if(50 == control){
img2=temp.clone();
cv::imshow("img2",img2);
}
cap>>tmp; //emptying buffer all the time
cv::imshow("current",tmp);
control=cv::waitKey(40);//if You are faster than captures fps
}while(27 != control);
关于c++ - 在 OpenCV 中使用网络摄像头捕获 2 个非连续帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17136067/