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.pswp.cn/news/912893.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912893.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912893.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat10.0以上版本编译成功但报错HTTP状态 404

Tomcat正常启动且项目已成功部署&#xff0c;但出现404错误。 HTTP状态 404 - 未找到package org.example;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpSer…

在Flask项目中用Git LFS管理大文件(PDF)的完整实践

在Flask项目中用Git LFS高效管理大文件(以农机说明书PDF为例) 背景与需求 在农机管理系统等实际项目中,经常需要上传和管理大量超大文件(如200MB以上的PDF说明书、图片等)。如果直接用Git管理这些大文件,不仅会导致仓库膨胀、clone/pull速度变慢,还可能遇到推送失败等…

朴素贝叶斯算法案例演示及Python实现

目录 一、基本原理二、案例演示2.1 未平滑处理2.2 Laplace平滑处理 三、Python实现 一、基本原理 朴素贝叶斯思想&#xff1a;依靠特征概率去预测分类&#xff0c;针对于代分类的样本&#xff0c;会求解在该样本出现的条件下&#xff0c;各个类别出现的概率&#xff0c;哪个类…

RAG从入门到高阶(二):Retrieve-and-Rerank

在上一篇教程中&#xff0c;我们了解了 Naive RAG 的基本原理和实现。它就像一个刚刚学会查找资料的新手&#xff0c;虽然能找到一些信息&#xff0c;但有时候找到的并不够精准&#xff0c;甚至会有一些无关的干扰。 今天&#xff0c;我们将介绍 Retrieve-and-Rerank RAG&…

【脚本】Linux磁盘目录挂载脚本(不分区)

以下是一个不带分区&#xff0c;直接挂载整个磁盘到指定目录的脚本。该脚本会检查磁盘是否已挂载&#xff0c;自动创建文件系统&#xff08;可选&#xff09;&#xff0c;并配置开机自动挂载&#xff1a; #!/bin/bash# 磁盘直接挂载脚本&#xff08;不分区&#xff09; # 使用…

壁纸网站分享

壁纸网站链接&#xff1a; 1.Microsoft Design - Wallpapers&#xff1a;https://wallpapers.microsoft.design/?refwww.8kmm.com 2.哲风壁纸&#xff1a;https://haowallpaper.com/wallpaperForum 3.壁纸湖&#xff1a;https://bizihu.com/ 4.极简壁纸&#xff1a;https://bz…

XILINX FPGA如何做时序分析和时序优化?

时序分析和时序优化是FPGA开发流程中关键步骤&#xff0c;确保设计在目标时钟频率下正确运行&#xff0c;避免时序违例&#xff08;如建立时间或保持时间不足&#xff09;。以下以Xilinx Kintex-7系列FPGA为例&#xff0c;详细介绍时序分析和时序优化的方法、工具、流程及实用技…

linux screen轻松管理长时间运行的任务

以下是针对 Alpine Linux 环境下 screen 的安装与使用指南&#xff0c;结合迁移数据场景的具体操作步骤&#xff1a; 1. 安装 screen‌ 在 Alpine Linux 中需通过 apk 安装&#xff08;非默认预装&#xff09;&#xff1a; apk add screen 验证安装&#xff1a; screen --…

VR制作公司业务范围

VR制作公司概念、能力与服务范围 虚拟现实&#xff08;Virtual Reality, VR&#xff09;技术&#xff0c;作为当代科技的前沿领域&#xff0c;通过计算机技术模拟出真实或虚构的世界环境&#xff0c;使用户能够沉浸其中并进行交互体验。VR制作公司&#xff0c;是这一领域的专业…

STM32之28BYJ-48步进电机驱动

目录 一、引言 二、28BYJ-48步进电机简介 2.1 基本特性 2.2 内部结构 2.3 工作模式 2.4 驱动原理 2.5 性能特点 2.6 驱动方案 2.7 使用注意事项 三、ULN2003驱动板简介 3.1 基本概述 3.2 电路结构 3.3 驱动原理 3.4 接口定义 3.5 使用注意事项 四、…

