转载于http://blog.csdn.net/kcust/article/details/13768199
从摄像头或者文件中抓取并返回一帧
抓取后,capture被指向下一帧,可用cvSetCaptureProperty调整capture到合适的帧。函数cvQueryFrame从摄像头或者文件中抓取一帧,然后解压并返回这一帧。这个函数仅仅是函数cvGrabFrame和函数cvRetrieveFrame在一起调用的组合。返回的图像不可以被用户释放或者修改。
注意: cvQueryFrame返回的指针总是指向同一块内存(这个特点就是下面的问题所在!)。建议cvQueryFrame后拷贝一份。而且返回的帧需要FLIP后才符合OPENCV的坐标系。
若返回值为NULL,说明到了视频的最后一帧。
以下代码:
两段代码显示的结果不一样,前一段代码中,frame1与frame0不相同,却与frame2相同,后一段代码则可实现正常的复制功能,这是因为cvQueryFrame返回的内存区域是由由vQueryFrame管理的,每调用一次,指针所指区域就会更新。
个人理解:第一次调用cvQueryFrame时,frame0指针指向的是该函数返回的是第0帧图像,紧接着连续调用10次cvQueryFrame函数后。由于cvQueryFrame函数每次返回的都是同一块内存区域,因此之前的指针frame0指向的图像地址被更新和frame1一样的了,此时再调用cvCloneImage复制的就是指针frame1所指向的图像地址了。