当前位置: 首页 > news >正文

OpenCV 4.10.0 移植

OpenCV 4.10.0 移植使用

    • 概述
    • 移植编译
        • 下载解压
        • 编译环境
        • 编译
    • 编译完成
      • OpenCV 库文件及其作用
    • 使用实例
      • 参考代码
    • 参考

在这里插入图片描述

概述

     OpenCV(Open Source Computer Vision Library)是计算机视觉领域最广泛使用的开源库之一,提供了丰富的功能模块,包括​​图像处理、视频分析、目标检测、特征提取、机器学习、深度学习推理、3D重建、相机标定​​等。它支持多种编程语言(C++、Python、Java等),并能在Windows、Linux、macOS、Android、iOS等主流操作系统上运行,是工业检测、自动驾驶、医学影像、AR/VR、机器人导航等领域的核心工具。
     根据项目需求,提前预演引入OpenCV的支持, 本文基于aarch64交叉编译器配置移植OpenCV, 并通过修改一个简单的图片处理demo验证基本功能.

编译主机环境:

属性
系统Ubuntu 18.04
内存16GB
CPUI7
CMakecmake version 3.20.0
其他系统环境比较齐全, 已经编译过android系统等平台SDK

移植编译

下载解压

官网当前发布的最新版本是4.11.0, 本文下载的是4.10.0

编译环境
sudo apt update
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-22-dev
编译

OpenCV 4.10.0 用的是CMake来构建编译, 为了方便, 编写一个编译脚本, 便于修改维护后续的一些编译指令:

