Qt+openCV学习笔记(十六)Qt6.6.0rc+openCV4.8.1+emsdk3.1.37编译静态库

前言:

有段时间没来写文章了,趁编译库的空闲,再写一篇记录文档

WebAssembly的发展逐渐成熟,即便不了解相关技术,web前端也在不经意中使用了相关技术的库,本篇文档记录下如何编译WebAssembly版本的openCV,可以给使用C++开发web前端的小伙伴使用

一、安装需要的软件

1.安装git

这方便教程很多,不再重复。笔者使用的是git2.33

2.安装cmake

这个教程也很多,但笔者没有安装,使用的是Qt安装时,下载的

3.安装emsdk3.1.37

笔者偷懒了,也是搭建qt6.6.0时使用的版本,具体教程就不放置了

若不想自己安装的,可以下载笔者使用的版本

二、下载所需要的资源

1.下载opencv4.8.1源码

https://github.com/opencv/opencv/archive/refs/tags/4.8.1.zip

2.下载opencv_contrib-4.8.1源码

https://github.com/opencv/opencv_contrib/archive/refs/tags/4.8.1.zip

3.wechat_qrcode模型

detect.caffemodel

detect.prototxt

sr.caffemodel

sr.prototxt

4.xfeatures2d

boostdesc_bgm.i

boostdesc_bgm_bi.i

boostdesc_bgm_hd.i

boostdesc_binboost_064.i

boostdesc_binboost_128.i

boostdesc_binboost_256.i

boostdesc_lbgm.i

vgg_generated_48.i

vgg_generated_64.i

vgg_generated_80.i

vgg_generated_120.i

5.face_landmark_model.dat

三、设置环境变量

环境变量设置方法很多,可以直接设置系统的环境变量,笔者使用的是在一个cmd窗口中临时设置环境变量

执行如下命令

D:\emsdk\emsdk-3.1.37\emsdk_env.bat
set path=D:\Qt\Tools\mingw1120_64\bin;D:\Program Files\Git\usr\bin;%path%

若是查看环境变量执行如下

echo %path%

注:一定要记得,激活emsdk的环境变量 

四、生成make文件

在设置好环境变量的cmd中执行(请按实际目录执行)

D:\Qt\Tools\CMake_64\bin\cmake-gui.exe

打开如下窗口

点击configure,弹出如下窗口

 以上是笔者的设置,点击Next,

设置编译器,以下是笔者的设置

 

 之后就是等待完成,此过程时间有点长​

 configure完成后,修改配置选项

笔者提示,很多库并没有做web上的兼容,建议先编译opencv官方推荐的选项,然后再根据自己的需要,增加其他模块

以下是opencv官方使用的默认选项,可供有需要的小伙伴参考

