videocapture视频读取问题

Leo123_ 2012-05-25 03:28:35
我想读取视频中前后两帧图像进行比较,可是为什么我读出显示的图像都是同时变化的呢?

int main(int argc,char argv[])
{
VideoCapture capture;
string video =string("E:\\cxystudy\\cxystudy\\scene detection\\aa.avi");
capture.open(video);
cv::Mat frame_old;
cv::Mat frame;
capture.open(video);
if (!capture.isOpened())// check if we succeeded
{
cout << "capture device failed to open!" << endl;

}
capture >> frame_old;
while(capture.read(frame))
{
IplImage *current_frame =&IplImage(frame_old) ;
IplImage *next_frame = &IplImage(frame) ;


cvShowImage("frame", next_frame);
cvShowImage("frame_old", current_frame);
cvWaitKey(1000);
swap(frame_old,frame);
}
return 0;

}
...全文
1022 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
c2716266 2012-10-16
  • 打赏
  • 举报
回复
注意,read方法中的Mat是引用,实则是VideoCapture内部解析出来的帧图像的引用,而OpenCV中Mat的复制构造函数和赋值操作符共享数据,仅构造矩阵头,所以读取下一帧后,image中的数据就变化了。如果同时获取多帧图像,应用Mat::clone()方法复制image中的数据,这样就不会丢失了。例如

1
video_capture.read(frame1);
2
video_capture.read(frame2);
此时,frame1和frame2均为后面的一帧,不是想要的那样。我们应该这样

1
video_capture.read(frame);
2
frame.clone(frame1);
3
video_capture.read(frame);
4
frame.clone(frame2);
这样,frame1和frame2就存储相邻两帧了。
Leo123_ 2012-05-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
看看程序逻辑有没有问题,可能是哪块的变量定义的不合理,
我咋发现你的程序貌是从视频采集读取一张,在采集下一张,再显示,好像原来上一帧就没有保存,少个显示窗口
保存显示上一帧
[/Quote]
第一帧保存在frame_old里啊,难道cv::mat不能保存的?
YYMMNNLL 2012-05-27
  • 打赏
  • 举报
回复
看看程序逻辑有没有问题,可能是哪块的变量定义的不合理,
我咋发现你的程序貌是从视频采集读取一张,在采集下一张,再显示,好像原来上一帧就没有保存,少个显示窗口
保存显示上一帧
Leo123_ 2012-05-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
采集时间间隔太短,中间又没有停顿,本帧和下一帧不断变化
眼睛看起来当然是不断变化
代码还需要在修改:加定时器
[/Quote]
不是,我的意思是输出的两幅图都是同一帧,我输出图像是为了看效果啊,我要得到前后不同的两帧分别存在frame_old和frame中,但是输出这两个存的图像都是一样的
YYMMNNLL 2012-05-25
  • 打赏
  • 举报
回复
采集时间间隔太短,中间又没有停顿,本帧和下一帧不断变化
眼睛看起来当然是不断变化
代码还需要在修改:加定时器

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