当前位置: 首页 > news >正文

2023-02-20 Qt 5.13.1 + OpenCV 4.5.4环境编译

引言

OpenCV图像处理在Qt中编译记录。
之前一直是在Python中使用OpenCV,Python中使用某些模块使用pip工具很容易将对应的模块安装在系统中。根据项目需求项目都要转移在国产化中使用,为了适应国产化需求,将代码转移到Qt开发环境中,Qt使用OpenCV需要使用源码编译对应的库文件,在这里做个记录。

OpenCV网站也有对应在Windows环境中已经编译好的安装包,我也下载安装了,但是在使用过程中还是有问题。根据笔者编译后的心得,OpenCV编译后的库是根编译器有关的,不知道官网中使用的什么编译器,也只是编译好了,如果你系统中的编译环境与那个一样,那么也许正好就能用了。笔者这里使用的是安装Qt时自身的编译环境MinGW730_64。这个环境使用OpenCV预编译的就用不成,具体啥原因也还不清楚,这里就不过多的折腾,那么就根据自己的开发环境来编译一套OpenCV的库。

笔者的环境是Windows 10,Qt5.13.1,OpenCV4.5.4,编译工具cmake3.25.2。

在Python中使用笔者使用的是OpenCV4.5.5,所以刚开始也想编译OpenCV4.5.5,但是一直不成功,看到有网友说是:该版本的protobuf版本为3.19,使用的Qt5.13.1自带的MinGW编译会报错误编译不过去。这是由于protobuf这个版本太新了,Qt5.13.1中MinGW的gcc版本还不支持这种C++新语法,所以我再去查看OpenCV 4.5.4版本中protobuf版本发现是3.5.1,这个版本旧没有用到C++语法的新特性,所以编译没有出现问题。因此笔者也编译了4.5.4。

文件准备

下载Qt:https://download.qt.io/archive/qt/5.13/5.13.1/

2023-02-20_162344.png

下载OpenCV源码:https://codeload.github.com/opencv/opencv/zip/refs/tags/4.5.4

2023-02-20_164038.png

下载opencv_contrib源码:https://codeload.github.com/opencv/opencv_contrib/zip/refs/tags/4.5.4

2023-02-20_164122.png

下载cmake:https://cmake.org/download/

2023-02-20_164206.png

下载完成后你将得到以下文件

2023-02-20_164539.png

版本

名称版本
OSWindows 10
Qt5.13.1
Qt Creator4.10.0
OpenCV4.5.4
opencv_contrib4.5.4
cmake3.25.2

安装

注意事项

在使用cmake时会需要联网下载一些文件,所以你的电脑是需要互联网的。如果是局域网环境不方便上网,那你可以找一台可以上网的电脑,根据局域网电脑的软件环境编译一套OpenCV库,再通过别的方式拷贝到局域网点中,编译完成后就是一些库文件是可以转移的,当然转移后也记得配置环境变量。

环境准备

首先你要安装Qt,这里安装过程不做介绍,主要要安装MinGW编译器。我想你既然要在Qt中使用OpenCV,那么你对Qt的认识肯定可以跳过这一步,如果你也是新手,那么你可以先看一下其他关于Qt安装的内容。

2023-02-20_164843.png

上文中下载的cmake是一个绿色版的压缩包,解压出来就可以用。

2023-02-20_164832.png

OpenCV和opencv_contrib也是2个源码压缩包,准备你的目录将2个压缩包解压出来,笔者是在D盘下创建opencv文件夹,将2个压缩包解压在这个文件夹内。需要注意的是路径不要有空格等特殊字符

2023-02-20_164949.png

完成上述操作后配置环境变量,这里配置2个Qt的MinGW的和一个cmake的,具体路径按照你的安装路径来。

2023-02-20_165218.png

编译OpenCV

可以先看一下上文中解压出来的OpenCV源码文件夹里面的内容,因为后面我们编译后编译的文件会在这里,至少你要知道编译后你得到了哪些文件。

2023-02-20_165709.png

打开cmake的可视化工具cmake-gui.exe

2023-02-20_165847.png
2023-02-20_165939.png

我们要操作的就是如下几个位置,在where is the source code选择上文中解压的OpenCV源码的文件夹。where to build the binaries选择你要将OpenCV编译到哪个文件夹,笔者这里选择在源码文件夹中创建一个build文件夹,在每编译的时候这个文件夹里面还没有内容。

