windows 安装 opencv4nodejs

基本环境(不推荐用其他版本)
软件包 版本
node >= 16.0.0
python >= 3.8 & <=3.10
cmake 3.26.0
opencv >= 4.6
1. 安装cmake并配置环境变量

下载地址:https://github.com/Kitware/CMake/releases
我选择的版本:cmake-3.26.0-windows-x86_64.msi
安装的时候选择添加环境变量就不用手动加了

2. 安装windows-build-tools

需要在管理员模式下安装, 右键Window图标 - 终端(管理员)
npm install --global windows-build-tools
安装之后重启终端

3.安装opencv4.6

下载地址:https://nchc.dl.sourceforge.net/project/opencvlibrary/4.6.0/opencv-4.6.0-vc14_vc15.exe
安装后设置环境变量, 我的opencv安装在C:\tools\

环境变量名
OPENCV_INCLUDE_DIR C:\tools\opencv\build\include
OPENCV_LIB_DIR C:\tools\opencv\build\x64\vc15\lib
OPENCV_BIN_DIR C:\tools\opencv\build\x64\vc15\bin
OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION 4.6.0
OPENCV4NODEJS_DISABLE_AUTOBUILD 1

package.json中添加代码(我的opencv安装在C:\tools, 路径根据实际情况改)

"opencv4nodejs": {
    "disableAutoBuild": 1,
    "opencvIncludeDir": "C:\\tools\\opencv\\build\\include",
    "opencvLibDir": "C:\\tools\\opencv\\build\\x64\\vc15\\lib",
    "opencvBinDir": "C:\\tools\\opencv\\build\\x64\\vc15\\bin",
    "autoBuildOpencvVersion": "4.6.0"
  }
4. 在命令行中执行语句(管理员模式)

cnpm i @u4/opencv4nodejs -g
cnpm i node-gyp -g
npm link
build-opencv --version 4.6.0 rebuild
安装之后重启终端!

5. 在项目中安装@u4/opencv4nodejs

不能用cnpm, 这一步只是从全局node_modules复制过来, 如果不需要安装到全局, 可以第4步不加-g
npm install -S @u4/opencv4nodejs

6. 项目中使用
 const cv = require('@u4/opencv4nodejs')
7. 环境检查脚本, 复制保存成package.json同级的install.js文件, node install.js运行这个js文件(终端需要管理员权限), 也可以根据commends这个数组中的命令, 自己一行一行跑一下
const fs = require('fs');
const { exec } = require('child_process');
const path = require('path');

let reminder = {
  node: { version: ">= 16.0.0"},
  python: { version: ">= 3.8 & <=3.10"},
  cmake: { version: "3.26.0"},
  opencv: { version: ">= 4.6"},
};
let opencvVariable = [
  {
    name: 'OPENCV_INCLUDE_DIR', 
    value: process.env.OPENCV_INCLUDE_DIR,
    example: 'C:\\tools\\opencv\\build\\include',
  },
  {
    name: 'OPENCV_BUILD_ROOT',  
    value: process.env.OPENCV_BUILD_ROOT,
    example: 'C:\\tools\\opencv',
  },
  {
    name: 'OPENCV_LIB_DIR', 
    value: process.env.OPENCV_LIB_DIR,
    example: 'C:\\tools\\opencv\\build\\x64\\vc15\\lib',
  },
  {
    name: 'OPENCV_BIN_DIR',
    value: process.env.OPENCV_BIN_DIR,  
    example: 'C:\\tools\\opencv\\build\\x64\\vc15\\bin',
  },
  {
    name: 'OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION', 
    value: process.env.OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION,  
    example: '4.7.0',
  },
  {
    name: 'OPENCV4NODEJS_DISABLE_AUTOBUILD',
    value: process.env.OPENCV4NODEJS_DISABLE_AUTOBUILD,     
    example: '1',
  },
]

console.log(`\n需要准备的基本环境(都需要配置环境变量)\n`);
console.table(reminder);
console.log(`\nopencv环境变量\n`);
console.table(opencvVariable);
const isWin = (() => {
  return /^win/.test(process.platform);
})();
let _ = process.argv.splice(2);
let opencv = _[0] || process.env.OPENCV_BUILD_ROOT
const OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION = process.env.OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION || '4.6.0'



const execCmd = (cmd, path) => {
  return new Promise((resolve, reject) => {
    try {
      exec(cmd, { cwd: path }, (err, stdout, stderr) => {
        if (stdout) {
          resolve(stdout);
          return;
        }
        reject(err || stderr);
      });
    } catch (e) {
      reject(e);
    }
  });
};

