对OpenCV 中cvQueryFrame函数的一点理解

转载于http://blog.csdn.net/kcust/article/details/13768199

从摄像头或者文件中抓取并返回一帧

[cpp]  view plain  copy
  1. IplImage* frame = cvQueryFrame( CvCapture* capture );    

抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整capture到合适的帧。函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。

注意: cvQueryFrame返回的指针总是指向同一块内存(这个特点就是下面的问题所在!)。建议cvQueryFrame后拷贝一份。而且返回的帧需要FLIP后才符合OPENCV的坐标系。

若返回值为NULL,说明到了视频的最后一帧。

以下代码:

[cpp]  view plain  copy
  1. IplImage* frame0 = 0;    
  2. IplImage* frame1 = 0;    
  3. IplImage* frame2 = 0;    
  4.       
  5. frame0 = cvQueryFrame( capture );    
  6. cvSaveImage("frame0.jpg",frame0);    
  7. for (i=0;i<10;i++)    
  8. {    
  9.   frame2=cvQueryFrame(capture);    
  10. }    
  11. frame1=cvCloneImage(frame0);    
  12. cvSaveImage("frame2.jpg",frame2);    
  13. cvSaveImage("frame1.jpg",frame1);    

    两段代码显示的结果不一样,前一段代码中,frame1与frame0不相同,却与frame2相同,后一段代码则可实现正常的复制功能,这是因为cvQueryFrame返回的内存区域是由由vQueryFrame管理的,每调用一次,指针所指区域就会更新。

    个人理解:第一次调用cvQueryFrame时,frame0指针指向的是该函数返回的是第0帧图像,紧接着连续调用10次cvQueryFrame函数后。由于cvQueryFrame函数每次返回的都是同一块内存区域,因此之前的指针frame0指向的图像地址被更新和frame1一样的了,此时再调用cvCloneImage复制的就是指针frame1所指向的图像地址了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值