## 创建build, 存放编译输出
if [ ! -d build ]; thenmkdir build
elserm -rf build/*
ficd build## 创建交叉编译器的cmake 文件, 传递交叉编译器的配置信息给opencv
## 按实际修改对应的配置, 比如交叉编译器的路径, 平台信息等
echo "# define toolchain" > toolchain.cmake
echo "set(CMAKE_SYSTEM_NAME Linux)"  >> toolchain.cmake
echo "set(CMAKE_SYSTEM_PROCESSOR aarch64)" >> toolchain.cmake
echo "set(TOOLCHAIN_DIR \"/mnt/toolchains/aarch64-mix210-linux\")" >> toolchain.cmake
echo "set(CMAKE_C_COMPILER \"\${TOOLCHAIN_DIR}/bin/aarch64-mix210-linux-gcc\")" >> toolchain.cmake
echo "set(CMAKE_CXX_COMPILER \"\${TOOLCHAIN_DIR}/bin/aarch64-mix210-linux-g++\")" >> toolchain.cmake
echo "set(CMAKE_AR \"\${TOOLCHAIN_DIR}/bin/aarch64-mix210-linux-ar\")" >> toolchain.cmake
echo "set(CMAKE_STRIP \"\${TOOLCHAIN_DIR}/bin/aarch64-mix210-linux-strip\")" >> toolchain.cmake
echo "" >> toolchain.cmake## 引入arm的标准配置, 这个需要根据实际需求修改.
echo "include(\"/mnt/opencv-4.10.0/platforms/linux/arm.toolchain.cmake\")" >> toolchain.cmake
echo "" >> toolchain.cmake## 按需更改OpenCV配置:
echo "START Configure..."
cmake -D CMAKE_BUILD_TYPE=RELEASE \-DCMAKE_TOOLCHAIN_FILE=toolchain.cmake \-D CMAKE_INSTALL_PREFIX=. \-D INSTALL_C_EXAMPLES=ON \-D INSTALL_PYTHON_EXAMPLES=OFF \-D OPENCV_GENERATE_PKGCONFIG=ON \-D BUILD_EXAMPLES=ON \..#    -D OPENCV_EXTRA_MODULES_PATH=../modules\echo "START building"
make -j8echo "--END--"

编译完成

在build目录下, 可以看到一下so库:
在这里插入图片描述

OpenCV 库文件及其作用

  1. libopencv_core.so (.4.10.0, .410)

    • 模块名称:Core
    • 作用:OpenCV 的核心模块,包含基本数据结构(如 cv::Mat)、矩阵运算、数学函数和内存管理功能。
    • 主要功能
      • 图像和矩阵操作(如矩阵乘法、转置)。
      • 基本数据类型(如点、矩形、向量)。
      • 内存分配和释放、XML/YAML 文件读写。
    • 依赖性:几乎所有其他 OpenCV 模块都依赖此模块,是 OpenCV 的基础。
  2. libopencv_imgproc.so (.4.10.0, .410)

    • 模块名称:Image Processing
    • 作用:提供图像处理功能,包括滤波、几何变换、边缘检测等。
    • 主要功能
      • 图像滤波(如高斯模糊、中值滤波)。
      • 边缘检测(如 Canny 算法)。
      • 图像变换(如缩放、旋转、透视变换)。
      • 颜色空间转换(如 BGR 到灰度或 HSV)。
    • 使用场景:图像预处理、特征提取。
  3. libopencv_imgcodecs.so (.4.10.0, .410)

    • 模块名称:Image Codecs
    • 作用:支持图像的读写操作,处理各种图像格式(如 JPG、PNG)。
    • 主要功能
      • 图像加载(cv::imread)。
      • 图像保存(cv::imwrite)。
      • 支持格式如 JPEG、PNG、BMP、WebP 等。
    • 使用场景:您的需求(直接保存图像到指定路径)依赖此模块。
  4. libopencv_highgui.so (.4.10.0, .410)

    • 模块名称:High-level GUI
    • 作用:提供图形用户界面功能,用于显示图像和创建交互窗口。
    • 主要功能
      • 创建窗口(cv::namedWindow)。
      • 显示图像(cv::imshow)。
      • 捕获键盘/鼠标事件(cv::waitKey)。
    • 注意:依赖外部图形库(如 Linux 上的 GTK/Qt 或 Windows 的原生接口)。您遇到的 window.cpp:1284 错误与此模块相关,若不显示图像可避免使用。
  5. libopencv_calib3d.so (.4.10.0, .410)

    • 模块名称:Camera Calibration and 3D Reconstruction
    • 作用:支持相机标定和三维重建。
    • 主要功能
      • 相机内参和外参标定。
      • 立体视觉(例如视差图计算)。
      • 三维点云重建、姿态估计。
    • 使用场景:机器人导航、增强现实。
  6. libopencv_dnn.so (.4.10.0, .410)

    • 模块名称:Deep Neural Network
    • 作用:支持深度学习模型的加载和推理。
    • 主要功能
      • 加载预训练模型(如 TensorFlow、PyTorch、ONNX 格式)。
      • 运行神经网络推理(如图像分类、目标检测)。
      • 支持硬件加速(如 CUDA、OpenCL)。
    • 使用场景:目标检测、图像分割。
  7. libopencv_features2d.so (.4.10.0, .410)

    • 模块名称:2D Features Framework
    • 作用:提供特征点检测和匹配功能。
    • 主要功能
      • 特征检测(如 SIFT、SURF、ORB)。
      • 特征描述子和匹配。
      • 图像配准。
    • 使用场景:图像拼接、目标跟踪。
  8. libopencv_flann.so (.4.10.0, .410)

    • 模块名称:FLANN (Fast Library for Approximate Nearest Neighbors)
    • 作用:提供高效的近邻搜索算法。
    • 主要功能
      • 快速最近邻搜索(用于特征点匹配)。
      • 支持 KD 树、K-Means 等算法。
    • 使用场景:特征匹配、聚类。
  9. libopencv_gapi.so (.4.10.0, .410)

    • 模块名称:Graph API
    • 作用:提供基于图的图像处理框架,用于优化计算流程。
    • 主要功能
      • 构建图像处理流水线。
      • 支持跨平台优化(CPU、GPU)。
    • 使用场景:高性能图像处理、实时应用。
  10. libopencv_ml.so (.4.10.0, .410)

    • 模块名称:Machine Learning
    • 作用:提供传统机器学习算法。
    • 主要功能
      • 支持算法如 SVM、决策树、KNN、随机森林。
      • 模型训练和预测。
    • 使用场景:图像分类、回归分析。
  11. libopencv_objdetect.so (.4.10.0, .410)

    • 模块名称:Object Detection
    • 作用:支持目标检测功能。
    • 主要功能
      • 人脸检测(Haar 级联、LBP 级联)。
      • 特定对象检测(如 QR 码、行人)。
    • 使用场景:监控、安防。
  12. libopencv_photo.so (.4.10.0, .410)

    • 模块名称:Photo
    • 作用:提供计算摄影功能。
    • 主要功能
      • 图像修复(如去噪、去模糊)。
      • HDR 成像、图像去雾。
    • 使用场景:图像增强、艺术效果。
  13. libopencv_stitching.so (.4.10.0, .410)

    • 模块名称:Image Stitching
    • 作用:支持图像拼接,生成全景图。
    • 主要功能
      • 特征点匹配和图像对齐。
      • 图像融合生成无缝全景图。
    • 使用场景:全景摄影、地图生成。
  14. libopencv_video.so (.4.10.0, .410)

    • 模块名称:Video Analysis
    • 作用:提供视频处理和运动分析功能。
    • 主要功能
      • 光流跟踪(如 Lucas-Kanade)。
      • 背景建模和运动检测。
    • 使用场景:视频跟踪、动作分析。
  15. libopencv_videoio.so (.4.10.0, .410)

    • 模块名称:Video I/O
    • 作用:支持视频的读写和捕获。
    • 主要功能
      • 读取视频文件(cv::VideoCapture)。
      • 写入视频文件(cv::VideoWriter)。
      • 访问摄像头或视频流。
    • 使用场景:视频处理、实时流。
  16. libopencv_ts.a

    • 模块名称:Test
    • 作用:OpenCV 的测试模块,包含测试框架和26. libopencv_ts.a
    • 模块名称:Test
    • 作用:OpenCV 的测试模块,包含测试框架和工具函数。
    • 主要功能
      • 用于 OpenCV 内部单元测试和性能测试。
      • 提供测试相关的基础设施。
    • 注意:此模块为静态库(.a),通常仅用于 OpenCV 开发和测试,非用户程序直接使用。

使用实例

注意事项:

  • 依赖性:某些模块(如 highgui)依赖外部库(GTK/Qt)。若仅保存图像,imgcodecs 足以,无需 highgui
  • 编译配置:使用 OpenCVConfig.cmake(如前所述)可自动处理模块依赖。例如:
    find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs)
    
  • 环境变量:确保库路径在 LD_LIBRARY_PATH 中(Linux),例如:
    export LD_LIBRARY_PATH=/mnt/opencv_lib:$LD_LIBRARY_PATH
    

参考代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)# 项目名称和语言
project(OpenCV_Demo LANGUAGES CXX C)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 设置交叉编译工具链
set(TOOLCHAINS /mnt/toolchains/aarch64-mix210-linux)
set(CMAKE_C_COMPILER ${TOOLCHAINS}/bin/aarch64-mix210-linux-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAINS}/bin/aarch64-mix210-linux-g++)## OPEN_CV
set(SRC_DIR ${CMAKE_SOURCE_DIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${SRC_DIR}/build/output)
set(OpenCV_DIR /mnt/opencv-4.10.0/build)
# 查找 OpenCV 包
find_package(OpenCV REQUIRED)# 包含 OpenCV 头文件目录
include_directories(${OpenCV_INCLUDE_DIRS})# 包含目录
include_directories(${SRC_DIR}/include
)add_executable(edge_sampleedge_sample.cpp
)target_link_libraries(edge_sample ${OpenCV_LIBS})

edge_sample.cpp

#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"#include <stdio.h>using namespace cv;
using namespace std;int edgeThresh = 5;
int edgeThreshScharr=1;Mat image, gray, blurImage, edge1, edge2, cedge;// define a trackbar callback
static void onTrackbar(int, void*)
{blur(gray, blurImage, Size(3,3));imwrite("/mnt/imgs/1_blur.jpg", blurImage);// Run the edge detector on grayscaleCanny(blurImage, edge1, edgeThresh, edgeThresh*3, 3);cedge = Scalar::all(0);image.copyTo(cedge, edge1);//imshow(window_name1, cedge);imwrite("/mnt/imgs/2_candy.jpg", edge1);/// Canny detector with scharrMat dx,dy;Scharr(blurImage,dx,CV_16S,1,0);Scharr(blurImage,dy,CV_16S,0,1);Canny( dx,dy, edge2, edgeThreshScharr, edgeThreshScharr*3 );/// Using Canny's output as a mask, we display our resultcedge = Scalar::all(0);image.copyTo(cedge, edge2);//imshow(window_name2, cedge);imwrite("/mnt/imgs/3_candy.png", edge2);
}static void help(const char** argv)
{printf("\nThis sample demonstrates Canny edge detection\n""Call:\n""    %s [image_name -- Default is fruits.jpg]\n\n", argv[0]);
}const char* keys =
{"{help h||}{@image |fruits.jpg|input image name}"
};int main( int argc, const char** argv )
{//help(argv);CommandLineParser parser(argc, argv, keys);string filename = parser.get<string>(0);printf("filename:%s\n", filename.c_str());image = imread(samples::findFile(filename), IMREAD_COLOR);if(image.empty()){printf("Cannot read image file: %s\n", filename.c_str());help(argv);return -1;}cedge.create(image.size(), image.type());cvtColor(image, gray, COLOR_BGR2GRAY);imwrite("/mnt/imgs/0_gray.jpg", gray);// Create a window//namedWindow(window_name1, 1);//namedWindow(window_name2, 1);// create a toolbar//createTrackbar("Canny threshold default", window_name1, &edgeThresh, 100, onTrackbar);//createTrackbar("Canny threshold Scharr", window_name2, &edgeThreshScharr, 400, onTrackbar);// Show the imageonTrackbar(0, 0);// Wait for a key stroke; the same function arranges events processing//waitKey(0);return 0;
}

把编译好的程序放到目标设备中去运行看看结果:

opencv_lib: 编译好的opencv 的so库
edge_sample: 测试程序
imgs: 测试图片目录

# 文件目录
/mnt # ls -l
-rwxrwxr-x    1 1000     1000       28.4K Jun 29  2025 edge_sample
drwxrwxr-x    2 1000     1000        4.0K Jun 29  2025 imgs
drwxrwxr-x    2 1000     1000        4.0K Jun 29  2025 opencv_lib# 运行测试
/mnt # export LD_LIBRARY_PATH=/mnt/opencv_lib:$LD_LIBRARY_PATH
/mnt # ./edge_sample imgs/sample.png 
filename:imgs/sample.png# 结果
/mnt # ls -l imgs/
total 676
-rw-r--r--    1 root     root         61950 Jun 29  2025 0_gray.jpg
-rw-r--r--    1 root     root         43720 Jun 29  2025 1_blur.jpg
-rw-r--r--    1 root     root        113186 Jun 29  2025 2_candy.jpg
-rw-r--r--    1 root     root         35619 Jun 29  2025 3_candy.png
-rw-rw-r--    1 1000     1000        278303 Dec 22  2024 sample.png
  1. 原图
    原图

  2. 灰度图:
    在这里插入图片描述

  3. 模糊处理:
    在这里插入图片描述

  4. Canny算子边缘检测
    在这里插入图片描述
    在这里插入图片描述

参考

  1. OpenCV的arm交叉编译版本安装步骤
  2. samples/cpp/edge.cpp
  3. OpenCV
  4. OpenCV 移植与交叉编译详细过程以及问题解决记录
http://www.lqws.cn/news/572671.html

相关文章:

  • Spring Cloud:服务监控与追踪的高级实践
  • C++ 第四阶段 STL 容器 - 第一讲:详解 std::vector
  • 5 c++核心——文件操作
  • restful规范
  • Oauth2 自定义设置token过期时间
  • HarmonyOS 公共事件机制介绍以及多进程之间的通信实现(9000字详解)
  • 【网络】:DNS协议、ICMP协议、NAT技术
  • MongoDB06 - MongoDB 地理空间
  • vllm部署私有智谱大模型
  • 疏通经脉: Bridge 联通逻辑层和渲染层
  • 模拟多维物理过程与基于云的数值分析-AI云计算数值分析和代码验证
  • 生物实验室安全、化学品安全
  • 【notes2】并发,IO,内存
  • 30套精品论文答辩开题报告PPT模版
  • Gemini cli Quickstart
  • 数据结构复习4
  • 常用指令合集(DOS/Linux/git/Maven等)
  • debug的计算表达式
  • 《平行宇宙思维如何让前端错误处理无懈可击》
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 20(题目+回答)
  • 各种常用的串口助手工具分享
  • 第10篇 图像语义分割和目标检测介绍
  • 循环神经网络的概念和案例
  • 带读YOLOv13,HyperACE | FullPAD到底是什么
  • 个人计算机系统安全、网络安全、数字加密与认证
  • 数据库中的 DDL(Data Definition Language,数据定义语言) 用于定义或修改数据库结构(如库、表、索引、约束等)。
  • 机器学习-02(深度学习的基本概念)
  • 智能新纪元:大语言模型如何重塑电商“人货场”经典范式
  • 【QT】信号和槽(1) 使用 || 定义
  • 深入学习 GORM:记录插入与数据检索