C++ 在opencv中读取视频文件的连续图像

C++ 在opencv中读取视频文件的连续图像,c++,opencv,video-processing,C++,Opencv,Video Processing,我目前正在做一个项目,目前我需要从视频中提取连续的帧,然后查找并匹配其中的特征。问题是,当我调用VideoCapture::read(Mat&image)时,它会覆盖我想要与同一个图像进行比较的两个图像。我认为这可能是因为使用了相同的缓冲区,因此两个值都指向相同的空间。我只是不知道该怎么解决这个问题 下面是问题代码:(不要担心糟糕的异常处理) matm1,m2; 视频捕获cap(argv[1]); 如果(!cap.isOpened()){ 抛出std::exception(“无法打开文件”);

我目前正在做一个项目,目前我需要从视频中提取连续的帧,然后查找并匹配其中的特征。问题是,当我调用VideoCapture::read(Mat&image)时,它会覆盖我想要与同一个图像进行比较的两个图像。我认为这可能是因为使用了相同的缓冲区,因此两个值都指向相同的空间。我只是不知道该怎么解决这个问题

下面是问题代码:(不要担心糟糕的异常处理)

matm1,m2;
视频捕获cap(argv[1]);
如果(!cap.isOpened()){
抛出std::exception(“无法打开文件”);
}
int num=0;
while(num<20){
试一试{
第1章改为(m1);
上限为(m2);
num++;
匹配(m1,m2,num);
}捕获(标准::异常){

std::cout很简单,只要确保每个图像都是捕获图像的深度副本即可

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

做了这个把戏,虽然没有我希望的那么优雅。

你确定两幅图像是一样的吗?如果它们是连续的帧,它们在视觉上可能是一样的,但实际上有非常小的差异。如果这不是问题,本页有一些关于克隆帧图像的信息(搜索VideoCapture::read)-是的,它们是完全相同的,我已经通过图像来确保。链接中的克隆适用于早期版本,主要是用C IplImage而不是C++ cv::MAT,更容易处理。只需设置图像,然后克隆我设置的变量,似乎就可以做到。是的,我在发布我的评论后看到了你的答案。我对OpenCV不太熟悉,所以没有意识到版本之间的差异。我只是想分享我的5分钟谷歌研究。很高兴你找到了你的解决方案。除非你只是在装醉,否则这不是解决问题的方式。我看不到任何其他答案这里是托马斯。也许你可以提供一些实际的意见,而不是仅仅把我的意见放在口袋里。就像我说的,这是我想要的,但这是一种很不得体的方式。OP解决了他自己的问题。不必投反对票!如果你不喜欢,发表你自己的答案。+1在这里补偿。
m1 >> cap
m1 = m1.clone();