这些是我希望此项目使用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;
}
然而,当我运行这个时,我在两个窗口中都得到了相同的图像。任何人都可以解释为什么会这样吗?我能做些什么让它按照我解释的方式工作?
答案 0 :(得分:1)
如果你正在使用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);
答案 1 :(得分:0)
您需要将cap()
调用放在循环中 - 否则您只需执行一次捕获
答案 2 :(得分:0)
我没有使用cap >> img1
和cap >> img2
,而是添加了一个名为“captura”的Mat变量来存储当前帧,并分别使用了img1 = captura.clone()
和img2 = captura.clone()
,现在它正在运行。