我目前正在开展一个项目,目前我需要从视频中提取连续帧,然后找到并匹配它们上的功能。问题是,当我调用VideoCapture :: read(Mat& image)时,它会覆盖我要与同一图像进行比较的两个图像。我想这可能是因为使用了相同的缓冲区,因此两个值都指向相同的空间。我只是不确定如何解决这个问题。
这是问题代码:(不要担心可怜的异常处理)
Mat m1, m2;
VideoCapture cap(argv[1]);
if(!cap.isOpened()){
throw std::exception("Could not open the file");
}
int num = 0;
while(num < 20){
try{
cap.read(m1);
cap.read(m2);
num++;
match(m1,m2,num);
}catch(std::exception){
std::cout << "Oh no!";
}
}
匹配(m1,m2,num)执行特征检测业务并输出图像“Image_%d.jpg”,num。该图像是并排显示的图像。此图像是连续两次相同的图像。 match()确实有效,因为我用静态图像测试了它,所以我相信问题在于cap.read代码。 任何帮助/建议将不胜感激。
答案 0 :(得分:1)
这就像确保每张图片都是捕获图像的深层副本一样简单。
m1 >> cap
m1 = m1.clone();
做了这个伎俩,虽然不如我希望的那么优雅。