我目前正在开发一个项目,此刻我需要从视频中拉出连续的帧,然后查找并匹配它们上的特征。问题是,当我调用VideoCapture :: read(Mat &图片)时,它会覆盖我想要与同一图像进行比较的两幅图像。我认为这可能是因为使用了相同的缓冲区,因此这两个值都指向相同的空间。我只是不确定如何解决这个问题。在opencv中读取视频文件的连续图像
这里的问题代码:(不用担心可怜的异常处理)
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 “,第此图像是两个图像并排显示匹配。尽管这张图片连续两次是同一张图片。 match()确实起作用,因为我已经用静止图像对其进行了测试,所以我相信问题在于cap.read代码。 任何帮助/建议将不胜感激。
你确定两幅图像是一样的吗?如果它们是连续的帧,它们可能在视觉上相同,但实际上具有非常小的差异。如果这不是问题,这个页面有一些关于克隆帧图像的信息(搜索VideoCapture :: read) - http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture – MatthewD 2013-05-03 00:01:58
是的,他们完全一样,我已经通过图像来确保。链接中的克隆适用于较早的版本,主要处理c IplImage而不是C++ cv :: Mat,它更易于使用。只需设置图像,然后克隆我设置的变量似乎可以做到这一点,或多或少强制其本身的深层副本。 – 2013-05-03 00:51:10
是的,我发布我的评论后,我看到了你的答案。我对OpenCV并不熟悉,所以不知道版本之间的差异。只是想我会分享我的5分钟谷歌研究。很高兴你找到你的解决方案。 – MatthewD 2013-05-03 01:32:49