Qt环境下配置opencv

  • 工具下载
  • 环境变量配置
  • Cmake Gui编译配置介绍
  • mingw32-make 编译安装
  • Qt环境配置
  • 效果
  • 小结


工具下载

下载Qt,Cmake,opencv源码。
http://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe

https://github.com/Kitware/CMake/releases/download/v3.18.2/cmake-3.18.2-win64-x64.msi opencv这里用的是3.4.0版本。

环境变量配置

安装完软件要进行环境变量的配置。

qt opencv python效率 qt 配置opencv_计算机视觉


如果没有安装MinGW的话也不影响,只要安装Qt的时候勾选上就行。QT的安装这里就不赘述了。

Cmake Gui编译配置介绍

打开Cmake

qt opencv python效率 qt 配置opencv_cmake_02


点击configure后会有一个错误提示的话点确定即可。

qt opencv python效率 qt 配置opencv_opencv_03


qt opencv python效率 qt 配置opencv_cmake_04


点next.

qt opencv python效率 qt 配置opencv_cmake_05


完成后就开始编译了。

qt opencv python效率 qt 配置opencv_qt opencv python效率_06

qt opencv python效率 qt 配置opencv_qt_07


完成后开始配置红色区域的选项。

Many red lines will appear To the search field enter one by one:
WITH_QT, WITH_TBB, WITH_IPP, WITH_CUDA, CMAKE_BUILD_TYPE WITH_QT -
must be selected. WITH_TBB, WITH_IPP, WITH_CUDA - must be unselected
CMAKE_BUILD_TYPE - click and enter a text “Debug” (without quotes).
Clear the text from the Search field.

摘自:

https://stackoverflow.com/questions/15881913/how-to-link-opencv-in-qtcreator-and-use-qt-library 选项配置完成后再次点击configure

qt opencv python效率 qt 配置opencv_qt_08


qt opencv python效率 qt 配置opencv_cmake_09


这是由于Qt的文件路径找不到,我们来添加它。

qt opencv python效率 qt 配置opencv_qt_10


注意要点击后边的三个点的位置添加,然要改成反斜杠

qt opencv python效率 qt 配置opencv_计算机视觉_11


全部添加完成后继续点击configure.

qt opencv python效率 qt 配置opencv_opencv_12


还有一个,我们继续添加。添加后继续configure.

qt opencv python效率 qt 配置opencv_opencv_13


qt opencv python效率 qt 配置opencv_qt_14


把这个勾去掉后(不取消后面会报错,但是可以生成),我们开始点击generate.

qt opencv python效率 qt 配置opencv_qt_15


cmake编译部分全部结束。

mingw32-make 编译安装

首先打开命令行,cd到刚才编译的目录。

qt opencv python效率 qt 配置opencv_qt opencv python效率_16

接着

qt opencv python效率 qt 配置opencv_qt opencv python效率_17

qt opencv python效率 qt 配置opencv_qt opencv python效率_18


再编译到videoio这个模块的时候会报错。

解决方案为:

在opencv的源码文件cap_dshow.cpp中添加

#define STRSAFE_NO_DEPRECATE

添加后再次执行刚才的命令,编译到100%后就成功了。

Qt环境配置

新建项目就不多说了。
主要在 .pro文件里进行修改。

INCLUDEPATH += C:/opencv/build/include
INCLUDEPATH += C:/opencv/build/include/opencv
INCLUDEPATH += C:/opencv/build/include/opencv2
LIBS += C:/Users/Administrator/Downloads/Compressed/opencv/lib/libopencv_*.a
CONFIG(debug, debug|release): {
LIBS += -LC:/Users/Administrator/Downloads/Compressed/opencv/lib \
-lopencv_core340d \
-lopencv_imgproc340d \
-lopencv_highgui340d \
-lopencv_ml340d \
-lopencv_video340d \
-lopencv_features2d340d \
-lopencv_calib3d340d \
-lopencv_objdetect340d 
-lopencv_flann340d
} else:CONFIG(release, debug|release): {
LIBS += -LC:/Users/Administrator/Downloads/Compressed/opencv/lib \
-lopencv_core340d \
-lopencv_imgproc340d \
-lopencv_highgui340d \
-lopencv_ml340d \
-lopencv_video340d \
-lopencv_features2d340d \
-lopencv_calib3d340d \
-lopencv_objdetect340d \
-lopencv_flann340d
}

