无法在OpenCV中读取视频文件

Unable to read video file in OpenCV

本文关键字:读取 视频 文件 OpenCV      更新时间:2023-10-16

我正在尝试捕获视频并将其存储在文件中,然后读取相同的视频文件。我能够编写它,但无法读取同一文件。在按下逃生时,该程序应该退出网络摄像头并播放录制的视频,但会显示以下错误:

mpeg1video @ 0x2a16f40] ac-tex在14 28损坏 [mpeg1video @ 0x2a16f40]警告MVS不可用 OPENCV错误:糟糕的标志(参数或结构字段)(未识别或不支持的数组类型),cvgetMat,file/home/ujjwal/downloads/opencv-2.4.0/modules/core/src/array.cpp,第2482行, 扔出" cv ::异常"的实例后终止命令 what():/home/ujjwal/downloads/opencv-2.4.0/modules/core/src/array.cpp:2482:错误:( - 206)函数cvgetmat

中未认识或不支持的阵列类型

代码是:

#include <sstream>
#include <string>
#include <iostream>
#include <opencv/highgui.h>
#include <opencv/cv.h>
using namespace cv;
int main(int argc, char* argv[])
{
    Mat inputVideo;
    Mat frame;
    Mat HSV;
    Mat tracking;
    char checkKey;
    VideoCapture capture;
    capture.open(0);
    capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    capture.set(CV_CAP_PROP_FRAME_HEIGHT,480);
    VideoWriter writer("OutputFile.mpeg", CV_FOURCC('P','I','M','1'), 50, Size(640, 480));
    while(1){
        capture.read(inputVideo);
        imshow("Original Video",inputVideo);
        writer.write(inputVideo);
        checkKey = cvWaitKey(20);
        if(checkKey == 27)
            break;
    }
    capture.open("OutputFile.mpeg");
    capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    capture.set(CV_CAP_PROP_FRAME_HEIGHT,480);
    while(1){
        capture.read(inputVideo);
        imshow("Tracking Video", inputVideo);
    }
    return 0;
}

有人可以帮我吗?谢谢!

您需要纠正几件事才能使它起作用:

  1. 您必须在窗口中显示图像之前创建窗口。

  2. 您必须关闭作者才能完成写作,然后再打开。

  3. 您需要为显示的第二张图像添加 cvWaitKey(20)(请在此处查看为什么这是必不可少的)。

整个固定代码如下:

#include <sstream>
#include <string>
#include <iostream>
#include <opencv/highgui.h>
#include <opencv/cv.h>
using namespace cv;
int main(int argc, char* argv[])
{
    Mat inputVideo;
    Mat frame;
    Mat HSV;
    Mat tracking;
    char checkKey;
    VideoCapture capture;
    capture.open(0);
    capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    capture.set(CV_CAP_PROP_FRAME_HEIGHT,480);
    VideoWriter writer("OutputFile.mpeg", CV_FOURCC('P','I','M','1'), 50, Size(640, 480));
    namedWindow("Original Video", WINDOW_AUTOSIZE );
    while(1){
        capture.read(inputVideo);
        imshow("Original Video",inputVideo);
        writer.write(inputVideo);
        checkKey = cvWaitKey(20);
        if(checkKey == 27)
            break;
    }
    writer.release();
    capture.open("OutputFile.mpeg");
    capture.set(CV_CAP_PROP_FRAME_WIDTH, 640);
    capture.set(CV_CAP_PROP_FRAME_HEIGHT,480);
    namedWindow("Tracking Video", WINDOW_AUTOSIZE );
    while(1){
        capture.read(inputVideo);
        if (!inputVideo.empty())
        {
            imshow("Tracking Video", inputVideo);
            checkKey = cvWaitKey(20);
        }
        else
            break;
    }
    return 0;
}