基本环境(不推荐用其他版本)
软件包 | 版本 |
---|---|
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}`
}
}
})()