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

2024-03-14 22:20

本文主要是介绍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 写的想吐。。。

这篇关于WebAssembly探索篇(三)emcc和cmake编译opencv案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/809902

相关文章

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de