WebAssembly探索篇(三)emcc和cmake编译opencv案例

文章目录

  • 开发环境
    • 安装opencv环境
  • 实践出真知
    • 完整项目
    • 效果图
  • 踩坑
    • fatal error: 'opencv2/opencv.hpp' file not found
      • 增加软链ln(无效)
      • 改用自行安装opencv,再显示指定lib路径
    • emcc命令行运行方式

    最近因为项目原因,研究了一下WebAssembly。2015年上线与JS、HTML、CSS并称web界四语言,额,虽然已经上线快10年,但是研究的人好少,注定这个探索之路是崎岖的。(事实也是这样,已经耗进去快2周了,人都麻了-_-||)
    这是一个曲折的探索之路,emcc编译opencv的代码真的问题好多。。。

开发环境

为啥要把开发环境放在第一位呢,这里面也是采了无数的坑。

开发工具版本
Ubuntu18.04
emscripten3.1.55
cmake3.28.3
opencv3.2.0

安装opencv环境

  1. 安装
sudo apt-get update
sudo apt-get install libopencv-dev
  1. 查看opencv的lib目录
dpkg -L libopencv-dev
  1. 配置环境变量
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
source ~/.bashrc

实践出真知

完整项目

项目结构如下:

┌─demo              项目名称 
│─build             编译文件(emcmake和emmake后的产物)
│  └─CMakeFile       
│  │  └─...      
│  └─cmake_install.cmake
│  └─CMakeCache.txt
│  └─Makefile
│  └─helloCV.js
│  └─helloCV.wasm   
├─main.cpp          主入口
├─CMakeLists.txt        
  1. main.cpp
#include <opencv2/opencv.hpp>
#include <stdio.h>
using namespace cv;
int main(int argc, char **argv) {
  Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
  std::cout << "M = " << std::endl << " " << M << std::endl;
  return 0;
}
  1. CMakeLists.txt
cmake_minimum_required( VERSION 3.8 )
set( CMAKE_CXX_STANDARD 17 )
project( helloCV )

# Needed for opencv2/opencv.hpp
include_directories( /root/wasm/opencv-demo/opencv/include )

# Needed by opencv.hpp for opencv2/opencv_modules.hpp
include_directories( /root/wasm/opencv-demo/opencv/platforms/js/build_wasm )

# Needed by opencv_modules.hpp for every module
file( GLOB opencv_include_modules "/root/wasm/opencv-demo/opencv/modules/*/include" )
include_directories( ${opencv_include_modules} )

# Our hello world executable
add_executable( helloCV main.cpp )

 set(CMAKE_EXECUTABLE_SUFFIX ".html") # 编译生成.html

# Link to opencv.js precompiled libraries
file( GLOB opencv_js "/root/wasm/opencv-demo/opencv/platforms/js/build_wasm/lib/*.a" )
target_link_libraries( helloCV ${opencv_js} )
  1. 执行cmake
//在项目根目录下,执行如下命令
mkdir build 
cd build 
emcmake cmake ..
emmake make 

效果图

将helloCV.html、helloCV.js和helloCV.wasm三个文件下载下来,在vscode中使用preview on web server插件运行,如下图:
在这里插入图片描述

踩坑

fatal error: ‘opencv2/opencv.hpp’ file not found

刚开始使用apt-get安装opencv库,并且用emcc命令行执行编译,但疯狂报错,查阅大量资料,有人说emcc只能引用静态库,动态库会报错!

增加软链ln(无效)

make-opencv2-opencv-hpp-not-found

sudo ln -s /usr/share/OpenCV /usr/include/opencv2

改用自行安装opencv,再显示指定lib路径

How to use emscripten with cmake for project dependencies?
stackoverflow真的有太多的宝藏,在里面帖子里找到了解决方案!
在这里插入图片描述

emcc命令行运行方式

问题很多,无法吐槽,只能避开,如果依赖的第三方库太多,强烈建议不要使用此方式,不然-l 写的想吐。。。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻松驾驭时间流:MYSQL日期与时间函数的实用技巧

​&#x1f308; 个人主页&#xff1a;danci_&#x1f525; 系列专栏&#xff1a;《MYSQL应用》&#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 MySQL的时间函数用于处理日期和时间数据。以下是一些常用的MySQL时间函数。 内容有点多&#xff0…

一个H5页面中直接使用React的示例与说明

示例 如题&#xff0c;下面的个简单代码示例—在H5页面中直接使用React <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

docker-compose 部署nginx和jdk步骤

** yum安装jdk ** 1、​​yum -y list java* 查看可安装java版本 选择安装 java-1.8.0-openjdk-accessibility.x86_64 2、​​yum install -y java-1.8.0-openjdk-devel.x86_64 耐心等待安装完成即可 3、​java -version​​ 即可查看当前安装的java版本 4、yum安装的jdk&am…

信息检索(十一):Nonparametric Decoding for Generative Retrieval

Nonparametric Decoding for Generative Retrieval 摘要1. 引言2. 相关工作3. 非参数解码3.1 关键优势3.2 Base Np3.3 异步 Np3.4 对比 Np3.5 聚类 4. 实验设置4.1 基线4.2 数据集和评价指标4.3 构建CE 的细节 5. 实验结果5.1 普通解码 vs Np 解码5.2 非参数解码的优点5.3 什么…

前端测试——端对端测试框架 Playwright 总结