其中包含include的路径是源码的路径,包含lib的是刚才编译生成的路径。
配置好后就可以尝试一下调用摄像头了。
借用一下别人的项目文件
摘自:

mainwindow.h文件。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <QTimer>

using namespace cv;
using namespace std;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    //Mat转QLabel
    QImage MatImageToQt(const Mat &src);
    ~MainWindow();

private slots:
    void readFarme();
    void on_Open_triggered();
    void on_Stop_triggered();

private:
    Ui::MainWindow *ui;
    VideoCapture cap;
    Mat src_image;
    QTimer *timer;
    QImage *image;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    image = new QImage();
    connect(timer,SIGNAL(timeout()),this,SLOT(readFarme()));
    connect(ui->Open,SIGNAL(clicked()),this,SLOT(on_Open_triggered()));
    connect(ui->Stop,SIGNAL(clicked()),this,SLOT(on_Stop_triggered()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_Open_triggered()
{
    cap.open(0);
    timer->start(33);
}

void MainWindow::on_Stop_triggered()
{
    // 停止读取数据。
    timer->stop();
    cap.release();
    ui->cameraView->clear();
}

void MainWindow::readFarme()
{
    cap.read(src_image);

    QImage imag = MatImageToQt(src_image);
    ui->cameraView->setPixmap(QPixmap::fromImage(imag));
}

//Mat转成QImage
QImage MainWindow::MatImageToQt(const Mat &src)
{
    //CV_8UC1 8位无符号的单通道---灰度图片
    if(src.type() == CV_8UC1)
    {
        //使用给定的大小和格式构造图像
        //QImage(int width, int height, Format format)
        QImage qImage(src.cols,src.rows,QImage::Format_Indexed8);
        //扩展颜色表的颜色数目
        qImage.setColorCount(256);

        //在给定的索引设置颜色
        for(int i = 0; i < 256; i ++)
        {
            //得到一个黑白图
            qImage.setColor(i,qRgb(i,i,i));
        }
        //复制输入图像,data数据段的首地址
        uchar *pSrc = src.data;
        //
        for(int row = 0; row < src.rows; row ++)
        {
            //遍历像素指针
            uchar *pDest = qImage.scanLine(row);
            //从源src所指的内存地址的起始位置开始拷贝n个
            //字节到目标dest所指的内存地址的起始位置中
            memcmp(pDest,pSrc,src.cols);
            //图像层像素地址
            pSrc += src.step;
        }
        return qImage;
    }
    //为3通道的彩色图片
    else if(src.type() == CV_8UC3)
    {
        //得到图像的的首地址
        const uchar *pSrc = (const uchar*)src.data;
        //以src构造图片
        QImage qImage(pSrc,src.cols,src.rows,src.step,QImage::Format_RGB888);
        //在不改变实际图像数据的条件下,交换红蓝通道
        return qImage.rgbSwapped();
    }
    //四通道图片,带Alpha通道的RGB彩色图像
    else if(src.type() == CV_8UC4)
    {
        const uchar *pSrc = (const uchar*)src.data;
        QImage qImage(pSrc, src.cols, src.rows, src.step, QImage::Format_ARGB32);
        //返回图像的子区域作为一个新图像
        return qImage.copy();
    }
    else
    {
        return QImage();
    }
}

效果

qt opencv python效率 qt 配置opencv_opencv_19

至此全部结束。

小结

ps:配置这个环境用了两天时间,第一天弄看的一个B站的视频,有很多细节没有讲到。身边也没有人用过这个,就一直自己捣鼓,好在现在弄好了。后面的学习路还有很长希望能和大家一起交流。