OpenCV VideoCapture工作不一致

时间:2018-08-19 17:16:57

标签: c++ opencv video-capture codec

我一直在尝试使用OpenCV来运行我的应用程序一段时间,而我似乎无法解决的一个长期错误是:

问题:

OpenCV的VideoCapture在将视频分为不同文件格式和编解码器的帧中不一致。

详细信息:

我的错误出现在应用程序的一部分中:将视频分成帧。当我为VideoCapture选择有效目录并打开它时,存在三种当前方案。要么:

  • 打开并完美运行。

  • 能够打开VideoCapture(cap.isOpened()= true),但是在帧拆分期间会收到一两个空帧,这会导致应用抛出错误。

  • 完全不打开。

给定的视频只会做这三件事之一。但是,AVI文件格式似乎存在大多数错误。

已尝试解决:

  • 完整安装K-Lite编解码器包

  • 在项目目录和PATH中放入OpenCV_FFMPEG.dll和OpenCV_FFMPEG_64.dll

我唯一能想到的解释是这与我安装OpenCV和FFmpeg的方式有关。

任何帮助将不胜感激!谢谢。

顺便说一句,我正在运行Qt 5.8.0和OpenCV 3.2.0,这是我的FrameSplit代码。

vector<int> mainFrame::frameSplit(string filename, string location)
{

//Extract + Save Frames

string vidDir = filename;
string locationDir = location + "/frames/";
VideoCapture cap(vidDir);

if (!cap.isOpened())
{
    qDebug() << "OO";
    return {};
}
else
{
    Mat firstFrame;
    Mat nextFrame;
    Mat frame;
    int count = 1;

    QProgressDialog progress("Extracting files...", "Abort", 0, cap.get(CV_CAP_PROP_FRAME_COUNT));
    progress.setWindowModality(Qt::WindowModal);
    progress.setAttribute(Qt::WA_DeleteOnClose, true);
    progress.setFixedSize(500, 100);
    progress.show();

    vector<int> compression_params;
    compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
    compression_params.push_back(100);
    qDebug() << cap.get(CV_CAP_PROP_FRAME_COUNT);
    bool failure = false;

    for (count = 1; count < cap.get(CV_CAP_PROP_FRAME_COUNT); count++)
    {
        cap >> frame;
        if(frame.empty()) {
            QMessageBox messageBox;
            messageBox.critical(this, "Error", "There was an error in analyzing the video. Please try and install the appropriate codecs and try again.");
            messageBox.setFixedSize(600,400);
            vector<int> empty;
            return empty;
        }

        string filePath = locationDir + to_string(count) + ".jpg";
        imwrite(filePath,frame,compression_params);
        progress.setValue(count);
    }

    progress.setValue(count);
    progress.close();
    vector<int> props;
    props.push_back(cap.get(CV_CAP_PROP_FRAME_COUNT));
    props.push_back(round(cap.get(CV_CAP_PROP_FPS)));
    props.push_back(cap.get(CV_CAP_PROP_FRAME_WIDTH));
    props.push_back(cap.get(CV_CAP_PROP_FRAME_HEIGHT));

    qDebug() << props[0];

    return props;
}

}

0 个答案:

没有答案