在进行前端测试前&#xff0c;我们需要明确我们需要怎样的前端测试。 前端测试类型总结 前端应用测试分为几种常见类型: 端到端&#xff08;e2e&#xff09; &#xff1a;一个辅助机器人&#xff0c;表现得像一个用户&#xff0c;在应用程序周围点击&#xff0c;并验证其功能…

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分&#xff0c;帮助模型决定在处理信息时&#xff0c;所应该关注的部…

识局者生,破局者存,掌局者赢

在我们生活的世界中&#xff0c;每个人可能都被各种各样的情况所围绕着&#xff0c;这些情况可能来自我们的工作&#xff0c;可能来自我们的生活&#xff0c;也可能来自我们周围的人。我们可能会被这些情况所困扰&#xff0c;可能会因这些情况感到困惑&#xff0c;甚至可能会因…

扒带和扒谱的区别 FL Studio怎么扒带 扒带编曲制作 扒带简单歌曲

在许多业余音乐爱好者们的眼里&#xff0c;扒带和扒谱是同一种东西。诚然&#xff0c;扒带和扒谱的确非常相似&#xff0c;但是从严格的意义上来说&#xff0c;这二者还是有一定的区别。今天我们就来说一说扒带和扒谱的区别&#xff0c;FL Studio怎么扒带。 FL Studio21中文官网…

深入理解JAVA异常(自定义异常)

目录 异常的概念与体系结构 异常的概念&#xff1a; 异常的体系结构&#xff1a; 异常的分类&#xff1a; 异常的处理 防御式编程 LBYL: EAFP: 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 面试题&#xff1a; 异常的处理流程 异常处…

Linux中搭建DNS 域名解析服务器(详细版)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; Linux专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; ————前言———— 在Linux中搭建DNS服务器涉及配置和运行一个软件来提供DNS服务。DNS&#xff08;Domain Name System…

如何免费获取基于公网 IP 的 SSL 证书 (无需域名)

现在给网站安装SSL证书来实现网站的HTTPS安全访问已经成了大多数人的共识&#xff0c;但是有一些特殊情况&#xff1a;比如对于个别的应用IP地址不需要绑定域名&#xff0c;只是单纯用IP来访问网站&#xff0c;这种情况下&#xff0c;可以实现HTTPS访问吗&#xff1f; 先说答案…

2024Python二级

1. 2. 前序遍历首先访问根节点再访问左子树和右子树 3. 4. sub不属于保留字 5. 6. 7. 8. continue是再重新开始进行循环&#xff0c;不是题目中所规定字母的话就对它进行输出 9. Python没有主函数的说法 10. 未转化为数据所要求的形式&#xff0c;应首先考虑eval 11. l…

电玩城游戏大厅计时软件怎么用,佳易王计时计费管理系统软件定时语音提醒操作教程

电玩城游戏大厅计时软件怎么用&#xff0c;佳易王计时计费管理系统软件定时语音提醒操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费软件V18.0为例 说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、软件计时计费&#xff0c;只需点击开…

GitHub 服务器

GitHub 服务器 公司中&#xff0c;我们可以搭建中央服务器让项目组开发人员共享代码&#xff0c;但是如果我们的开发人员都是通过互联网进行协作&#xff0c;而不是在同一个地方&#xff0c;那么开发时&#xff0c;程序文件代码的版本管理就显得更加重要&#xff0c;这就需要搭…

Linux上部署zabbix 6.x

建议大家使用Rocky Linux 8.X https://download.rockylinux.org/pub/rocky/8/isos/x86_64/Rocky-8.9-x86_64-minimal.iso 1> 配置安装yum源 [rootzabbix ~]# yum install https://mirrors.huaweicloud.com/zabbix/zabbix/6.2/rhel/7/x86_64/zabbix-release-6.2-3.el8.noarc…

小程序学习3 goods-card

pages/home/home home.wxml <goods-listwr-class"goods-list-container"goodsList"{{goodsList}}"bind:click"goodListClickHandle"bind:addcart"goodListAddCartHandle"/> <goods-list>是一个自定义组件&#xff0c;它具…

深度学习模型部署(八)TensorRT完整推理流程

TensorRT的大致流程&#xff1a; 图片来自TensorRT的官方教程 构建期 模型解析计算图优化节点消除多精度支持优选kernel&#xff1a;选择最适合当下设备的实现导入plugin&#xff1a;实现自定义操作显存优化&#xff1a;显存池复用 运行期 运行时环境&#xff1a;对象生命周…

CVPR2024 | 改善多模态大模型底层视觉能力,NTU与商汤联合提出Q-Instruct,已开源

https://arxiv.org/pdf/2311.06783.pdf https://github.com/Q-Future/Q-Instruct 以 GPT-4V 为代表的多模态大语言模型&#xff08;MLLM&#xff09;为视觉感知和理解任务引入了范式转变&#xff0c;即可以在一个基础模型中实现多种能力。虽然当前的 MLLM 表现出了从低级视觉属…

移动距离 刷题笔记

依题意 给出两个数 n,m 两个数的坐标分标为 x1,y1 ; x2,y2; 所求最短距离即曼哈顿距离 d|x2-x1||y2-y1|; 当我们想求两个数的行号时 按正常数组的求法 &#xff08;n/w) 如果从1 开始 每一行的最后一个元素除于w的结果都比宽度1; 所以我们从1开始 于是 每一行的…

Java开发从入门到精通(七):Java的面向对象编程OOP:语法、原理、this、构造器

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的面向对象编程1.1 什么是面向对象1.2 面向对象和面向过程的区别1.3 面向对象开发设计特征1.4 面向对象语法1.4.1 先创建对象模板1.4.2 实例化对象1.4.3 对象又该怎么理解?1.4.4 对象在计算机中的执行原理 1.5 类和对…