M1安装opencv4nodejs教程

安装说明

  • 之前的opencv4nodejs项目 github地址 已经没有人维护了,该项目推荐使用这个fork项目以获取更新的维护代码 @u4/opencv4nodejs github链接

  • 有鉴于此,本教程使用 @u4/opencv4nodejs进行安装

安装步骤

  • 步骤如下,步骤比较繁琐,坑也比较多,如果在安装时遇到另外的问题请提问,我会尝试进行解答

如果打算自行安装opencv,按照如下步骤进行

  1. 安装opencv
# 首先通过brew安装opencv,并查看安装的opencv具体情况(所在目录)
brew install opencv@4
brew info opencv
  1. 将opencv配置到环境变量中,方便后续安装时读取

版本号/路径 请根据自己安装的opencv进行修改

# 版本号要根据你安装的opencv版本号进行修改,建议配置到profile文件中
export OPENCV4NODEJS_DISABLE_AUTOBUILD=1
export OPENCV_LIB_DIR=/opt/homebrew/Cellar/opencv/4.5.5_3/lib
export OPENCV_BIN_DIR=/opt/homebrew/Cellar/opencv/4.5.5_3/bin
# 这条目录要注意一下,确保配置进去的目录中包含opencv2文件夹
export OPENCV_INCLUDE_DIR=/opt/homebrew/Cellar/opencv/4.5.5_3/include/opencv4
  1. 确保电脑中已经安装nodejs,推荐使用nvm管理node多版本,方便根据需要切换,我安装的是16.16版本

  2. 通过npm安装@u4/opencv4nodejs项目

npm install -g @u4/opencv4nodejs
  1. 在命令行中执行语句,正式开始安装,如果安装后不报错,说明安装成功,可以在appium中尝试对应代码
build-opencv build
  1. 如果命令行安装时报opencv2/core.hpp的错误,可以尝试将opencv安装目录下opencv2目录的上级目录放入node_modules/@u4/opencv4nodejs/binding.gyp文件中include_dirs部分内,然后再次尝试执行步骤5的命令
    image

7.命令执行成功不报错的话,node_modules/@u4/opencv4nodejs/build/Release目录下会生成一个opencv4nodejs.node文件,说明安装成功,之后可以使用命令将@u4下的opencv4nodejs文件夹软连接到node_modules文件夹内,以便appium执行时能够找到(因为我用的nvm,目录前半部分可能略有不同,请根据个人情况写相应路径)

ln -s /Users/xxx/.nvm/versions/node/v16.16.0/lib/node_modules/@u4/opencv4nodejs /Users/xxx/.nvm/versions/node/v16.16.0/lib/node_modules/opencv4nodejs

8.尝试在appium中执行语句实验是否能够成功执行

如果让安装程序自行下载编译安装opencv,按照如下步骤操作

  1. 确认电脑中已经安装辅助应用
    • 因为M1系统默认已经不带有python2,安装时需要电脑中存在python2.7版本 官网下载链接
    • 通过brew安装cmake brew install cmake
    • 确认电脑中已经安装了ffmpeg,并且需要注意版本不能太高,建议opencv4.5.5搭配ffmpeg4.4使用
  2. 见上文步骤3
  3. 见上文步骤4
  4. 在命令行中执行语句,让安装程序自动下载和编译opencv
build-opencv --version 4.5.5 build

5.见上文步骤6
6.见上文步骤7
7.见上文步骤8

2 个赞
ERR! install node-gyp failed and return Error Command failed: node-gyp build --jobs max --release 
ERR! install gyp info it worked if it ends with ok
ERR! install gyp info using node-gyp@5.1.1
ERR! install gyp info using node@16.16.0 | darwin | arm64
ERR! install gyp ERR! build error 
ERR! install gyp ERR! stack Error: You must run `node-gyp configure` first!
ERR! install gyp ERR! stack     at ReadFileContext.<anonymous> (/usr/local/lib/node_modules/node-gyp/lib/build.js:43:20)
ERR! install gyp ERR! stack     at ReadFileContext.callback (/usr/local/lib/node_modules/node-gyp/node_modules/graceful-fs/graceful-fs.js:123:16)
ERR! install gyp ERR! stack     at FSReqCallback.readFileAfterOpen [as oncomplete] (node:fs:314:13)
ERR! install gyp ERR! System Darwin 20.4.0
ERR! install gyp ERR! command "/usr/local/bin/node" "/usr/local/bin/node-gyp" "build" "--jobs" "max" "--release"
ERR! install gyp ERR! cwd /usr/local/lib/node_modules/@u4/opencv4nodejs
ERR! install gyp ERR! node -v v16.16.0
ERR! install gyp ERR! node-gyp -v v5.1.1
ERR! install gyp ERR! not ok 
ERR! install  return code: 1`预先格式化的文本`

