2013-05-02 117 views
0

我目前正在开发一个项目,此刻我需要从视频中拉出连续的帧,然后查找并匹配它们上的特征。问题是,当我调用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代码。 任何帮助/建议将不胜感激。

+0

你确定两幅图像是一样的吗?如果它们是连续的帧,它们可能在视觉上相同,但实际上具有非常小的差异。如果这不是问题,这个页面有一些关于克隆帧图像的信息(搜索VideoCapture :: read) - http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture – MatthewD 2013-05-03 00:01:58

+0

是的,他们完全一样,我已经通过图像来确保。链接中的克隆适用于较早的版本,主要处理c IplImage而不是C++ cv :: Mat,它更易于使用。只需设置图像,然后克隆我设置的变量似乎可以做到这一点,或多或少强制其本身的深层副本。 – 2013-05-03 00:51:10

+0

是的,我发布我的评论后,我看到了你的答案。我对OpenCV并不熟悉,所以不知道版本之间的差异。只是想我会分享我的5分钟谷歌研究。很高兴你找到你的解决方案。 – MatthewD 2013-05-03 01:32:49

回答

0

好吧,确保每个图像都是捕获图像的深层副本一样简单。

m1 >> cap 
m1 = m1.clone(); 

做了诡计,虽然不如我希望的那么优雅。

+0

除非你只是在喝醉,否则不是这样做的。 – 2013-05-03 02:50:33

+0

我没有在这里看到任何其他的答案托马斯。也许你可以提供一些实际的投入,而不是仅仅装袋。就像我说的那样,它做我想做的事情,但这是做一件冒险的事情。 – 2013-05-03 10:06:30

+1

OP解决了他自己的问题。没有必要downvote!如果你不喜欢它,发布你自己的答案。 +1在这里进行补偿。 – MatthewD 2013-05-07 01:00:05