'-DPYTHON_DEFAULT_EXECUTABLE=D:\\Program\\Python310\\python.exe', 
'-DENABLE_PIC=FALSE', 
'-DCMAKE_BUILD_TYPE=Release', 
"-DCMAKE_TOOLCHAIN_FILE='emsdk-3.1.37\\cmake\\Modules\\Platform\\Emscripten.cmake'", 
"-DCPU_BASELINE=''", 
'-DCMAKE_INSTALL_PREFIX=/usr/local', 
"-DCPU_DISPATCH=''", 
'-DCV_TRACE=OFF', 
'-DBUILD_SHARED_LIBS=OFF', 
'-DWITH_1394=OFF', 
'-DWITH_ADE=OFF', 
'-DWITH_VTK=OFF', 
'-DWITH_EIGEN=OFF', 
'-DWITH_FFMPEG=OFF', 
'-DWITH_GSTREAMER=OFF', 
'-DWITH_GTK=OFF', 
'-DWITH_GTK_2_X=OFF', 
'-DWITH_IPP=OFF', 
'-DWITH_JASPER=OFF', 
'-DWITH_JPEG=OFF', 
'-DWITH_WEBP=OFF', 
'-DWITH_OPENEXR=OFF', 
'-DWITH_OPENGL=OFF', 
'-DWITH_OPENVX=OFF', 
'-DWITH_OPENNI=OFF', 
'-DWITH_OPENNI2=OFF', 
'-DWITH_PNG=OFF', 
'-DWITH_TBB=OFF', 
'-DWITH_TIFF=OFF', 
'-DWITH_V4L=OFF', 
'-DWITH_OPENCL=OFF', 
'-DWITH_OPENCL_SVM=OFF', 
'-DWITH_OPENCLAMDFFT=OFF', 
'-DWITH_OPENCLAMDBLAS=OFF', 
'-DWITH_GPHOTO2=OFF', 
'-DWITH_LAPACK=OFF', 
'-DWITH_ITT=OFF', 
'-DWITH_QUIRC=ON', 
'-DBUILD_ZLIB=ON', 
'-DBUILD_opencv_apps=OFF', 
'-DBUILD_opencv_calib3d=ON', 
'-DBUILD_opencv_dnn=ON', 
'-DBUILD_opencv_features2d=ON', 
'-DBUILD_opencv_flann=ON', 
'-DBUILD_opencv_gapi=OFF', 
'-DBUILD_opencv_ml=OFF', 
'-DBUILD_opencv_photo=ON', 
'-DBUILD_opencv_imgcodecs=OFF', 
'-DBUILD_opencv_shape=OFF', 
'-DBUILD_opencv_videoio=OFF', 
'-DBUILD_opencv_videostab=OFF', 
'-DBUILD_opencv_highgui=OFF', 
'-DBUILD_opencv_superres=OFF', 
'-DBUILD_opencv_stitching=OFF', 
'-DBUILD_opencv_java=OFF', 
'-DBUILD_opencv_js=ON', 
'-DBUILD_opencv_python2=OFF', 
'-DBUILD_opencv_python3=OFF', 
'-DBUILD_EXAMPLES=ON', 
'-DBUILD_PACKAGE=OFF', 
'-DBUILD_TESTS=ON', 
'-DBUILD_PERF_TESTS=ON', 
'-DBUILD_DOCS=OFF', 
'-DWITH_PTHREADS_PF=OFF', 
'-DCV_ENABLE_INTRINSICS=OFF', 
'-DBUILD_WASM_INTRIN_TESTS=OFF', 
"-DCMAKE_C_FLAGS='-s WASM=1 -s SINGLE_FILE=1 -s USE_PTHREADS=0 '", 
"-DCMAKE_CXX_FLAGS='-s WASM=1 -s SINGLE_FILE=1 -s USE_PTHREADS=0 '"

内容比较多,需要大家细心设置,或第一次直接使用cmake命令 

以下是笔者感兴趣的选项

安装目录(生成的动态库的目录)

 是否生成付费相关的部分

 添加扩展库,注意要具体到modules目录

 

  再次点击configure后,可能还需要还需要设置多次,配置其他选项或下载文件

继续点击configure(可以多点几次,有时多点几次就可以下载成功),

若输出中仍然存在红色的文字,打开编译目录,找到日志文件CMakeDownloadLog.txt,查看缺少或下载失败的文件,下载完成后,按日志文件的提示,放入指定目录即可

笔者已下载缺少的文件,处理方法如下

1.把downloads和testdata两个目录,直接放在编译目录(笔者已整理好内部目录)

再次点击configure,此时应该不会有红色的文字了(若存在,请自主解决)

点击generate,生成makefile文件

四、编译源码

设置好环境变量的cmd中,切换目录到编译目录(请按实际目录执行)

执行mingw32-make -j6 开始编译

(6代表同时开6个线程编译,请读者按照自己机器的配置设置,以加快编译速度)

些过程耗时较长,笔者等待了半小时左右

编译完成后,执行mingw32-make install

过会就可以在安装目录找到生成的静态库了,笔者是在编译目录下的install

