windows 安裝 opencv4nodejs

基本環(huán)境(不推薦用其他版本)
軟件包 版本
node >= 16.0.0
python >= 3.8 & <=3.10
cmake 3.26.0
opencv >= 4.6
1. 安裝cmake并配置環(huán)境變量

下載地址:https://github.com/Kitware/CMake/releases
我選擇的版本:cmake-3.26.0-windows-x86_64.msi
安裝的時(shí)候選擇添加環(huán)境變量就不用手動(dòng)加了

2. 安裝windows-build-tools

需要在管理員模式下安裝, 右鍵Window圖標(biāo) - 終端(管理員)
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
安裝后設(shè)置環(huán)境變量, 我的opencv安裝在C:\tools\

環(huán)境變量名
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, 路徑根據(jù)實(shí)際情況改)

"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. 在命令行中執(zhí)行語(yǔ)句(管理員模式)

cnpm i @u4/opencv4nodejs -g
cnpm i node-gyp -g
npm link
build-opencv --version 4.6.0 rebuild
安裝之后重啟終端!

5. 在項(xiàng)目中安裝@u4/opencv4nodejs

不能用cnpm, 這一步只是從全局node_modules復(fù)制過(guò)來(lái), 如果不需要安裝到全局, 可以第4步不加-g
npm install -S @u4/opencv4nodejs

6. 項(xiàng)目中使用
 const cv = require('@u4/opencv4nodejs')
7. 環(huán)境檢查腳本, 復(fù)制保存成package.json同級(jí)的install.js文件, node install.js運(yùn)行這個(gè)js文件(終端需要管理員權(quán)限), 也可以根據(jù)commends這個(gè)數(shù)組中的命令, 自己一行一行跑一下
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需要準(zhǔn)備的基本環(huán)境(都需要配置環(huán)境變量)\n`);
console.table(reminder);
console.log(`\nopencv環(huán)境變量\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, 當(dāng)前環(huán)境為${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(`根據(jù)OPENCV_BUILD_ROOT環(huán)境變量, 修改package.json文件`),
    cmd: '',
    error: 'opencv訪問(wèn)路徑錯(cuò)誤, 請(qǐng)確定OPENCV_BUILD_ROOT環(huán)境變量是否正確',
    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未安裝, 運(yùn)行 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 運(yùn)行成功')
  },
  {
    before: () => console.log(`build-opencv opencv 構(gòu)建`),
    cmd: `build-opencv --version ${OPENCV4NODEJS_AUTOBUILD_OPENCV_VERSION} rebuild`,
    error: 'build-opencv 打包失敗',
    after: () => console.log('opencv 構(gòu)建成功')
  },
  {
    before: (cmd) => console.log(`執(zhí)行命令${cmd}, 這一步有點(diǎn)久, 10分鐘左右`),
    cmd: 'npm run install',
    error: '安裝依賴失敗, 刪除項(xiàng)目下的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}`
    }
  }
})()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容