1.安装编译

1.1 linux安装

在 Ubuntu 系统上安装 OpenCV 可以通过以下步骤进行。请注意,这些步骤是基于我截止到 2021 年 9 月的知识,如果有新的版本发布,步骤可能会有所变化。以下是基本的安装步骤:

  1. 更新包管理器:

    在终端中运行以下命令,以确保你的包管理器是最新的:

    sudo apt update
    sudo apt upgrade
  2. 安装必要的依赖项:

    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 在大多数情况下的编译和安装。

如果你遇到其他问题,请随时询问。

  1. 下载 OpenCV 源代码:

    使用 git 克隆 OpenCV 的源代码仓库:

    git clone https://github.com/opencv/opencv.git
  2. 编译和安装 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
  3. 配置动态库链接器:

    更新动态库链接器的缓存:

    sudo ldconfig

现在,OpenCV 应该已经成功安装在你的 Ubuntu 系统上了。你可以在终端中使用 OpenCV 库进行开发,或者在你的代码中引用它。

请注意,安装过程可能因你的系统和 OpenCV 版本而有所不同。如果你遇到问题,可以参考 OpenCV 官方文档或开发者社区寻求帮助。

6.手动创建opencv.pc

如果在你的系统上没有生成 opencv.pc 文件,那么在使用 opencv4nodejs 时可能会遇到问题,因为该库需要 .pc 文件来确定 OpenCV 的位置和编译选项。

在这种情况下,你可能需要手动创建一个名为 opencv.pc 的 .pc 文件,以便让 opencv4nodejs 正确地找到 OpenCV。以下是一个简单的示范文件,你可以根据你的实际安装路径进行调整:

  1. 创建一个名为 opencv.pc 的文件,例如在 /usr/local/lib/pkgconfig 目录下(如果该目录不存在,可以先创建它)。

    sudo mkdir /usr/local/lib/pkgconfig

     

  2. 将以下内容复制到 opencv.pc 文件中:

    sudo vim /usr/local/lib/pkgconfig/opencv.pc

     

  3. 获取版本号
     

    import cv2
    print(cv2.__version__)

     

  4. 注意版本号: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

1.2 windows安装

 

基本环境安装和配置步骤:

  1. 安装 CMake 并配置环境变量:

  2. 安装 windows-build-tools(我没有装成功也没有事,后面不影响)

    • 打开管理员模式终端(右键 Windows 图标,选择“终端(管理员)”)。

    • 运行以下命令以全局方式安装 windows-build-tools

      npm install --global windows-build-tools
    • 安装完成后,重启终端。

  3. 安装 OpenCV 4.6:

 

 

2.测试

 

    方法0:

pkg-config --modversion opencv

 

  1. 使用 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 

  1. 使用 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

然后按照以下步骤在终端中进行编译和运行:

  1. 打开终端。

  2. 使用 cd 命令切换到保存了你的 .cpp 文件的目录。假设你的文件在 /home/yys 目录下:

    cd /home/yys
  3. 使用 g++ 命令编译你的代码。在这里,你需要指定 OpenCV 的头文件路径和库链接标志。假设你的 OpenCV 安装路径是 /usr/local

    g++ -o test_opencv test_opencv.cpp -I/usr/local/include/opencv4 -lopencv_core -lopencv_imgcodecs -lopencv_highgui
  4. 编译成功后,会在同一目录下生成一个名为 test_opencv 的可执行文件。

  5. 运行编译后的可执行文件:

    ./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();

 

 

3.nodejs安装node环境编译

 

项目地址: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

nodejs几种安装方式

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命令将会使用该镜像源进行下载。

使用国内镜像源可以加快下载速度并避免一些网络问题,但请确保所选镜像源是稳定的和可信的。

 

 

4.opencv找图代码

单张图示例

当将代码封装为一个类时,您可以提高代码的可维护性和可重用性。下面是一个将之前的代码封装为类的示例,我还在注释中解释了每个方法的作用:

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 方法来运行整个流程,传递图像路径和相似度阈值作为参数。这种封装方式使得代码更具结构性和可读性。

 

4.1windows运行全局库注意事项

如果你使用了 -g 参数通过全局安装来安装 @u4/opencv4nodejs 模块,那么可能的问题是,全局安装路径没有被正确添加到 Node.js 的模块搜索路径中。

你可以尝试以下步骤来解决这个问题:

  1. 查找全局模块路径:首先,你需要找到全局模块的安装路径。你可以在命令行中运行以下命令来查找全局模块的路径:

    npm root -g

    这将输出全局模块的路径,类似于:C:\Users\<YourUsername>\AppData\Roaming\npm\node_modules

  2. 添加路径到 NODE_PATH 环境变量:将上一步找到的全局模块路径添加到 NODE_PATH 环境变量中。你可以通过以下步骤实现:

    • 在命令行中运行以下命令来查看当前的 NODE_PATH 环境变量值:

      echo %NODE_PATH%
    • 如果没有设置 NODE_PATH,可以手动设置它,将全局模块的路径添加进去。例如:

      setx NODE_PATH C:\Users\<YourUsername>\AppData\Roaming\npm\node_modules

      请替换路径为你实际的全局模块路径。

  3. 重启终端:在设置 NODE_PATH 之后,关闭当前的终端窗口,并重新打开一个新的终端窗口。这样 NODE_PATH 才会生效。

  4. 尝试运行脚本:尝试重新运行 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 的社区中寻求帮助。

5.报错

 

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解决