因时间关系,笔者本次就不添加测试程序了

已生成的静态库(正式库+xfeatureds2d)​​​​​​​

后记:

1.WebAssembly开发,一般使用静态库,若有小伙伴执意使用动态库,可以自行编译下测试

2.部分库,即使编译成功,也不一定能使用,或出错,如imgcodecs模块,笔者使用cv::imwrite()时,会导致网页异常退出

3.笔者建议,不要使用world的库,发布程序时,库太大了,不实用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148174.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链3.0时代 基于GoMars构建的新概念TravelFi能否注入新力量?

区块链技术进入3.0时代 后疫情时代,全球数字化进程不断加快,世界范围内的移动通信、互联网技术及各类数字化应用的社会普及率也正在快速提升,疫情推动了互联网经济的增长,也让数字经济的价值开始显现。 数字经济一词的由来至今已经…

网络协议--概述

1.2 分层 网络协议通常分不同层次进行开发,每一层分别负责不同的通信功能。一个协议族,比如TCP/IP,是一组不同层次上的多个协议的组合。TCP/IP通常被认为是一个四层协议系统,如图1-1所示。 每一层负责不同的功能: 1.…

objective-c 基础学习

目录 第一节:OC 介绍 ​​第二节:Fundation 框架 ​第三节:NSLog 相对于print 的增强 ​第四节:NSString ​第五节:oc新增数据类型 第六节: 类和对象 ​类的方法的声明与实现 ​第七节:类…

Linux信号解析

文章目录 Linux信号概念信号种类Linux信号产生异步 LInux信号阻塞递达、未决、阻塞、忽略信号集操作函数阻塞信号集操作函数未决信号集操作函数 Linux信号捕捉signal函数sigaction函数 总结 Linux信号概念 信号在我们的生活中无处不在,常见的如电话铃声&#xff0c…

国庆10.4

QT实现TCP服务器客户端 服务器 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器头文件 #include <QTcpSocket> //客户端头文件 #include <QList> //链表容器 #include <QMe…

【C 语言进阶(12)】动态内存管理笔试题

文章目录 题目 1题目 2题目 3题目 4 题目 1 运行 Test 函数后的结果是什么&#xff1f; void GetMemory(char* p) {p (char*)malloc(100); }void Test(void) {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); }代码结果 程序崩溃。 代…

C++ YAML使用

C++工程如何使用YAML-cpp 一、前期准备工作 1、已安装minGW、cmake、make等本地工具。 2、下载YAML-cpp第三方开源代码(一定要下载最新的release版本,不然坑很多)。 3、生成YAML-cpp静态库 (1)在yaml-cpp-master下建立build文件夹; (2)在该文件夹下生成MakaFile文…

C++入门-day01

一、认识C C融合了三种不同的编程方式 C代表的过程性语言在C基础上添加的类、结构体puls代表的面向对象语言C模板支持泛型编程 C完全兼容C的特性 Tips&#xff1a;侯捷老师提倡的Modren C是指C11、C14、C17和C20这些新标准所引入的一系列新特性和改进。在我们练习的时候也应当去…

Blender 之创建一个简单的笔筒

文章目录 成品图实现步骤 你是不是想创建一个笔筒捏&#xff1f; follow me! 成品图 实现步骤 先添加一个柱体 选中柱体&#xff0c;然后按tab 进入编辑模式 切换到面模式 &#xff08;可以按主键盘的 3 键&#xff09; 分别选中上下面&#xff0c;鼠标右键&#xff0c;选…

BL808学习日志-2-LVGL for M0 and D0

一、lvgl测试环境 对拿到的M1S_DOCK开发板进行开发板测试&#xff0c;博流的官方SDK是支持M0和D0两个内核都进行测试的&#xff1b;但是目前只实现了M0的LVGLBenchmark&#xff0c;测试D0内核中发现很多莫名其妙的问题。一会详细记录。 使用的是开发板自带的SPI显示屏&#xff…

