在OpenCV中使用网络摄像头捕获2个非连续帧
Capture 2 non-consecutive frames using a webcam in OpenCV
这些是我希望这个项目使用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);
您需要将cap()
调用放入循环中-否则您只执行一次捕获
我没有使用cap >> img1
和cap >> img2
,而是添加了一个名为"captura"的Mat变量来存储当前帧,并分别使用img1 = captura.clone()
和img2 = captura.clone()
,现在它正在工作。
相关文章:
- 如何知道n!是否可以表示为三个连续数字的乘法?
- 两个连续的 OpenMP 并行区域会相互减慢速度
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 使用av_read_frame()获取2个连续帧
- 确定数组是否可以旋转 3 个连续的数组元素进行排序?
- 如何从数组中删除 2 个连续重复项? C++
- 使用 C++ 读取具有两个连续分隔符的 csv 文件
- 集合中不带 for 循环的 n 个连续项的总和
- 如何比较C 列表中的两个连续元素
- 分段错误,同时减去链表的 2 个连续节点
- 给定n个数字,编写一个例程,以在4个连续数字之间找到最大的数字
- 是否有任何方法可以比较C 中的STD ::的两个连续元素
- 为什么我不能在同一分配中保留两个连续的内存区域,而不通过单个调用保留这两个区域?
- 从一个字符串中获取 2-5 个连续的单词短语,我得到了 2 个工作,但在做 3 个时遇到麻烦
- 如何比较两个连续的迭代步骤?在C++
- 如何在c++中增加向量中k个连续元素的值
- 在 char 数组中查找最多 6 个连续 0 位的最快方法
- 在数组中查找 y 的 x 个连续值的最有效方法是什么?
- 为什么两个连续的转换会改变一个整数