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 |
CPU | I7 |
CMake | cmake 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 库文件及其作用
-
libopencv_core.so (.4.10.0, .410)
- 模块名称:Core
- 作用:OpenCV 的核心模块,包含基本数据结构(如
cv::Mat
)、矩阵运算、数学函数和内存管理功能。 - 主要功能:
- 图像和矩阵操作(如矩阵乘法、转置)。
- 基本数据类型(如点、矩形、向量)。
- 内存分配和释放、XML/YAML 文件读写。
- 依赖性:几乎所有其他 OpenCV 模块都依赖此模块,是 OpenCV 的基础。
-
libopencv_imgproc.so (.4.10.0, .410)
- 模块名称:Image Processing
- 作用:提供图像处理功能,包括滤波、几何变换、边缘检测等。
- 主要功能:
- 图像滤波(如高斯模糊、中值滤波)。
- 边缘检测(如 Canny 算法)。
- 图像变换(如缩放、旋转、透视变换)。
- 颜色空间转换(如 BGR 到灰度或 HSV)。
- 使用场景:图像预处理、特征提取。
-
libopencv_imgcodecs.so (.4.10.0, .410)
- 模块名称:Image Codecs
- 作用:支持图像的读写操作,处理各种图像格式(如 JPG、PNG)。
- 主要功能:
- 图像加载(
cv::imread
)。 - 图像保存(
cv::imwrite
)。 - 支持格式如 JPEG、PNG、BMP、WebP 等。
- 图像加载(
- 使用场景:您的需求(直接保存图像到指定路径)依赖此模块。
-
libopencv_highgui.so (.4.10.0, .410)
- 模块名称:High-level GUI
- 作用:提供图形用户界面功能,用于显示图像和创建交互窗口。
- 主要功能:
- 创建窗口(
cv::namedWindow
)。 - 显示图像(
cv::imshow
)。 - 捕获键盘/鼠标事件(
cv::waitKey
)。
- 创建窗口(
- 注意:依赖外部图形库(如 Linux 上的 GTK/Qt 或 Windows 的原生接口)。您遇到的
window.cpp:1284
错误与此模块相关,若不显示图像可避免使用。
-
libopencv_calib3d.so (.4.10.0, .410)
- 模块名称:Camera Calibration and 3D Reconstruction
- 作用:支持相机标定和三维重建。
- 主要功能:
- 相机内参和外参标定。
- 立体视觉(例如视差图计算)。
- 三维点云重建、姿态估计。
- 使用场景:机器人导航、增强现实。
-
libopencv_dnn.so (.4.10.0, .410)
- 模块名称:Deep Neural Network
- 作用:支持深度学习模型的加载和推理。
- 主要功能:
- 加载预训练模型(如 TensorFlow、PyTorch、ONNX 格式)。
- 运行神经网络推理(如图像分类、目标检测)。
- 支持硬件加速(如 CUDA、OpenCL)。
- 使用场景:目标检测、图像分割。
-
libopencv_features2d.so (.4.10.0, .410)
- 模块名称:2D Features Framework
- 作用:提供特征点检测和匹配功能。
- 主要功能:
- 特征检测(如 SIFT、SURF、ORB)。
- 特征描述子和匹配。
- 图像配准。
- 使用场景:图像拼接、目标跟踪。
-
libopencv_flann.so (.4.10.0, .410)
- 模块名称:FLANN (Fast Library for Approximate Nearest Neighbors)
- 作用:提供高效的近邻搜索算法。
- 主要功能:
- 快速最近邻搜索(用于特征点匹配)。
- 支持 KD 树、K-Means 等算法。
- 使用场景:特征匹配、聚类。
-
libopencv_gapi.so (.4.10.0, .410)
- 模块名称:Graph API
- 作用:提供基于图的图像处理框架,用于优化计算流程。
- 主要功能:
- 构建图像处理流水线。
- 支持跨平台优化(CPU、GPU)。
- 使用场景:高性能图像处理、实时应用。
-
libopencv_ml.so (.4.10.0, .410)
- 模块名称:Machine Learning
- 作用:提供传统机器学习算法。
- 主要功能:
- 支持算法如 SVM、决策树、KNN、随机森林。
- 模型训练和预测。
- 使用场景:图像分类、回归分析。
-
libopencv_objdetect.so (.4.10.0, .410)
- 模块名称:Object Detection
- 作用:支持目标检测功能。
- 主要功能:
- 人脸检测(Haar 级联、LBP 级联)。
- 特定对象检测(如 QR 码、行人)。
- 使用场景:监控、安防。
-
libopencv_photo.so (.4.10.0, .410)
- 模块名称:Photo
- 作用:提供计算摄影功能。
- 主要功能:
- 图像修复(如去噪、去模糊)。
- HDR 成像、图像去雾。
- 使用场景:图像增强、艺术效果。
-
libopencv_stitching.so (.4.10.0, .410)
- 模块名称:Image Stitching
- 作用:支持图像拼接,生成全景图。
- 主要功能:
- 特征点匹配和图像对齐。
- 图像融合生成无缝全景图。
- 使用场景:全景摄影、地图生成。
-
libopencv_video.so (.4.10.0, .410)
- 模块名称:Video Analysis
- 作用:提供视频处理和运动分析功能。
- 主要功能:
- 光流跟踪(如 Lucas-Kanade)。
- 背景建模和运动检测。
- 使用场景:视频跟踪、动作分析。
-
libopencv_videoio.so (.4.10.0, .410)
- 模块名称:Video I/O
- 作用:支持视频的读写和捕获。
- 主要功能:
- 读取视频文件(
cv::VideoCapture
)。 - 写入视频文件(
cv::VideoWriter
)。 - 访问摄像头或视频流。
- 读取视频文件(
- 使用场景:视频处理、实时流。
-
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
-
原图
-
灰度图:
-
模糊处理:
-
Canny算子边缘检测
参考
- OpenCV的arm交叉编译版本安装步骤
- samples/cpp/edge.cpp
- OpenCV
- OpenCV 移植与交叉编译详细过程以及问题解决记录