编译安装opencv和nodejs安装cv方法
在 Ubuntu 系统上安装 OpenCV 可以通过以下步骤进行。请注意,这些步骤是基于我截止到 2021 年 9 月的知识,如果有新的版本发布,步骤可能会有所变化。以下是基本的安装步骤:
-
更新包管理器:
在终端中运行以下命令,以确保你的包管理器是最新的:
sudo apt update sudo apt upgrade
-
安装必要的依赖项:
OpenCV 的安装需要一些依赖库。运行以下命令以安装这些依赖项:
你可以省略 libdc1394-22-dev
软件包,只运行以下命令进行安装:
sudo apt install build-essential cmake git pkg-config libgtk-3-dev \
libavcodec-dev libavformat-dev libswscale-dev \
libv4l-dev libxvidcore-dev libx264-dev \
libjpeg-dev libpng-dev libtiff-dev gfortran \
openexr libatlas-base-dev python3-dev python3-numpy \
libtbb2 libtbb-dev libdc1394-dev
若libtbb2 报错。去掉既可以,自动安装相关依赖
这些软件包应该足以支持 OpenCV 在大多数情况下的编译和安装。
如果你遇到其他问题,请随时询问。
-
下载 OpenCV 源代码:
使用 git 克隆 OpenCV 的源代码仓库:
git clone https://github.com/opencv/opencv.git
-
编译和安装 OpenCV:
进入刚刚克隆的 OpenCV 目录,并创建一个用于编译的目录:
cd opencv mkdir build cd build
运行 cmake 生成编译配置:
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
然后,编译 OpenCV(时间久,我的surface 7 pro 需要1小时左右):
make -j$(nproc)
最后,将编译好的 OpenCV 安装到系统中:
sudo make install
-
配置动态库链接器:
更新动态库链接器的缓存:
sudo ldconfig
现在,OpenCV 应该已经成功安装在你的 Ubuntu 系统上了。你可以在终端中使用 OpenCV 库进行开发,或者在你的代码中引用它。
请注意,安装过程可能因你的系统和 OpenCV 版本而有所不同。如果你遇到问题,可以参考 OpenCV 官方文档或开发者社区寻求帮助。
6.手动创建opencv.pc
如果在你的系统上没有生成 opencv.pc
文件,那么在使用 opencv4nodejs
时可能会遇到问题,因为该库需要 .pc
文件来确定 OpenCV 的位置和编译选项。
在这种情况下,你可能需要手动创建一个名为 opencv.pc
的 .pc
文件,以便让 opencv4nodejs
正确地找到 OpenCV。以下是一个简单的示范文件,你可以根据你的实际安装路径进行调整:
-
创建一个名为
opencv.pc
的文件,例如在/usr/local/lib/pkgconfig
目录下(如果该目录不存在,可以先创建它)。sudo mkdir /usr/local/lib/pkgconfig
-
将以下内容复制到
opencv.pc
文件中:sudo vim /usr/local/lib/pkgconfig/opencv.pc
-
获取版本号
import cv2 print(cv2.__version__)
-
注意版本号:Version: 4.x.x,其他不用改,我的4.8.0的
# opencv.pc prefix=/usr/local exec_prefix=${prefix} includedir=${prefix}/include libdir=${exec_prefix}/lib Name: OpenCV Description: Open Source Computer Vision Library Version: 4.8.0 Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_stitching -lopencv_gapi -lopencv_photo -lopencv_imgcodecs -lopencv_videoio Cflags: -I${includedir}/opencv4
注意将
Version
替换为你安装的 OpenCV 版本。
pkg-config --modversion opencv
基本环境安装和配置步骤:
-
安装 CMake 并配置环境变量:
- 下载地址:https://github.com/Kitware/CMake/releases
- 选择合适的版本,例如
cmake-3.26.0-windows-x86_64.msi
。 - 在安装过程中选择添加环境变量,这将自动配置环境变量。
-
安装
windows-build-tools(我没有装成功也没有事,后面不影响)
:-
打开管理员模式终端(右键 Windows 图标,选择“终端(管理员)”)。
-
运行以下命令以全局方式安装
windows-build-tools
:npm install --global windows-build-tools
-
安装完成后,重启终端。
-
-
安装 OpenCV 4.6:
-
下载地址:https://nchc.dl.sourceforge.net/project/opencvlibrary/4.6.0/opencv-4.6.0-vc14_vc15.exe 官网:Releases - OpenCV
-
安装 OpenCV。
-
设置以下环境变量(属性→高级系统设置→环境变量):
环境变量名 值 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
-
方法0:
pkg-config --modversion opencv
- 使用 python测试:
python3 -c "import cv2; print(cv2.__version__)"
yys@yys-virtual-machine:~/cv/opencv$ python3 -c "import cv2; print(cv2.__version__)"
4.8.0-dev
-
使用 OpenCV 库:
创建一个简单的 C++ 或 C 代码文件,使用 OpenCV 库的一些功能。比如,你可以尝试读取图像并将其保存为不同格式,或者进行简单的图像处理操作。如果编译并运行这个文件没有问题,说明 OpenCV 库成功地链接并可用。
这里是一个简单的示例 C++ 代码,用于读取图像并显示其尺寸:
#include <opencv2/opencv.hpp> #include <iostream> int main() { cv::Mat image = cv::imread("path_to_your_image.jpg"); // 替换为你的图像文件路径 if (!image.empty()) { std::cout << "Image dimensions: " << image.cols << "x" << image.rows << std::endl; } else { std::cout << "Failed to read image." << std::endl; } return 0; }
编译并运行上述代码,替换
path_to_your_image.jpg
为你的图像文件路径。如果代码能够成功编译和运行,并输出图像的尺寸,说明 OpenCV 库已经成功链接。
通过运行这些示例,你可以验证编译安装的 OpenCV 是否已经正确地集成到你的系统中。如果你在编译或运行过程中遇到问题,你可能需要检查你的编译选项、库路径和依赖项,确保它们都正确配置。
将上述代码保存为一个以 .cpp
为扩展名的文件,比如 test_opencv.cpp
。
然后按照以下步骤在终端中进行编译和运行:
-
打开终端。
-
使用
cd
命令切换到保存了你的.cpp
文件的目录。假设你的文件在/home/yys
目录下:cd /home/yys
-
使用
g++
命令编译你的代码。在这里,你需要指定 OpenCV 的头文件路径和库链接标志。假设你的 OpenCV 安装路径是/usr/local
:g++ -o test_opencv test_opencv.cpp -I/usr/local/include/opencv4 -lopencv_core -lopencv_imgcodecs -lopencv_highgui
-
编译成功后,会在同一目录下生成一个名为
test_opencv
的可执行文件。 -
运行编译后的可执行文件:
./test_opencv
程序会读取指定的图像文件,并显示其尺寸。请确保将 "path_to_your_image.jpg"
替换为你实际的图像文件路径。
这样,你就可以在终端中运行你的 OpenCV C++ 代码并进行测试了。如果你遇到任何错误,可以检查是否正确指定了 OpenCV 的头文件和库路径,以及你的图像文件是否位于指定路径下。
nodejs代码
const cv = require('@u4/opencv4nodejs');
function testOpenCV() {
try{
// 创建一个 3x3 的单位矩阵
const mat = cv.Mat.eye(3, 3, cv.CV_8U);
// 打印矩阵的行数和列数
console.log('Matrix rows:', mat.rows);
console.log('Matrix cols:', mat.cols);
// 访问矩阵元素 (0, 0)
const value = mat.at(0, 0);
console.log('Value at (0, 0):', value);
// 创建另一个矩阵
const mat2 = new cv.Mat([[1, 2, 3], [4, 5, 6], [7, 8, 9]], cv.CV_8U);
// 矩阵相乘 (结果应该还是单位矩阵)
const result = mat.mul(mat2);
console.log("Multiplication Result", result.getDataAsArray());
// 检查矩阵是否为空
console.log('Is mat empty?', mat.empty);
console.log("result type:", result.type)
console.log("mat2 depth:", mat2.depth)
console.log("mat channels:", mat.channels)
console.log('OpenCV test successful!');
} catch (error) {
console.error('OpenCV test failed:', error);
process.exit(1); // 退出并返回错误码
}
}
testOpenCV();
项目地址:UrielCh/opencv4nodejs: Nodejs bindings to OpenCV 3 and OpenCV 4 (github.com)
packge.json
{
"dependencies": {
"@u4/opencv4nodejs": "^6.5.2"
},
"opencv4nodejs":{
"disableAutoBuild": "1",
"autoBuildOpencvVersion": "4.8.0"
}
}
全局安装 @u4/opencv4nodejs
export OPENCV4NODEJS_DISABLE_AUTOBUILD=1
npm i @u4/opencv4nodejs -g
npm i node-gyp -g
build-opencv --version 4.8.0 rebuild
如果报错
at maybeClose (node:internal/child_process:1091:16) at ChildProcess._handle.onexit (node:internal/child_process:302:5) { code: 1, killed: false, signal: null, cmd: 'node-gyp rebuild --jobs max --release ' } ERR! install node-gyp failed and return Error Command failed: node-gyp rebuild --jobs max --release ERR! install gyp info it worked if it ends with ok ERR! install gyp info using node-gyp@9.4.0 ERR! install gyp info using node@18.17.0 | linux | x64 ERR! install gyp info find Python using Python version 3.10.12 found at "/usr/bin/python3" ERR! install gyp http GET https://nodejs.org/download/release/v18.17.0/node-v18.17.0-headers.tar.gz ERR! install gyp WARN install got an error, rolling back install ERR! install gyp ERR! configure error ERR! install gyp ERR! stack FetchError: request to https://nodejs.org/download/release/v18.17.0/node-v18.17.0-headers.tar.gz failed, reason: connect ETIMEDOUT 104.20.23.46:443 ERR! install gyp ERR! stack at ClientRequest.<anonymous> (/usr/local/nodejs/lib/node_modules/node-gyp/node_modules/minipass-fetch/lib/index.js:130:14) ERR! install gyp ERR! stack at ClientRequest.emit (node:events:514:28) ERR! install gyp ERR! stack at TLSSocket.socketErrorListener (node:_http_client:501:9) ERR! install gyp ERR! stack at TLSSocket.emit (node:events:526:35) ERR! install gyp ERR! stack at emitErrorNT (node:internal/streams/destroy:151:8) ERR! install gyp ERR! stack at emitErrorCloseNT (node:internal/streams/destroy:116:3) ERR! install gyp ERR! stack at process.processTicksAndRejections (node:internal/process/task_queues:82:21) ERR! install gyp ERR! System Linux 5.19.0-32-generic ERR! install gyp ERR! command "/usr/local/nodejs/bin/node" "/usr/local/nodejs/bin/node-gyp" "rebuild" "--jobs" "max" "--release" ERR! install gyp ERR! cwd /usr/local/nodejs/lib/node_modules/@u4/opencv4nodejs ERR! install gyp ERR! node -v v18.17.0 ERR! install gyp ERR! node-gyp -v v9.4.0 ERR! install gyp ERR! not ok ERR! install return code: 1
是的,您可以使用npm
命令行工具来下载依赖包,包括Node.js本身。如果您想使用国内的镜像源进行下载,可以使用--registry
参数来指定镜像源。
请注意,npm
命令还支持其他参数和选项,根据您的需要进行调整。如果您希望将默认的npm镜像源更改为国内镜像源,您可以使用以下命令:
npm config set registry https://registry.npm.taobao.org
这将更改npm的默认镜像源为淘宝的镜像源,以后通过npm install
命令将会使用该镜像源进行下载。
使用国内镜像源可以加快下载速度并避免一些网络问题,但请确保所选镜像源是稳定的和可信的。
单张图示例
当将代码封装为一个类时,您可以提高代码的可维护性和可重用性。下面是一个将之前的代码封装为类的示例,我还在注释中解释了每个方法的作用:
const cv = require('@u4/opencv4nodejs');
class ImageMatcher {
/**
* 构造函数
*/
constructor() {
// 可在此初始化一些属性
}
/**
* 寻找相似图片并获取匹配信息
* @param {string} imsrcPath - 源图像路径
* @param {string} imobjPath - 目标图像路径
* @param {number} similarityThreshold - 相似度阈值
* @returns {object|null} - 匹配信息对象或null
*/
async findMatchingImages(imsrcPath, imobjPath, similarityThreshold) {
const imsrc = await cv.imreadAsync(imsrcPath);
const imobj = await cv.imreadAsync(imobjPath);
const res = imsrc.matchTemplate(imobj, cv.TM_CCOEFF_NORMED);
const { maxLoc } = cv.minMaxLoc(res);
const similarity = res.at(maxLoc.y, maxLoc.x);
if (similarity > similarityThreshold) {
const centerX = maxLoc.x + imobj.cols / 2;
const centerY = maxLoc.y + imobj.rows / 2;
return { centerX, centerY, similarity };
}
return null;
}
/**
* 主函数
* @param {string} imsrcPath - 源图像路径
* @param {string} imobjPath - 目标图像路径
* @param {number} similarityThreshold - 相似度阈值
*/
async main(imsrcPath, imobjPath, similarityThreshold) {
try {
const result = await this.findMatchingImages(imsrcPath, imobjPath, similarityThreshold);
if (result) {
console.log(`找到相似度为 ${result.similarity} 的匹配`);
console.log(`中心点坐标:x=${result.centerX}, y=${result.centerY}`);
} else {
console.log('未找到匹配。');
}
} catch (error) {
console.error('错误:', error);
}
}
}
// 创建实例并调用主函数
const imageMatcher = new ImageMatcher();
imageMatcher.main('src1.png', 'src2.png', 0.9);
D:\node>node cv_find_pic.js
info config found opencv4nodejs section in D:\node\package.json
info applyEnvsFromPackageJson the following opencv4nodejs environment variables are set in the package.json:
info applyEnvsFromPackageJson disableAutoBuild: 1
info applyEnvsFromPackageJson autoBuildOpencvVersion: 4.6.0
找到相似度为 0.9999989867210388 的匹配
中心点坐标:x=112, y=898
这个封装的类名为 ImageMatcher
,其中有两个方法:findMatchingImages
和 main
。在注释中详细解释了每个方法的作用,使得代码更易于理解。创建一个类实例后,您可以调用 main
方法来运行整个流程,传递图像路径和相似度阈值作为参数。这种封装方式使得代码更具结构性和可读性。
如果你使用了 -g
参数通过全局安装来安装 @u4/opencv4nodejs
模块,那么可能的问题是,全局安装路径没有被正确添加到 Node.js 的模块搜索路径中。
你可以尝试以下步骤来解决这个问题:
-
查找全局模块路径:首先,你需要找到全局模块的安装路径。你可以在命令行中运行以下命令来查找全局模块的路径:
npm root -g
这将输出全局模块的路径,类似于:
C:\Users\<YourUsername>\AppData\Roaming\npm\node_modules
-
添加路径到 NODE_PATH 环境变量:将上一步找到的全局模块路径添加到
NODE_PATH
环境变量中。你可以通过以下步骤实现:-
在命令行中运行以下命令来查看当前的
NODE_PATH
环境变量值:echo %NODE_PATH%
-
如果没有设置
NODE_PATH
,可以手动设置它,将全局模块的路径添加进去。例如:setx NODE_PATH C:\Users\<YourUsername>\AppData\Roaming\npm\node_modules
请替换路径为你实际的全局模块路径。
-
-
重启终端:在设置
NODE_PATH
之后,关闭当前的终端窗口,并重新打开一个新的终端窗口。这样NODE_PATH
才会生效。 -
尝试运行脚本:尝试重新运行
cvtest.js
脚本,看是否能够正确找到@u4/opencv4nodejs
模块。
如果上述步骤不起作用,还可以尝试以下额外的措施:
- 使用
-g
安装模块可能会导致一些路径问题。你可以尝试使用局部安装,即在项目目录中运行npm install @u4/opencv4nodejs
,然后在代码中使用require('@u4/opencv4nodejs')
。 - 确保在脚本的开头添加
#!/usr/bin/env node
,以确保脚本使用的是正确的 Node.js 解释器。
如果问题仍然存在,可以查看 NODE_PATH
和 Node.js 的模块查找机制,或者在 Node.js 社区或 @u4/opencv4nodejs
的社区中寻求帮助。
cv2.error: OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:1255: error: (-2:Unspecified error) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function 'cvNamedWindow'
安装新版本opencv-python解决
本文作者: 永生
本文链接: https://yys.zone/detail/?id=301
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
评论列表 (0 条评论)