【软考】4.2 关系代数/函数依赖/范式

《 关系代数 》 表和表之间的逻辑运算 笛卡尔积&#xff1a;S1 x S2 投影&#xff1a;π&#xff1b;选择某一列&#xff08;属性&#xff09;&#xff1b;一个关系R的投影操作结果也是一个关系&#xff0c;记作Πa&#xff0c;它由从关系R中选出的A列元素构成&#xff1b;选择…

隐私交易成新刚需,Unijoin 凭什么优势杀出重围?

随着区块链技术的普及和发展&#xff0c;全球加密货币用户在持续增长&#xff0c;根据火币研究院公布的数据&#xff0c;2022年全球加密用户已达到 3.2亿人&#xff0c;目前全球人口总数超过了 80亿&#xff0c;加密货币用户渗透率已达到了 4%。 尤其是在 2020 年开启的 DeFi 牛…

机器学习7:逻辑回归

一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类&#xff0c;其中概率用于确定二元结果&#xff0c;因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…

《Python趣味工具》——ppt的操作(刷题版)

前面我们对PPT进行了一定的操作&#xff0c;并将其中的文字提取到了word文档中。现在就让我们来刷几道题巩固巩固吧&#xff01; 文章目录 1. 查看PPT&#xff08;上&#xff09;2. 查看PPT&#xff08;中&#xff09;3. 查看PPT&#xff08;下&#xff09;4. PPT的页码5. 大学…

手机自动直播系统源码交付与代理加盟注意事项解析!

随着直播行业的不断发展&#xff0c;手机自动直播已经成为了人们生活中不可或缺的一部分。手机无人直播软件成了香饽饽&#xff0c;各类手机实景直播APP大批量涌现。因为创业和技术门槛低&#xff0c;市场需求高&#xff0c;所以成了最火热创业赛道。那么如果是不懂技术的人群&…

5.Vectors Transformation Rules

在上节&#xff0c;有个问题&#xff1a;向量分量的转换方式 与 新旧基底的转换方式相反 用例子来感受一下&#xff0c; 空间中一向量V&#xff0c;即该空间的一个基底&#xff1a;e1、e2 v e1 e2 现把基底 e1 、 e2 放大两倍。变成 基向量放大了两倍&#xff0c; 但对于…

Java8 Lambda.stream.sorted() 方法使用浅析分享

文章目录 Java8 Lambda.stream.sorted() 方法使用浅析分享sorted() 重载方法一升序降序 sorted() 重载方法二升序降序多字段排序 mock代码 Java8 Lambda.stream.sorted() 方法使用浅析分享 本文主要分享运用 Java8 中的 Lambda.stream.sorted方法排序的使用&#xff01; sorted…

速看:免费领取4台阿里云服务器_申请入口及领取流程

注册阿里云账号&#xff0c;免费领云服务器&#xff0c;最高领取4台云服务器&#xff0c;每月750小时&#xff0c;3个月免费试用时长&#xff0c;可快速搭建网站/小程序&#xff0c;部署开发环境&#xff0c;开发多种企业应用。阿里云服务器网分享阿里云服务器免费领取入口、免…

机器学习必修课 - 如何处理缺失数据

运行环境&#xff1a;Google Colab 处理缺失数据可简单分为两种方法&#xff1a;1. 删除具有缺失值的列 2. 填充 !git clone https://github.com/JeffereyWu/Housing-prices-data.git下载数据集 import pandas as pd from sklearn.model_selection import train_test_split导…

python中使用matplotlib绘图

一、背景 当我们在写python程序时&#xff0c;不可避免的需要将数据可视化&#xff0c;也就是绘制出数据的曲线图&#xff0c;以便我们更直观的观察数据间的变化&#xff0c;和方便对比。此时就要用到matplotlib库了。 matplotlib官方给出的定义是&#xff1a; 翻译过来也就是…