2023-02-20_170328.png
2023-02-20_170340.png

点击configure,选择你的编译器

2023-02-20_170514.png

下一步选择C和C++编译器,这里选择你Qt安装文件夹中Qt自带的gcc和g++。

2023-02-20_170705.png
2023-02-20_170733.png
2023-02-20_170855.png

点击finish,cmake进入配置环节,配置环节会出现一些错误,笔者看很多人说的都不一样,有很多其实不用管的,比如这里的红色警告,笔者就没有管,当然后面还有的是需要修改的。

2023-02-20_170926.png

等待一会出现configuring done日志后就配置完成,此时cmake会有很多红色警告,这里不用管。

2023-02-20_171257.png

在这里我们添加opencv_contrib扩展,在search位置输入OPENCV_EXTRA_MODULES_PATH搜索OpenCV扩展模块,填入opencv_contrib扩展的modules文件夹路径,

2023-02-20_171455.png
2023-02-20_171650.png

再搜索WITH_QT,默认是不选中的,这里我们选中它

2023-02-20_171745.png

再搜索WITH_OPENGL,默认是不选中的,我们选中它

2023-02-20_171858.png

再点击configure,进行配置

2023-02-20_172102.png

等一会出现配置完成。

再次进入配置选项界面,有网友说继续配置QT_QMAKE_EXECUTABLE属性,但是笔者这里搜索不出来这个属性,因此跳过。

2023-02-20_172436.png

继续搜索Qt5_DIR属性,有网友说是要配置到Qt/Qtxxx/xxx/mingwxxx/bin/qmake.exe这个qmake文件,但是在选择的时候这个属性很明显是需要一个文件夹,而不是一个文件。因此对这个属性进行说明,笔者这里找到这个属性,看了一下默认的配置属性,主机上是有这个文件夹的,因此没有修改,就使用默认的配置属性

2023-02-20_172620.png
2023-02-20_172454.png
2023-02-20_172845.png

再点击configure,等一会出现配置完成并且cmake中没有红色错误就说明配置成功(如果你看到配置成功日志,那就多执行几次configure)。

2023-02-20_173028.png

再次查看build文件夹,里面已经有一些文件了。

2023-02-20_173209.png

点击generate生成工程文件

2023-02-20_173618.png
2023-02-20_173634.png

再看build文件夹又会多一些新的文件

2023-02-20_173816.png

在cmd命令行中进入到build路径,执行命令mingw32-make进行编译,这个命令可以添加参数-j 8,表示开启8线程同时编译,这样会增加电脑CPU的使用率从而加快速度。笔者这里使用的编译命令就是:

mingw32-make -j 8
2023-02-21_085613.png

编译需要等一会,过程中会出现一些如下的错误日志,都不用管

2023-02-21_085827.png
2023-02-21_090214.png
2023-02-21_091212.png

出现如下日志说明构建完成

2023-02-21_091422.png

构建完成后继续在build路径下执行命令mingw32-make install进行安装,此时就默认安装在../build/install文件夹中。

2023-02-21_091637.png
2023-02-21_091718.png
2023-02-21_091821.png

等待命令执行完成,在看build文件夹中出现了install文件夹,说明安装成功,后面就可以使用了。

2023-02-21_091856.png

使用

环境变量

将上文中安装的路径配置到环境变量中

2023-02-21_092026.png

Qt5.13.1使用

使用Qt Creator创建一个工程,笔者这里命名OpenCV2。

2023-02-21_092237.png

build system选择默认的qmake

2023-02-21_092317.png

details可以默认

2023-02-21_092325.png

kits选择注意要选择MinGW,因为我们使用的是MinGW编译的OpenCV,这也是我们编译的目的。而且要注意版本,比如笔者电脑上装了一个Qt5.13.1,装了一个Qt5.4.1,所以这里的kits选项就出现了2个MinGW,因为我们是使用Qt5.13.1中的MinGW进行编译的,所以这里要选择Qt5.13.1的MinGW。

2023-02-21_092345.png

剩下的就是默认,我们能看到初始化的代码,并且程序能运行启动我们的初始化窗口。

2023-02-21_092835.png

