Qt环境下配置opencv(全面)

工具下载

下载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版本。

环境变量配置

安装完软件要进行环境变量的配置。
红色框是较为重要的路径
如果没有安装MinGW的话也不影响,只要安装Qt的时候勾选上就行。QT的安装这里就不赘述了。

Cmake Gui编译配置介绍

打开Cmake
在这里插入图片描述
点击configure后会有一个错误提示的话点确定即可。
在这里插入图片描述
在这里插入图片描述
点next.
在这里插入图片描述
完成后就开始编译了。
在这里插入图片描述

在这里插入图片描述
完成后开始配置红色区域的选项。

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的文件路径找不到,我们来添加它。


注意要点击后边的三个点的位置添加,然要改成反斜杠
在这里插入图片描述
全部添加完成后继续点击configure.
在这里插入图片描述
还有一个,我们继续添加。添加后继续configure.

在这里插入图片描述
在这里插入图片描述
把这个勾去掉后(不取消后面会报错,但是可以生成),我们开始点击generate.
在这里插入图片描述
cmake编译部分全部结束。

mingw32-make 编译安装

首先打开命令行,cd到刚才编译的目录。
在这里插入图片描述

接着
在这里插入图片描述

在这里插入图片描述
再编译到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的是刚才编译生成的路径。
配置好后就可以尝试一下调用摄像头了。
借用一下别人的项目文件
摘自:
https://blog.csdn.net/matt45m/article/details/88976791

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();
    }
}


效果

在这里插入图片描述

至此全部结束。

小结

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

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值