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/

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

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

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

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

版本
| 名称 | 版本 |
|---|---|
| OS | Windows 10 |
| Qt | 5.13.1 |
| Qt Creator | 4.10.0 |
| OpenCV | 4.5.4 |
| opencv_contrib | 4.5.4 |
| cmake | 3.25.2 |
安装
注意事项
在使用cmake时会需要联网下载一些文件,所以你的电脑是需要互联网的。如果是局域网环境不方便上网,那你可以找一台可以上网的电脑,根据局域网电脑的软件环境编译一套OpenCV库,再通过别的方式拷贝到局域网点中,编译完成后就是一些库文件是可以转移的,当然转移后也记得配置环境变量。
环境准备
首先你要安装Qt,这里安装过程不做介绍,主要要安装MinGW编译器。我想你既然要在Qt中使用OpenCV,那么你对Qt的认识肯定可以跳过这一步,如果你也是新手,那么你可以先看一下其他关于Qt安装的内容。

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

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

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

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

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


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


点击configure,选择你的编译器

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



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

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

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


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

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

再点击configure,进行配置

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

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



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

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

点击generate生成工程文件


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

在cmd命令行中进入到build路径,执行命令mingw32-make进行编译,这个命令可以添加参数-j 8,表示开启8线程同时编译,这样会增加电脑CPU的使用率从而加快速度。笔者这里使用的编译命令就是:
mingw32-make -j 8 
编译需要等一会,过程中会出现一些如下的错误日志,都不用管



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

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



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

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

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

build system选择默认的qmake

details可以默认

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

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

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

#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,Python中使用某些模块使用pip工具很容易将对应的模块安装在系统中。根据项目需求项目都要转移在国产化中使用,为了适应国产化需求,将代码转移到Qt开发环境中,…...
波次分拣系统
一、系统架构: v1.2基站软件管理系统仓库标签v1.4仓库标签二、系统简介: 标签系统主要由标签服务器,基站,电子标签前三部分组成,操作界面借助于京东仓库已有的作业电脑来实现,标签服务器与WMS进行数据对接。…...
【Servlet篇】Request请求转发详细解读
文章目录1. 前言2. 实战案例3. 特点1. 前言 请求转发是一种在服务器内部的资源跳转方式,如图: 上图的大致过程为,浏览器发送请求给服务器,服务器中 a 资源接收到请求,资源 a 处理完请求后将请求发送给资源 bÿ…...
vector
目录 vector的成员函数: at: 编辑 size: assign:赋值 insert find? erase swap shrink_to_fit 编辑 vector的模拟实现: vector的框架: 构造函数: size和capacity r…...
LeetCode——104. 二叉树的最大深度
一、题目 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/maximum…...
漫画 | Python是一门烂语言?
这个电脑的主人是个程序员,他相继学习了C、Java、Python、Go, 但是似乎总是停留在Hello World的水平。 每天晚上,夜深人静的时候,这些Hello World程序都会热火朝天地聊天但是,这一天发生了可怕的事情随着各个Hello wor…...
2023.2 新方案 java代码混淆 java加密 字符串加密
Java字节码可以反编译,特别是创业公司,很好的项目很容易被别人破解反编译,造成很严重的损失,所以本混淆方案能很好的保护源码,而且在不断迭代,增强混淆效果,异常问题处理,达到保护项目的目的: 本次升级包括: 2023年02年19日 : ht-confusion-project-1.8…...
Swift 周报 第二十三期
前言 本期是 Swift 编辑组自主整理周报的第十四期,每个模块已初步成型。各位读者如果有好的提议,欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布,欢迎志同道合的朋友一起加入周报整理。 勇敢是即便知道好结局不会每每降临在…...
android系统屏幕旋转角度,应用界面横竖屏,设备旋转角度,三者的区别以及使用。
注意区分以下三种概念的区别!!!。以及使用这三种方式判断横竖屏的方式。系统屏幕旋转角度fun getSystemRotation(): Int {val angle (getSystemService(WINDOW_SERVICE) as WindowManager).defaultDisplay.rotation//系统屏幕旋转的角度值re…...
【华为云-开发者专属集市】DevCloud+ECS、MySQL搭建WordPress
文章目录AppBazaar官网选择与购买项目项目概况操作过程购买DevCloud服务创建项目添加制品库应用部署购买ECS添加部署模板并执行任务故障排除安装及访问WordPress登录网站管理后台访问网站完善部署模板资源释放使用总结AppBazaar官网 首先,我们来到AppBazaar的官网&…...
Milvus 群星闪耀时|又一个小目标达成 :社区正式突破 15,000 星!
如果把 Milvus 看作开源世界中的一束微光,那用户便是无垠宇宙中点点闪烁的星光。用户每一次点亮 star 之时,Milvus 就会迸发出更加耀眼的光芒。不知不觉,已有数以万计的 star 为 Milvus 而亮。2022 年 4 月,Milvus 在 GitHub 的 …...
Qt信号与槽使用方法总结
前言 在图形界面编程中QT是为首选,组件之间如何实现通信是核心的技术内容。Qt 使用了信号与槽的机制,非常的高效、简单、易学,方便开发者的使用。本文详细的介绍了Qt 当中信号与槽的概念,并演示了各种信号与槽的连接方式。 什么…...
SpringCloud alibaba-Sentinel服务降级策略
文章目录RT:异常比例:异常数:RT: 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位…...
python常用函数——random()函数
random() 返回随机生成的一个实数,范围在[0,1)之间 语法如下: import random random.random() # 注意:random()是不能直接访问的,需要导入random包,然后通过random静态对象调用 # 参数: 无 # 返回值 返回随…...
PX4之启动脚本
PX4通过rcS脚本来设定需要启动的程序,比如设备驱动、控制模块、数据通信等。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小例子:使用命令行窗口…...
杂七杂八(12):Bilibili视频缓存 m4s音视频合并 shell脚本
视频目录结构如下: 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 中添加源文件开发打包程序关键字: Demo、 Qt、 COM、 dumpcpp、 C摘要 今天接到一个临时小任务,写一个的项目子模块的Demo,以供和专家们交流一下项目技…...
蛋白质组学技术与常见分析培训班火热招生中!
什么是蛋白质组学? 蛋白质组学(proteomics),是以蛋白质组为研究对象,研究细胞、组织或生物体蛋白质组成及其变化规律的科学。包括蛋白质的表达水平,翻译后修饰,蛋白与蛋白相互作用等研究内容,集中于动态描述…...
唤醒手腕 Java 后端 Springboot 框架结合 socketio 学习笔记
socketio 安装配置 Socket.IO是一个完全由JavaScript实现、基于Node.js、支持WebSocket的协议用于实时通信、跨平台的开源框架,它包括了客户端的JavaScript和服务器端的Node.js。 Socket.IO除了支持WebSocket通讯协议外,还支持许多种轮询(P…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
