OpenCV--编译OpenCV4.0版本

编译及环境搭建

  • 一、搭建准备
  • 二、编译步骤
    • 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)此处注意环境变量的配置
OpenCV--编译OpenCV4.0版本_第1张图片
注:若使环境变量生效,有两种方式:

  • 设置环境变量后重启电脑
  • 打开DOS终端, 如果是设置环境变量“PATH”,则在修改完成后,在DOS窗口命令行中输入:set PATH=C: ,然后关闭DOS窗口。再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属性”->“高级”->“环境变量”中设置的 PATH 值已经生效。(DOS窗口中的环境变量只是Windows环境变量的一个副本,通过对副本的修改可以引发Windows环境变量的刷新,所以只是环境变量刷新了一次,不用担心DOS窗口中的修改会使得系统环境变量的值变成了”C:”)

2、使用CMake编译

(1)运行CMake
OpenCV--编译OpenCV4.0版本_第2张图片
(2)确定源代码路径和build路径

  • Where is the source code:选择OpenCV解压的源文件文件夹位置;
  • Where to build the binaries:选择自定义的空文件夹用于保存生成对象
    OpenCV--编译OpenCV4.0版本_第3张图片

(3)点击Configure,选择编译工具
OpenCV--编译OpenCV4.0版本_第4张图片
编译工具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++
OpenCV--编译OpenCV4.0版本_第5张图片

(4)然后Configure,选择配置选项

  • opencv配置选项详解
  • 注意勾选WITH_OPENGL和WITH_QT
  • WITH_IPP和WITH_MSMF由于编译器不支持所以不能勾选,否则会编译报错
  • 去掉ENABLE_PRECOMPILED_HEADERS
  • 配置后Configure,直到配置选项不再显示红色,就停止再次点击Configure
    OpenCV--编译OpenCV4.0版本_第6张图片

(5)点击Generate生成MakeFiles
只有配置选项不再显示红色后,再点击Generate,然后生成MakeFiles。
OpenCV--编译OpenCV4.0版本_第7张图片
(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,然后继续编译就行,最后能顺利成功!
OpenCV--编译OpenCV4.0版本_第8张图片
OpenCV--编译OpenCV4.0版本_第9张图片
OpenCV--编译OpenCV4.0版本_第10张图片
(7)install
在上一步的基础上进行install

mingw32-make install

OpenCV--编译OpenCV4.0版本_第11张图片

三、编译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、结果

OpenCV--编译OpenCV4.0版本_第12张图片

1、配置选型需要根据自己的需求调整,不然都会错,或者是编译出来的文件超级大。
2、编译中间会下载ffmpeg.dll文件,时间会长一些,有时会失败,这种情况下,可以单目下载然后放在对应的文件路径下就好。

参考

1、OpenCV3.2+Qt5.8.0+Win10环境配置
2、opencv配置选项详解
3、Windows下 Qt5.12.0 + OpenCV4.0.0 源码编译及环境配置<好>
4、windows下 Qt-Mingw32(32bit) opencv4源碼編譯
5、Qt5.11.1+ OpenCV 4.0.0 配置教程

你可能感兴趣的:(OpenCV)