在pro文件中添加OpenCV的库链接。在pro文件的最后添加2行链接代码,这里的路径填写你自己电脑上面的路径地址

INCLUDEPATH += D:\opencv\opencv-4.5.4\build\install\include
LIBS += -L D:\opencv\opencv-4.5.4\build\install\x64\mingw\lib\libopencv_*.a
2023-02-21_093020.png

在主界面中添加使用OpenCV的代码,这里的代码是使用OpenCV读取本地的一张图像,在Qt主窗口中将这个图像显示出来。其中使用到一个Mat2QImage函数,这个函数是因为OpenCV读取的图像是Mat对象,需要转成QImage对象。

2023-02-21_102510.png
#include "widget.h"
#include "ui_widget.h"#include "QDebug"#include <QImage>
#include <QLabel>
#include <opencv2/opencv.hpp>
#include <opencv2/core/mat.hpp>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("Qt OpenCV 图像显示");//OpenCV读取本地图像cv::Mat src = cv::imread("D:/dr.jpg");QImage img = Mat2QImage(src);img = img.scaled(img.width()/2, img.height()/2);QPixmap pixmap = QPixmap::fromImage(img);QLabel *label = new QLabel();label->setParent(this);label->setPixmap(pixmap);this->window()->resize(img.width(), img.height());
}Widget::~Widget()
{delete ui;
}/*** OpenCV 的Mat类型图像转Qt中的QImage* @brief Widget::Mat2QImage* @param mat* @return*/
QImage Widget::Mat2QImage(cv::Mat mat)
{const unsigned char* data = mat.data;int width = mat.cols;int height = mat.rows;int bytesPerLine = static_cast<int>(mat.step);switch(mat.type()){//ARGBcase CV_8UC4:{QImage image(data, width, height, bytesPerLine, QImage::Format_ARGB32);return image;}//BGRcase CV_8UC3:{QImage image(data, width, height, bytesPerLine, QImage::Format_RGB888);//swap blue and red channelreturn image.rgbSwapped();}//Gray shalecase CV_8UC1:{QImage image(data, width, height, bytesPerLine, QImage::Format_Grayscale8);return image;}//default:{//Unsupported formatqDebug()<<"Unsupported cv::Mat type:"<<mat.type()<<", Empty QImage will be returned!";return QImage();}}
}
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <opencv2/opencv.hpp>
#include <opencv2/core/mat.hpp>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private:Ui::Widget *ui;QImage Mat2QImage(cv::Mat src);
};
#endif // WIDGET_H

相关文章:

2023-02-20 Qt 5.13.1 + OpenCV 4.5.4环境编译

引言 OpenCV图像处理在Qt中编译记录。 之前一直是在Python中使用OpenCV&#xff0c;Python中使用某些模块使用pip工具很容易将对应的模块安装在系统中。根据项目需求项目都要转移在国产化中使用&#xff0c;为了适应国产化需求&#xff0c;将代码转移到Qt开发环境中&#xff0c…...

波次分拣系统

一、系统架构&#xff1a; v1.2基站软件管理系统仓库标签v1.4仓库标签二、系统简介&#xff1a; 标签系统主要由标签服务器&#xff0c;基站&#xff0c;电子标签前三部分组成&#xff0c;操作界面借助于京东仓库已有的作业电脑来实现&#xff0c;标签服务器与WMS进行数据对接。…...

【Servlet篇】Request请求转发详细解读

文章目录1. 前言2. 实战案例3. 特点1. 前言 请求转发是一种在服务器内部的资源跳转方式&#xff0c;如图&#xff1a; 上图的大致过程为&#xff0c;浏览器发送请求给服务器&#xff0c;服务器中 a 资源接收到请求&#xff0c;资源 a 处理完请求后将请求发送给资源 b&#xff…...

vector

目录 vector的成员函数&#xff1a; at&#xff1a; ​编辑 size&#xff1a; assign&#xff1a;赋值 insert find&#xff1f; erase swap shrink_to_fit ​编辑 vector的模拟实现&#xff1a; vector的框架&#xff1a; 构造函数&#xff1a; size和capacity r…...

LeetCode——104. 二叉树的最大深度

一、题目 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/maximum…...

漫画 | Python是一门烂语言?

