📜  OpenCV |正在载入影片

📅  最后修改于: 2021-04-16 08:53:28             🧑  作者: Mango

本文旨在学习如何在OpenCV中显示视频。这样做就像显示为单个图像一样,是一个简单的任务。但是在这里,必须将循环显示的帧显示作为序列的一部分。

让我们逐行详细地了解完整的过程。

代码 :
CvCapture* capture = cvCreateFileCapture("...input\\video_file.avi");

cvCreateFileCapture()函数获取视频AVI文件的名称/路径(作为参数加载)。然后返回一个指向CvCapture结构的指针。有关视频文件的所有信息都包含在此结构中。以这种方式创建时,CvCapture结构将初始化到视频的开头。

代码 :

frame = cvQueryFrame(capture);

一旦进入while(1)循环,便开始从视频文件读取数据。 cvQueryFrame()将指向CvCapture结构的指针作为参数。然后,下一个视频帧被带入内存,该内存实际上是CvCapture结构的一部分。并且该特定框架需要指针。 cvQueryFrame使用CvCapture结构中存在的已分配内存,这与cvLoadImage为图像分配实际内存不同。因此,对于此“帧”指针,不需要调用cvReleaseImage()。释放CvCapture结构时,将释放帧图像存储器。

代码 :

c = cvWaitKey(10);
  
if (c == 27)
    break;

画面显示后等待10ms。如果用户按下特定的键,则c将被设置为所按下键的ASCII值。否则,将其设置为“ -1”。如果用户按下ESC键(ASCII值为27),则该代码将退出读取循环。否则,经过10毫秒后,将再次执行循环。

代码:使用OpenCV显示视频。

// Using OpenCV to display video
  
#include 
#include 
#include 
  
using namespace cv;
using namespace std;
  
iint main(int argc, char** argv)
{
    // creating window
    cvNamedWindow("Display_video", CV_WINDOW_AUTOSIZE);
  
    // loading video
    CvCapture* capture = cvCreateFileCapture("..input\\tree.avi");
    IplImage* frame;
  
    while (1) {
        frame = cvQueryFrame(capture);
  
        if (!frame)
            break;
  
        cvShowImage("Display_video", frame);
  
        char c = cvWaitKey(0);
  
        if (c == 27)
            break;
    }
    cvReleaseCapture(&capture);
  
    // destroying window
    cvDestroyWindow("Display_video");
}

输出 :

VIDEO OUTPUT IN THE DISPLAY WINDOW

在上面的代码中,我们实际上是以非常智能的方式控制视频的速度,我们仅依靠cvWaitKey()中的计时器来控制要加载的帧的速度。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”