编译及环境搭建
- 一、搭建准备
- 二、编译步骤
- 1、安装好Qt和CMake
- 2、使用CMake编译
- 三、编译contrib
- 四、测试
- 1、Qt工程
- 2、结果
- 注
- 参考
一、搭建准备
1、IDE
(1)在win10下使用Qt5.10.1
(2)Qt安装包链接 (3)鉴于网上安装教程很多,安装步骤见链接。
2、OpenCV
(1)点击4.0.0版本下载 3、编译工具
(1)CMake-gui,对应CMake下载链接 (2)Qt中tool下的gcc、g++,Qt安装并配置好环境后,对应的安装目录下tool文件夹便有相应的编译工具gcc、g++。
二、编译步骤
1、安装好Qt和CMake
(1)此处注意环境变量的配置
注:若使环境变量生效,有两种方式:
- 设置环境变量后重启电脑
- 打开DOS终端, 如果是设置环境变量“PATH”,则在修改完成后,在DOS窗口命令行中输入:set PATH=C: ,然后关闭DOS窗口。再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属性”->“高级”->“环境变量”中设置的 PATH 值已经生效。(DOS窗口中的环境变量只是Windows环境变量的一个副本,通过对副本的修改可以引发Windows环境变量的刷新,所以只是环境变量刷新了一次,不用担心DOS窗口中的修改会使得系统环境变量的值变成了”C:”)
2、使用CMake编译
(1)运行CMake
(2)确定源代码路径和build路径
- Where is the source code:选择OpenCV解压的源文件文件夹位置;
- Where to build the binaries:选择自定义的空文件夹用于保存生成对象
(3)点击Configure,选择编译工具
编译工具c和c++对应Qt中的GCC和G++:
D:\Qt\Qt5.8.0\Tools\mingw530_32\bin\gcc
D:\Qt\Qt5.8.0\Tools\mingw530_32\bin\g++
(4)然后Configure,选择配置选项
- opencv配置选项详解
- 注意勾选WITH_OPENGL和WITH_QT
- WITH_IPP和WITH_MSMF由于编译器不支持所以不能勾选,否则会编译报错
- 去掉ENABLE_PRECOMPILED_HEADERS
- 配置后Configure,直到配置选项不再显示红色,就停止再次点击Configure
(5)点击Generate生成MakeFiles
只有配置选项不再显示红色后,再点击Generate,然后生成MakeFiles。
(6)make
- 打开CMD窗口,进入生成OpenCV目标文件的文件夹,输入mingw32-make开始编译,时间长短由电脑性能而定
- 博主在DOS下进入自己的路径C:\Users\wse\Desktop\build输入如下,为了快速编译可以 + j8 (多线程编译,具体数字根据电脑定)
mingw32-make -j8
在60%处容易出错如下图,解决办法是在opencv-4.0.0\modules\videoio\src\cap_dshow.cpp中加入宏定义#define NO_DSHOW_STRSAFE,然后继续编译就行,最后能顺利成功!
(7)install
在上一步的基础上进行install
mingw32-make install
三、编译contrib
1、下载contrib,将该文件夹下需要的模块保留
2、在编译OpenCV的时候,配置选项OPENCV_EXTRA_MODULES_PATH加上该路径就行。
四、测试
1、Qt工程
#include "camera.h"
#include "ui_camera.h"
Camera::Camera(QWidget *parent) :
QWidget(parent),
ui(new Ui::Camera)
{
ui->setupUi(this);
timer = new QTimer(this);
/*信号和槽*/
connect(timer, SIGNAL(timeout()), this, SLOT(readFrame())); // 时间到,读取当前摄像头信息
}
Camera::~Camera()
{
delete ui;
delete ∩
delete &writer;
}
void Camera::readFrame()
{
cap >> frame;
image = Mat2QImage(frame);
QImage scaleImage = ScaleImage2Label( image, ui->lb_display ); // 显示到label上
ui->lb_display->setPixmap(QPixmap::fromImage(scaleImage));
ui->lb_display->setAlignment(Qt::AlignCenter);
ui->lb_display->show();
}
QImage Camera::Mat2QImage(cv::Mat& cvImg)
{
QImage qImg;
if(cvImg.channels()==3) //3 channels color image
{
cv::cvtColor(cvImg,cvImg,CV_BGR2RGB);
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
else if(cvImg.channels()==1) //grayscale image
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8);
}
else
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
return qImg;
}
QImage Camera::ScaleImage2Label(QImage qImage, QLabel* qLabel)
{
QImage qScaledImage;
QSize qImageSize = qImage.size();
QSize qLabelSize = qLabel->size();
double dWidthRatio = 1.0*qImageSize.width() / qLabelSize.width();
double dHeightRatio = 1.0*qImageSize.height() / qLabelSize.height();
if (dWidthRatio>dHeightRatio)
{
qScaledImage = qImage.scaledToWidth(qLabelSize.width());
}
else
{
qScaledImage = qImage.scaledToHeight(qLabelSize.height());
}
return qScaledImage;
}
void Camera::on_pushButton_clicked()
{
cap.open(0);
timer->start(40); // 开始计时,超时则发出timeout()信号
}
void Camera::on_pushButton_2_clicked()
{
timer->stop(); // 停止读取数据。
applicationExiting = true;
}
2、结果
注
1、配置选型需要根据自己的需求调整,不然都会错,或者是编译出来的文件超级大。
2、编译中间会下载ffmpeg.dll文件,时间会长一些,有时会失败,这种情况下,可以单目下载然后放在对应的文件路径下就好。