这个电脑的主人是个程序员&#xff0c;他相继学习了C、Java、Python、Go&#xff0c; 但是似乎总是停留在Hello World的水平。 每天晚上&#xff0c;夜深人静的时候&#xff0c;这些Hello World程序都会热火朝天地聊天但是&#xff0c;这一天发生了可怕的事情随着各个Hello wor…...

2023.2 新方案 java代码混淆 java加密 字符串加密

Java字节码可以反编译&#xff0c;特别是创业公司,很好的项目很容易被别人破解反编译,造成很严重的损失,所以本混淆方案能很好的保护源码,而且在不断迭代,增强混淆效果,异常问题处理,达到保护项目的目的&#xff1a; 本次升级包括: 2023年02年19日 : ht-confusion-project-1.8…...

Swift 周报 第二十三期

前言 本期是 Swift 编辑组自主整理周报的第十四期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布&#xff0c;欢迎志同道合的朋友一起加入周报整理。 勇敢是即便知道好结局不会每每降临在…...

android系统屏幕旋转角度,应用界面横竖屏,设备旋转角度,三者的区别以及使用。

注意区分以下三种概念的区别&#xff01;&#xff01;&#xff01;。以及使用这三种方式判断横竖屏的方式。系统屏幕旋转角度fun getSystemRotation(): Int {val angle (getSystemService(WINDOW_SERVICE) as WindowManager).defaultDisplay.rotation//系统屏幕旋转的角度值re…...

【华为云-开发者专属集市】DevCloud+ECS、MySQL搭建WordPress

文章目录AppBazaar官网选择与购买项目项目概况操作过程购买DevCloud服务创建项目添加制品库应用部署购买ECS添加部署模板并执行任务故障排除安装及访问WordPress登录网站管理后台访问网站完善部署模板资源释放使用总结AppBazaar官网 首先&#xff0c;我们来到AppBazaar的官网&…...

Milvus 群星闪耀时|又一个小目标达成 :社区正式突破 15,000 星!

如果把 Milvus 看作开源世界中的一束微光&#xff0c;那用户便是无垠宇宙中点点闪烁的星光。用户每一次点亮 star 之时&#xff0c;Milvus 就会迸发出更加耀眼的光芒。不知不觉&#xff0c;已有数以万计的 star 为 Milvus 而亮。2022 年 4 月&#xff0c;Milvus 在 GitHub 的 …...

Qt信号与槽使用方法总结

前言 在图形界面编程中QT是为首选&#xff0c;组件之间如何实现通信是核心的技术内容。Qt 使用了信号与槽的机制&#xff0c;非常的高效、简单、易学&#xff0c;方便开发者的使用。本文详细的介绍了Qt 当中信号与槽的概念&#xff0c;并演示了各种信号与槽的连接方式。 什么…...

SpringCloud alibaba-Sentinel服务降级策略

文章目录RT&#xff1a;异常比例&#xff1a;异常数&#xff1a;RT&#xff1a; 平均响应时间 (DEGRADE_GRADE_RT)&#xff1a;当 1s 内持续进入 N 个请求&#xff0c;对应时刻的平均响应时间&#xff08;秒级&#xff09;均超过阈值&#xff08;count&#xff0c;以 ms 为单位…...

python常用函数——random()函数

random() 返回随机生成的一个实数&#xff0c;范围在[0,1)之间 语法如下&#xff1a; import random random.random() # 注意&#xff1a;random()是不能直接访问的&#xff0c;需要导入random包&#xff0c;然后通过random静态对象调用 # 参数&#xff1a; 无 # 返回值 返回随…...

PX4之启动脚本

PX4通过rcS脚本来设定需要启动的程序&#xff0c;比如设备驱动、控制模块、数据通信等。rcS脚本在项目中的文件位置 ROMFS/px4fmu_common/rcS 对应硬件平台固件上的位置 /etc/init.d/rcS 启动脚本流程如下 #!/bin/sh # PX4FMU startup script. # # 一些注释 ## 设置默认参…...

Java零基础入门到精通(持续更新中)

打开CMD命令窗口 WINR输入cmd 常用cmd命令代码 切换磁盘 E: 回车即可切换到e盘查看当前路径下的所有内容 dir进入目录 cd test回退到上一级目录 cd..进入多级目录 cd test\index\aaa回退到磁盘目录 cd \清屏 cls关闭命令行窗口 exit小例子&#xff1a;使用命令行窗口…...

