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 移植與交叉編譯詳細過程以及問題解決記錄