TDSQL如何查出某一列中的逗号数量

在 TDSQL 中&#xff0c;要统计某一列里逗号的数量&#xff0c;可借助字符串函数来实现。下面为你介绍具体的实现方法&#xff1a; sql SELECT your_column,LENGTH(your_column) - LENGTH(REPLACE(your_column, ,, )) AS comma_count FROM your_table;下面对这段 SQL 进行详细…

如何避免服务器出现故障情况?

服务器作为存储数据信息的重要网络设备&#xff0c;能够保护企业重要数据的安全性&#xff0c;但是随着网络攻击的不断拓展&#xff0c;各个行业中的服务器也会遭受到不同类型的网络攻击&#xff0c;严重的会导致服务器业务中断出现故障&#xff0c;给企业带来巨大的经济损失。…

C++ 优先级队列

一、引言 队列的特性是先进先出。优先级队列的本质是一个有序队列&#xff0c;根据成员的优先级&#xff0c;对队列中的成员进行排序。优先级队列默认是大顶堆&#xff0c;即堆顶元素最大 二、常用函数 empty()size()top()push()emplace()pop()swap() 三、代码示例 class …

学习笔记(27):线性回归基础与实战:从原理到应用的简易入门

线性回归&#xff1a;通过拟合线性方程&#xff08;如 \(y w_1x_1 w_2x_2 b\)&#xff09;预测房价、销售额等连续变量&#xff0c;需掌握特征标准化、正则化&#xff08;L1/L2&#xff09;防止过拟合。应用场景&#xff1a;金融领域的股价预测、电商用户消费金额预估。 线性…

kubesphere安装openelb

kubesphere安装openelb 1.安装openelb 2.修改配置文件 1.命令直接修改 $ kubectl edit configmap kube-proxy -n kube-system ipvs:strictARP: truemode: "ipvs"重启kube-proxy组件 $ kubectl rollout restart daemonset kube-proxy -n kube-system 2.通过界面去修…

数据库10:MySQL的数据类型与约束和属性设置,数据模式

一.数据类型 整数类型&#xff08;integer types&#xff09; 数据类型字节有符号范围无符号范围说明tinyint1-128 ~ 1270 ~ 255非常小的整数smallint2-32,768 ~ 32,7670 ~ 65,535小整数mediumint3-8,388,608 ~ 8,388,6070 ~ 16,777,215中等整数int4-2,147,483,648 ~ 2,147,4…

uniapp项目中node_modules\sass\sass.dart.js的体积过大怎么处理

用Node-Sass替代&#xff08;如果适用&#xff09;&#xff1a;虽然Dart Sass是Sass的主要实现之一&#xff0c;但有时它可能会比Node-Sass占用更多的空间。如果你不需要Dart Sass特有的功能&#xff0c;可以考虑切换到Node-Sass&#xff08;注意Node-Sass已停止维护&#xff0…

界面组件DevExpress WPF中文教程:Grid - 如何获取节点?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

Kalibr解毒填坑(一):相机标定失败

文章目录 📚简介🍀 解毒踩坑🚀 主点错误📚简介 相机内参标定通常涉及确定焦距(fx, fy)、主点(cx, cy)、畸变系数(径向和切向)等参数。Kalibr是一个开源的标定工具,支持多相机、IMU和联合标定,适用于复杂的传感器系统。 但kalibar标定相机内参受到数据和配置影…

Swift 的基础设计哲学是 “通过模块化组合实现安全与效率的平衡“,就像用标准化工业零件建造摩天大楼

一、基础模块&#xff1a;地基与钢结构&#xff08;Basic Types & Collections&#xff09; 比喻&#xff1a;积木与工具箱&#xff0c;决定建筑的稳定性和容量。场景&#xff1a;搭建程序的基础结构&#xff0c;如变量、数据类型、运算符。包含&#xff1a;基本语法、运算…