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.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;基本語法、運算…