杂七杂八(12):Bilibili视频缓存 m4s音视频合并 shell脚本

视频目录结构如下&#xff1a; 267132000/ 267132000/c_1015740000/ 267132000/c_1015740000/entry.json 267132000/c_1015740000/80/ 267132000/c_1015740000/80/audio.m4s 267132000/c_1015740000/80/video.m4s267132000/c_1015740011/ 267132000/c_1015740011/entry.json 2…...

Qt 某光谱仪程序开发

某光谱仪程序开发 文章目录某光谱仪程序开发摘要安装驱动注册COM组件导出.h和.cpp在Qt 中添加源文件开发打包程序关键字&#xff1a; Demo、 Qt、 COM、 dumpcpp、 C摘要 今天接到一个临时小任务&#xff0c;写一个的项目子模块的Demo&#xff0c;以供和专家们交流一下项目技…...

蛋白质组学技术与常见分析培训班火热招生中!

什么是蛋白质组学&#xff1f; 蛋白质组学(proteomics)&#xff0c;是以蛋白质组为研究对象&#xff0c;研究细胞、组织或生物体蛋白质组成及其变化规律的科学。包括蛋白质的表达水平&#xff0c;翻译后修饰&#xff0c;蛋白与蛋白相互作用等研究内容&#xff0c;集中于动态描述…...

唤醒手腕 Java 后端 Springboot 框架结合 socketio 学习笔记

socketio 安装配置 Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架&#xff0c;它包括了客户端的JavaScript和服务器端的Node.js。 Socket.IO除了支持WebSocket通讯协议外&#xff0c;还支持许多种轮询&#xff08;P…...

Python实现P-PSO优化算法优化卷积神经网络CNN回归模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着人工智能和深度学习技术的快速发展&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在图像分类、目标检测…...

barker-OFDM模糊函数原理及仿真

文章目录 前言一、巴克码序列二、barker-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、barker-OFDM 模糊函数②、barker-OFDM 距离分辨率③、barker-OFDM 速度分辨率④、barker-OFDM 等高线图 四、资源自取 前言 本文进行 …...

Go语言字符串类型详解

1. 定义字符串类型 package mainimport ("fmt");func main() {var str1 string "你好 GoLang 1"var str2 "你好 GoLang 2"str3 : "你好 GoLang 3"fmt.Printf("%v--%T\n", str1, str1)// 你好 GoLang 1--stringfmt.Printf…...

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现 目录 多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现效果一览基本介绍…...

在线音乐服务器测试报告

1.项目背景 此项目主要用于模拟市面上主流的音乐软件的主要功能&#xff0c;提高自己的开发和测试能力。此项目采用的技术栈是SpringBoot MyBatis SpringMVC Mysql实现的&#xff0c;为了实现简单&#xff0c;方便测试&#xff0c;此项目没有注册功能&#xff0c;数据提前存…...

(一)视觉——工业相机(以海康威视为例)

一、工业相机介绍 工业相机是机器视觉系统中的一个关键组件&#xff0c;其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节&#xff0c;相机的选择不仅直接决定所采集到的图像分辨率、图像质量等&#xff0c;同时也与整个系统的运…...

strcat及其模拟实现

#define _CRT_SECURE_NO_WARNINGS strcat 追加字符串 str "string"&#xff08;字符串&#xff09; cat "concatenate"&#xff08;连接 / 追加&#xff09; char* strcat(char* destination, const char* source); strcat的应用 方法一&#xff…...

使用 HTML + JavaScript 实现在线考试系统

在现代的在线教育平台中&#xff0c;在线考试系统是不可或缺的一部分。本文将通过一个完整的示例&#xff0c;演示如何使用 HTML、CSS 和 JavaScript 构建一个支持多种题型的在线考试系统。 效果演示 项目概述 本项目主要包含以下核心功能&#xff1a; 支持4种常见题型&…...

C语言结构体的别名与创建结构体变量

这段代码是用C语言定义了一个链表节点的结构体&#xff0c;并通过typedef为相关类型创建了别名。下面分别解释Lnode和pNode&#xff1a; 1. Lnode Lnode是通过typedef为struct node定义的一个别名。struct node是一个结构体类型&#xff0c;表示一个链表节点。它的定义如下&a…...

LeeCode 98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 提示&#xff1a; 树中节…...