cvQueryFrame

从摄像头或者文件中抓取并返回一帧
<pre>
IplImage* cvQueryFrame( CvCapture* capture );
</pre>
;capture : 视频获取结构。

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


注意: cvQueryFrame返回的指针总是指向同一块内存。建议cvQueryFrame后拷贝一份。而且返回的帧需要FLIP后才符合OPENCV的坐标系。
若返回值为NULL,说明到了视频的最后一帧。

以下代码: 
IplImage* frame0 = 0; 
IplImage* frame1=0; 
IplImage* frame2=0; 

frame0 = cvQueryFrame( capture ); 
cvSaveImage("frame0.jpg",frame0); 
for (i=0;i<10;i++) 

frame2=cvQueryFrame(capture); 

frame1=cvCloneImage(frame0); 
cvSaveImage("frame2.jpg",frame2); 
cvSaveImage("frame1.jpg",frame1); 

奇怪的是,frame1.jpg与frame0.jpg不相同,frame1.jpg反而与frame2.jpg一样,为什么会出现这种情况?

因为:
cvQueryFrame 返回的内存区域是由cvQueryFrame管理的。 
每调用一次指针所指区域就会更新。 
for (i=0;i<10;i++) 

frame2=cvQueryFrame(capture); 

frame1=cvCloneImage(frame0); <-这句在调用11此之后 
当然和frame2一样了。 

而如下代码则可以正常实现目的。
IplImage* frame0 = 0;
IplImage* frame1=0;
IplImage* frame2=0;

frame0 = cvQueryFrame( capture );
cvSaveImage("frame0.jpg",frame0);
frame1=cvCloneImage(frame0); //提到前面就行了.
for (i=0;i<10;i++)
{
frame2=cvQueryFrame(capture);
}
cvSaveImage("frame2.jpg",frame2);
cvSaveImage("frame1.jpg",frame1); 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值