const commends = [
  {
    cmd: 'node -v',
    error: 'node未安装',
    after: (stdout) => {
      const strs = stdout.match(/(0|[1-9]\d*)\./, 'g');
      if (strs[1] !== '16') {
        console.error('node版本不等于16')
      } else {
        console.log(`node版本: ${stdout}`)
      }
    }
  },
  {
    cmd: 'python -V',
    error: 'python未安装',
    after: (stdout) => {
      const strs = stdout.match(/(0|[1-9]\d*)\./, 'g');
      const strs2 = stdout.match(/\.(0|[1-9]\d*)\./, 'g');
      if (strs[1] !== '3') {
        console.error('python版本不等于3')
      } else if ( strs2[1] > 10 || strs2[1] < 8 ) {
        console.error(`python版本范围是3.8至3.10, 当前环境为${stdout}`)
      } else {
        console.log(`python版本: ${stdout}`)
      }
    }
  },
  {
    cmd: 'cmake -version',
    error: 'cmake未安装',
    after: (stdout) => {
      const strs = stdout.match(/(0|[1-9]\d*)\.(0|[1-9]\d*)/, 'g');
      if (strs[1] !== '3.26') {
        console.error('cmake版本不等于3.26')
      } else {
        console.log(`cmake版本: ${stdout}`)
      }
    }
  },
  {
    before: () => console.log(`根据OPENCV_BUILD_ROOT环境变量, 修改package.json文件`),
    cmd: '',
    error: 'opencv访问路径错误, 请确定OPENCV_BUILD_ROOT环境变量是否正确',
    after: () => {
      try {
        let opencvIncludeDir = ''
        let opencvLibDir = ''
        let opencvBinDir = ''
        if (isWin) {
          opencvIncludeDir = path.join(opencv, '\\build\\include').replaceAll('\\', '\\\\')
          opencvLibDir = path.join(opencv, '\\build\\x64\\vc15\\lib').replaceAll('\\', '\\\\')
          opencvBinDir = path.join(opencv, '\\build\\x64\\vc15\\bin').replaceAll('\\', '\\\\')
        } else {
          opencvIncludeDir = path.join(opencv, '/build/include')
          opencvLibDir = path.join(opencv, '/build/x64/vc15/lib')
          opencvBinDir = path.join(opencv, '/build/x64/vc15/bin')
        }
        fs.statSync(opencvIncludeDir);
        fs.statSync(opencvLibDir);
        fs.statSync(opencvBinDir);
        const data = fs.readFileSync('./package.json', 'utf8');
        let newData
        newData = data.replace(/"opencvIncludeDir": ".*"/gi, `"opencvIncludeDir": "${opencvIncludeDir}"`)
        newData = newData.replace(/"opencvLibDir": ".*"/gi, `"opencvLibDir": "${opencvLibDir}"`)
        newData = newData.replace(/"opencvBinDir": ".*"/gi, `"opencvBinDir": "${opencvBinDir}"`)
        newData = newData.replace(/"autoBuildOpencvVersion": ".*"/gi, `"autoBuildOpencvVersion": "${OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION}"`)
        fs.writeFileSync('./package.json', newData)
      } catch (error) {
        throw error
      }
    }
  },
  {
    cmd: 'cnpm -v',
    error: 'cnpm未安装, 运行 npm install -g cnpm --registry=https://registry.npm.taobao.org 安装cnpm后重试',
    after: () => console.log('将使用cnpm安装依赖')
  },
  {
    before: () => console.log(`@u4/opencv4nodejs 安装`),
    cmd: 'cnpm i @u4/opencv4nodejs -g',
    error: '@u4/opencv4nodejs 安装失败',
    after: () => console.log('@u4/opencv4nodejs 已安装到全局')
  },
  {
    before: () => console.log(`node-gyp 安装`),
    cmd: 'cnpm i node-gyp -g',
    error: 'node-gyp 安装失败',
    after: () => console.log('node-gyp 已安装到全局')
  },
  {
    before: () => console.log(`npm link 安装`),
    cmd: 'npm link',
    error: 'npm link 安装失败',
    after: () => console.log('npm link 运行成功')
  },
  {
    before: () => console.log(`build-opencv opencv 构建`),
    cmd: `build-opencv --version ${OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION} rebuild`,
    error: 'build-opencv 打包失败',
    after: () => console.log('opencv 构建成功')
  },
  {
    before: (cmd) => console.log(`执行命令${cmd}, 这一步有点久, 10分钟左右`),
    cmd: 'npm run install',
    error: '安装依赖失败, 删除项目下的node_modules文件后重试',
    after: () => console.log('依赖安装完毕')
  },
];



(async () => {
  for (let index = 0; index < commends.length; index++) {
    const commend = commends[index];
    let {
      cmd,
      before,
      after,
      error
    } = commend
    try {
      let stdout
      before && before(cmd)
      if (cmd) {
        stdout = await execCmd(cmd);
      }
      after && after(stdout)
    } catch (e) {
      throw `${error || ''} >> ${e}`
    }
  }
})()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容