OpenCV 4.10.0 移植

在这里插入图片描述

概述

     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 ]; then
    mkdir build
else
    rm -rf build/*
fi

cd 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 -j8

echo "--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_sample
    edge_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 grayscale
    Canny(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 scharr
    Mat 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 result
    cedge = 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 image
    onTrackbar(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 移植与交叉编译详细过程以及问题解决记录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值