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


    最近因为项目原因,研究了一下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 写的想吐。。。

这个问题看起来是在尝试使用Emscripten和OpenCV库时遇到的错误,具体来说是在尝试加载opencv2/opencv.hpp文件时找不到该文件。 Emscripten是一个将C++编译WebAssembly的工具,它允许你使用C++库在浏览器中运行。然而,由于Emscripten的限制,某些库可能无法直接在浏览器中运行。OpenCV库就是一个例子,它包含了许多C++的头文件和库文件,这些文件在浏览器环境中可能无法正确加载。 解决这个问题的方法通常有以下几种: 1. **使用Emscripten的替代库**:Emscripten提供了一些替代库,如Emscripten的图像处理库,可以用来替代OpenCV。你可以尝试使用这些替代库来代替OpenCV。 2. **将OpenCV库转换为WebAssembly**:有一些工具可以将OpenCV库转换为WebAssembly格式,这样就可以在浏览器中运行了。但是,这个过程可能会比较复杂,并且可能需要进行一些调整以适应浏览器环境。 3. **在服务器端使用OpenCV**:如果你的应用主要在服务器端运行,那么可以考虑将OpenCV库安装到服务器上,然后在服务器上使用它。 4. **重新考虑你的需求**:如果你的应用不需要用到OpenCV的某些功能,那么可能需要重新考虑你的需求,看看是否有其他库或方法可以满足你的需求。 对于这个具体的问题,我建议你检查你的环境是否正确安装了Emscripten和OpenCV库,以及是否正确设置了它们的路径。你可以尝试在命令行中运行一些简单的Emscripten和OpenCV代码来检查是否能够成功运行。 希望这些信息能够帮助你解决问题!如果你还有其他问题,欢迎随时向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值