【发布时间】:2025-12-13 22:20:03
【问题描述】:
我目前正在处理一个项目,目前我需要从视频中提取连续帧,然后查找并匹配它们的特征。问题是当我调用 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!";
}
}
match(m1,m2,num) 做特征检测业务,输出一张图片 "Image_%d.jpg" ,num。此图像是两个图像并排显示匹配。但是,此图像连续两次是同一图像。 match() 确实有效,因为我已经用静止图像对其进行了测试,所以我相信问题出在 cap.read 代码中。 任何帮助/建议将不胜感激。
【问题讨论】:
-
你确定两张图片是一样的吗?如果它们是连续的帧,它们可能在视觉上是相同的,但实际上有非常小的差异。如果这不是问题,这个页面有一些关于克隆帧图像的信息(搜索 VideoCapture::read) - docs.opencv.org/modules/highgui/doc/…
-
是的,它们完全一样,我已经逐步检查了图像以确保这一点。链接中的克隆适用于早期版本,并且主要处理 c IplImage 而不是更易于使用的 c++ cv::Mat。只是设置图像然后克隆我设置它的变量似乎可以解决问题,或多或少地强制对其进行深层复制。
-
是的,我在发表评论后就看到了您的回答。我对 OpenCV 不是很熟悉,所以不知道版本之间的差异。只是想我会分享我的 5 分钟谷歌研究。很高兴您找到了解决方案。
标签: c++ opencv video-processing