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