本人版本:
opencv:4.2.0
Qt:5.12.12
查看版本:
cout << "opencv version:" << CV_VERSION <<endl;
cout << "Qt version:" << qVersion()<<endl;
1.问题描述,在MainWindow构造函数中写入以下读取视频的代码一直返回false,十分令人郁闷。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Mat M(2,2,CV_8UC3,Scalar(0,0,255));
// cout<<"M = "<<endl;
// cout<<M<<endl;
VideoCapture v;
Mat frame;
v.open("D:/1.MP4");
if(v.isOpened())
{
qDebug()<<"chenggong";
}
else
{
qDebug()<<"shibai";
}
cout<<v.isOpened()<<endl;
v>>frame;
imshow("img",frame);
}
2.问题原因
由于采用的是CMake编译的opencv源码,在编译过程中,我们可以打开opencv-build编译目标文件夹目录下查看CMakeDownloadLog.txt文件,会有FFMPEG Download下载失败的日志信息,这是因为FFMPEG的下载仓库在国外网站,导致下载失败。而没有正确编译出FFMPEG的动态链接库。详细可参考以下博客:
Qt下opencv的配置_qt配置opencv_weixin_45773010的博客-CSDN博客
3.解决办法
详细参考这篇文章:
Windows 10下配置OpenCV 4.2.0生成Visual Studio 2019的构建方案 - 哔哩哔哩
3.1下面是下载ffmpeg的文件。打开源码目录 E:\软件安装包\opencv环境\opencv\sources\3rdparty\ffmpeg\fmpeg.cmake文件
可以从第一行看到对应的ffmpeg版本号为20191119。
接下来从国内Gitcode网站文件 · ffmpeg/master_20191119 · OpenCV / opencv_3rdparty · GitCodeOpenCV - 3rdparty 🚀 Github 镜像仓库 🚀 源项目地址 ⬇ https://gitcode.net/opencv/opencv_3rdparty/-/tree/ffmpeg/master_20191119找到对应的版本手动下载。
下载解压缩后会得到ffmpeg_version.cmake,opencv_videoio_ffmpeg.dll,opencv_videoio_ffmpeg_64.dll 三个文件
将他们复制到源码E:\软件安装包\opencv环境\opencv\sources\.cache\ffmpeg目录下,并按照此目录下的文件名重命名。
再次点击Configure之后,日志文件中红色消失,最后点击Generate,下面可按照博客Qt配置OpenCV教程,亲测已试过(详细版)_Wi~的博客-CSDN博客
中的内容继续编译配置。
配置完成后重新打开Qt Creator新建一个项目进行读取视频测试,就可以正确打开视频文件了!
需要在.pro文件中添加:
INCLUDEPATH += D:\opencv-build\install\include
LIBS += D:\opencv-build\lib\libopencv_*.a
在mainwindow.cpp文件中引入opencv头文件并在构造函数中书写测试代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<QDebug>
using namespace cv;
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Mat M(2,2,CV_8UC3,Scalar(0,0,255));
// cout<<"M = "<<endl;
// cout<<M<<endl;
VideoCapture v;
Mat frame;
v.open("D:/1.MP4");
if(v.isOpened())
{
qDebug()<<"chenggong";
}
else
{
qDebug()<<"shibai";
}
cout<<v.isOpened()<<endl;
v>>frame;
imshow("img",frame);
}
MainWindow::~MainWindow()
{
delete ui;
}
最终程序运行如下:
正确读取到视频并显示第一帧的画面!
所需用到的依赖百度网盘地址链接:
链接:https://pan.baidu.com/s/1YtrCDH-hTU176rJvQ_XFQQ
提取码:x18s