Advertisement

OpenCV Learning: cvQueryFrame遇到的问题

阅读量:

原文写于2013年7月16日

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

复制代码
    IplImage* frame = cvQueryFrame( CvCapture* capture );
    
    AI写代码

在后续帧捕捉中,在随后的一段时间内将capture指向下一连续的视频画面。通过cvSetCaptureProperty方法可以将捕获设置为适当的帧率。使用cvQueryFrame函数可以从摄像头或文件中获取一帧,并对该图像进行解压处理。该功能实际上是cvGrabFrame和cvRetrieveFrame两个函数协同工作的结果。获取的图像数据不得被用户解引用或修改。

注意:该函数返回的指针始终指向同一个内存区域。在调用cvQueryFrame之后建议进行数据备份。另外需要注意的是,在获取结果之前必须对图像进行翻转才能与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);
    
    
    
    
    AI写代码
复制代码
 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);
    
    
    
    
    AI写代码

两段代码运行后的结果显示存在差异。在前一段代码中, frame1与frame0不同, 但与frame2一致;而后一段代码能够正常地执行复制操作。具体原因在于cvQueryFrame函数返回的是由vQueryFrame负责管理的一段内存区域, 并且每次函数调用后, 指针指向的位置都会被重新赋值。

全部评论 (0)

还没有任何评论哟~