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}`
    }
  }
})()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容