你的node-gyp是什么版本

正常来说node-gyp版本应该和你的nodejs匹配,你这个版本貌似有点太低了。。。
卸载掉重新安装一下再试试看吧
我本地装的是9.1.0版本

ERR! install node-gyp failed and return Error Command failed: node-gyp build --jobs max --release
ERR! install gyp info it worked if it ends with ok
ERR! install gyp info using node-gyp@9.1.0
ERR! install gyp info using node@16.16.0 | darwin | arm64
ERR! install gyp ERR! build error
ERR! install gyp ERR! stack Error: You must run node-gyp configure first!
ERR! install gyp ERR! stack at ReadFileContext. (/usr/local/lib/node_modules/node-gyp/lib/build.js:43:20)
ERR! install gyp ERR! stack at ReadFileContext.callback (/usr/local/lib/node_modules/node-gyp/node_modules/graceful-fs/graceful-fs.js:123:16)
ERR! install gyp ERR! stack at FSReqCallback.readFileAfterOpen [as oncomplete] (node:fs:314:13)

我用了9.1.0也不行,然后看提示执行这个命令node-gyp configure 报这个错

gyp: binding.gyp not found (cwd: /Users/liuhong) while trying to load binding.gyp
gyp ERR! configure error 
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onCpExit (/usr/local/lib/node_modules/node-gyp/lib/configure.js:284:16)
gyp ERR! stack     at ChildProcess.emit (node:events:527:28)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (node:internal/child_process:291:12)
gyp ERR! System Darwin 20.4.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/bin/node-gyp" "configure"
gyp ERR! cwd /Users/liuhong
gyp ERR! node -v v16.16.0
gyp ERR! node-gyp -v v9.1.0
gyp ERR! not ok 

完整日志发一下吧 放到txt文件里发出来,只有这一段不够详细

error.txt (2.1 KB)
error2.txt (12.3 KB)麻烦老师帮忙看看

liuhong@liuhonghongdeMacBook-Pro node_modules % brew info opencv
opencv: stable 4.5.2 (bottled)
Open source computer vision library
https://opencv.org/
/opt/homebrew/Cellar/opencv/4.5.2_4 (835 files, 120.6MB) *
  Poured from bottle on 2022-08-03 at 10:32:25
/opt/homebrew/Cellar/opencv/4.5.2_4.bak (835 files, 120.6MB)
  Poured from bottle on 2022-08-01 at 20:59:22
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/opencv.rb
License: Apache-2.0
==> Dependencies
Build: cmake ✔, pkg-config ✔
Required: ceres-solver ✔, eigen ✔, ffmpeg ✔, glog ✔, harfbuzz ✔, jpeg ✔, libpng ✔, libtiff ✔, numpy ✔, openblas ✔, openexr ✔, protobuf ✔, python@3.9 ✔, tbb ✔, vtk ✔, webp ✔
==> Analytics
install: 15,564 (30 days), 40,608 (90 days), 181,668 (365 days)
install-on-request: 15,018 (30 days), 39,246 (90 days), 174,922 (365 days)
build-error: 54 (30 days)

这会不会是个重要信息build-error: 54 (30 days)

image
是导入问题,发完整的日志看看不要节选。。。
从你执行build-opencv这一行命令开始 一直到结束

error2.txt (16.3 KB)

  • 修改一下你的环境变量
export OPENCV_INCLUDE_DIR=/opt/homebrew/Cellar/opencv/4.5.2_4/include/opencv4
  • 然后source重新加载一下环境变量
  • brew安装的opencv4目录结构跟之前不太一样 include目录下不是直接放的opencv2而是多了一层opencv4目录
  • 之后再重新运行一下试试看

error2.txt (21.5 KB)
刚才重新跑一次是这个保存,和改了你说的这个环境变量前后一个报错

改完设置重新卸载安装一下node-gyp试试呢?
我之前也是改完一直加载不到对应的文件,即便文件目录没错,尝试重装了一次之后突然好了

重装node-gyp还是报这个错

/opt/homebrew/lib/node_modules/@u4/opencv4nodejs
到这个目录下执行一下node-gyp configure 再试试?

node-gyp configure 执行没问题,但是再试还是报那个错,看起来是执行node-gyp build --jobs max --release 这个报的错

直接原因就是导入头文件的时候没有找到opencv2/core.hpp

这个openv2在哪啊,找不到,是不是要重装什么才会有

这个目录下没有么?这个头文件是opencv4自带的

换成你的版本4.5.5_3 又报这个错
error2.txt (4.3 KB)

opencv4里面也有openv2

我给出了两种安装方法,你先确定好用哪一种
如果用的是自己安装opencv的方式,版本要写自己安装的版本,不要跟着我写的版本来写呀。。