【計算機視覺】基于Python的相機標定項目Camera-Calibration深度解析

在這里插入圖片描述

基于Python的相機標定項目Camera-Calibration深度解析

    • 1. 項目概述
      • 技術核心
    • 2. 技術原理與數學模型
      • 2.1 相機模型
      • 2.2 畸變模型
    • 3. 實戰指南:項目運行與標定流程
      • 3.1 環境配置
      • 3.2 數據準備
      • 3.3 執行步驟
      • 3.4 結果驗證
    • 4. 常見問題與解決方案
      • 4.1 角點檢測失敗
      • 4.2 標定結果異常
      • 4.3 運行時錯誤
    • 5. 相關論文與技術演進
      • 5.1 經典論文
      • 5.2 前沿方向
    • 6. 項目擴展建議
      • 6.1 功能增強
      • 6.2 性能優化

1. 項目概述

Camera-Calibration是一個基于Python和OpenCV實現的相機標定工具,旨在通過張正友標定法(Zhang’s Method)計算相機的內參矩陣、畸變系數和外參參數。該項目適用于計算機視覺、機器人導航、增強現實(AR)等領域,能夠有效校正鏡頭畸變并建立圖像像素坐標與真實世界坐標的映射關系。

技術核心

  • 張正友標定法:通過多視角棋盤格圖像計算相機參數,具有高精度和低實現復雜度的特點。
  • OpenCV集成:利用findChessboardCorners檢測棋盤格角點,通過calibrateCamera進行參數優化。
  • 非線性優化:采用Levenberg-Marquardt算法最小化重投影誤差,確保標定結果的準確性。

2. 技術原理與數學模型

2.1 相機模型

相機的成像模型基于小孔成像原理,數學表達為:
s [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 r 13 t x r 21 r 22 r 23 t y r 31 r 32 r 33 t z ] [ X w Y w Z w 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} s ?uv1? ?= ?fx?00?0fy?0?cx?cy?1? ? ?r11?r21?r31??r12?r22?r32??r13?r23?r33??tx?ty?tz?? ? ?Xw?Yw?Zw?1? ?
其中:

  • ( u , v ) (u, v) (u,v)為像素坐標, ( X w , Y w , Z w ) (X_w, Y_w, Z_w) (Xw?,Yw?,Zw?)為世界坐標
  • f x , f y f_x, f_y fx?,fy?為焦距, ( c x , c y ) (c_x, c_y) (cx?,cy?)為主點坐標
  • r i j r_{ij} rij? t i t_i ti?構成旋轉矩陣和平移向量(外參)

2.2 畸變模型

徑向畸變和切向畸變的校正公式:
x c o r r e c t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y c o r r e c t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{aligned} x_{corrected} &= x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1 xy + p_2(r^2 + 2x^2) \\ y_{corrected} &= y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1(r^2 + 2y^2) + 2p_2 xy \end{aligned} xcorrected?ycorrected??=x(1+k1?r2+k2?r4+k3?r6)+2p1?xy+p2?(r2+2x2)=y(1+k1?r2+k2?r4+k3?r6)+p1?(r2+2y2)+2p2?xy?
其中 k 1 , k 2 , k 3 k_1, k_2, k_3 k1?,k2?,k3?為徑向畸變系數, p 1 , p 2 p_1, p_2 p1?,p2?為切向畸變系數。


3. 實戰指南:項目運行與標定流程

3.1 環境配置

# 依賴安裝
pip install opencv-python numpy matplotlib

3.2 數據準備

  1. 標定板要求
    • 使用棋盤格(如9×6內角點),打印時需保證1:1比例且平整
    • 每個方格的物理尺寸需精確測量(例如25mm×25mm)
  2. 圖像采集
    • 在不同角度、距離下拍攝15-20張圖像(覆蓋畫面中心與邊緣)
    • 示例代碼自動檢測有效圖像:
      images = glob.glob('calib_images/*.jpg')
      

3.3 執行步驟

import cv2
import numpy as np# 初始化參數
CHECKERBOARD = (9, 6)  # 內角點行列數
objpoints = []  # 3D點
imgpoints = []  # 2D點# 生成世界坐標系點
objp = np.zeros((CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)if ret:objpoints.append(objp)corners_refined = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))imgpoints.append(corners_refined)# 標定相機
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

3.4 結果驗證

# 校正測試圖像
img = cv2.imread('test.jpg')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)# 計算重投影誤差
mean_error = 0
for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)mean_error += error
print(f"重投影誤差: {mean_error/len(objpoints):.2f} 像素")

合格標準:誤差應小于1.0像素,理想值在0.5像素以下。


4. 常見問題與解決方案

4.1 角點檢測失敗

  • 現象findChessboardCorners返回False
  • 原因與解決
    1. 棋盤格尺寸錯誤:確認CHECKERBOARD設置為內角點數(實際方格數-1)
    2. 圖像模糊/反光:調整光照,確保棋盤格清晰可見
    3. 邊緣未完全顯示:至少需完整顯示全部內角點

4.2 標定結果異常

  • 焦距值過大(如fx=42880):
    • 檢查物理尺寸單位是否錯誤(例如將毫米誤設為米)
    • 增加圖像多樣性,覆蓋不同視角
  • 畸變校正無效
    • 確認dist系數已正確應用
    • 嘗試啟用CALIB_RATIONAL_MODEL以支持高階畸變模型

4.3 運行時錯誤

# 錯誤:Assertion failed (dims == 2 && ...)
# 解決:檢查objpoints和imgpoints維度一致性
assert len(objpoints) == len(imgpoints), "數據對數量不匹配"

5. 相關論文與技術演進

5.1 經典論文

  1. 張正友標定法(2000):

    • 提出基于平面模板的靈活標定方法,成為OpenCV實現的基礎
    • 論文標題:A Flexible New Technique for Camera Calibration
  2. 多傳感器標定(2019):

    • 悉尼大學ACFR實驗室改進VOQ策略,提升標定魯棒性

5.2 前沿方向

  • 在線標定:通過SLAM實時更新相機參數
  • 深度學習標定:使用CNN直接估計畸變參數(如DeepCalib)
  • 多相機協同標定:適用于自動駕駛多視角系統

6. 項目擴展建議

6.1 功能增強

  • 自動化數據篩選:根據角點檢測質量自動過濾低質量圖像
  • GUI交互界面:集成PyQt實現參數可視化調整
  • ROS支持:與camera_calibration包對接,實現標定結果實時發布

6.2 性能優化

  • GPU加速:使用CUDA加速角點檢測與圖像校正
  • 多線程處理:并行處理圖像加載與角點細化

通過本項目實踐,開發者不僅能掌握相機標定的核心算法,還能深入理解計算機視覺系統的幾何建模原理。結合重投影誤差分析與參數優化策略,可進一步提升視覺應用的精度與魯棒性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79969.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多光譜影像:解鎖遙感奧秘的 “彩色鑰匙”

在遙感領域,多光譜影像猶如一把神奇的 “彩色鑰匙”,為我們開啟洞察地球表面與大氣層的全新視角。 圖片來源于星圖云開放平臺 多光譜影像,顧名思義,就是利用遙感平臺上的多光譜傳感器,同時對地球目標地物在多個不同光譜…

【ROS2】ROS節點啟動崩潰:rclcpp::exceptions::RCLInvalidArgument

1、問題描述 啟動ROS節點時,直接崩潰,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…

MinerU安裝(pdf轉markdown、json)

在Windows上安裝MinerU,參考以下幾個文章,可以成功安裝,并使用GPU解析。 整體安裝教程: MinerU本地化部署教程——一款AI知識庫建站的必備工具 其中安裝conda的教程: 一步步教你在 Windows 上輕松安裝 Anaconda以及使…

aws 實踐創建policy + Role

今天Cyber 通過image 來創建EC2 的時候,要添加policy, 雖然是administrator 的role, 參考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:

【ROS2】編譯Qt實現的庫,然后鏈接該庫時,報錯:/usr/bin/ld: XXX undefined reference to `vtable for

1、問題描述 在ROS2工程中,編譯使用Qt實現的庫,在其它ROS2包鏈接該庫時,報錯: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看鏈接失敗的幾個函數接口都是,信號函數(signals 標記的函數)。因為信號函數都只有定義,沒有實現,在執行ROS2 colc…

數據庫--處理模型(Processing Model)(二)

執行查詢的方法有很多,接下來將介紹以更高效和更有效率的方式執行分析工作負載(在OLAP系統中)的不同技術,包括以下內容: 執行并行性(Execution Parallelism)執行引擎(Execution Engines)執行操作符輸出(Execution Operator Output)中間數據表示(Intermediate Data …

PostgreSQL pgrowlocks 擴展詳解

一、簡介 pgrowlocks 是 PostgreSQL 官方提供的擴展模塊,用于查看指定表中每一行當前的行級鎖(Row Lock)信息。它非常適用于: 并發沖突排查行級鎖等待分析死鎖前兆探測熱點數據行分析 二、安裝與啟用 1. 安裝前提(…

關于xammp數據庫打開不了,但是日志沒錯誤的問題解決以及其數據庫的備份

這里參考了兩篇文章 解決Xampp中mysql無法啟動的問題_xampp里面mysql的stop啟動不起來-CSDN博客 mysqli_real_connect(): (HY000/1045): Access denied for user ‘root‘‘localhost‘ (using password: YES-CSDN博客 相信很多和我一樣,很久沒登xammp突然數據庫…

在UI 原型設計中,交互規則有哪些核心要素?

在UI 原型設計中,交互規則主要有三個核心要素,分別為重要性、原則與實踐,具體表現在: 一、交互規則在 UI 原型設計中的重要性 明確交互邏輯:設計階段制定交互規則,清晰定義界面元素操作響應。 如社交應用…

BFD與VRRP聯動

一、概述 在前面的文章我們學習了VRRP與BFD協議,VRRP(虛擬路由冗余協議)的主要特點是當Master(主)設備出現故障時,Backup(備用)設備能夠快速接替Master的轉發工作,盡量縮短數據流的中斷時間。 在沒有采用BFD與VRRP聯動機制前,當Master出現故障時,VRRP依靠Backup設置的超時時間來…

Protobuf3協議關鍵字詳解與應用實例

一、核心語法與基礎關鍵字 syntax 聲明協議版本,必須為文件的第一行非空、非注釋內容。 syntax "proto3"; // 顯式指定proto3語法,否則編譯器默認使用proto2message 定義消息類型,包含一組結構化字段。支持嵌套消息定義&#xff…

如何在線免費壓縮PDF文檔?

PDF文件太大,通常是因為內部嵌入字體和圖片。怎么才能將文件大小減減肥呢,主要有降低圖片清晰度和去除相關字體兩個方向來實現文檔效果。接下來介紹三個免費壓縮PDF實用工具。 (一)iLoveOFD在線轉換工具 iLoveOFD在線轉換工具&a…

NSSCTF [GFCTF 2021]where_is_shell

889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.準備 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…

深度學習中的提示詞優化:梯度下降全解析

深度學習中的提示詞優化:梯度下降全解析 在您的代碼中,提示詞的更新方向是通過梯度下降算法確定的,這是深度學習中最基本的優化方法。 一、梯度下降與更新方向 1. 核心公式 對于可訓練參數 θ \theta θ(這里是提示詞嵌入向量),梯度下降的更新公式為:

win10電腦無法訪問局域網內其他共享電腦文件的問題

一、啟用本地計算機guest來賓賬戶 操作步驟 點擊桌面上的“此電腦”圖標,再點擊“管理” 在“計算機管理”界面依次點擊“系統工具”“本地用戶和組”“用戶” 再點擊右側的“Guest”,在彈出的對話框中點擊“屬性” 在“Guest屬性”界面取消勾選“賬戶已…

會計要素+借貸分錄+會計科目+賬戶,幾個銀行會計的重要概念

1.借貸分錄還是借貸分路 正確表述是“借貸分錄”。 “分錄”即會計分錄,它是指預先確定每筆經濟業務所涉及的賬戶名稱,以及計入賬戶的方向和金額的一種記錄,簡稱分錄。 在借貸記賬法下,會計分錄通過“借”和“貸”來表示記賬方向…

AI日報 · 2025年5月15日|GPT-4.1 登陸 ChatGPT

AI日報 2025年5月15日|GPT-4.1 登陸 ChatGPT 1、OpenAI 在 ChatGPT 全面開放 GPT-4.1 與 GPT-4.1 mini 北京時間 5 月 14 日晚,OpenAI 在官方 Release Notes 中宣布:專為復雜代碼與精細指令場景打造的 GPT-4.1 正式加入 ChatGPT&#xff0…

π0: A Vision-Language-Action Flow Model for General Robot Control

TL;DR 2024 年 Physical Intelligence 發布的 VLA 模型 π0,基于 transformer 流匹配(flow matching)架構,當前開源領域最強的 VLA 模型之一。 Paper name π0: A Vision-Language-Action Flow Model for General Robot Contr…

Java詳解LeetCode 熱題 100(17):LeetCode 41. 缺失的第一個正數(First Missing Positive)詳解

文章目錄 1. 題目描述2. 理解題目3. 解法一:排序法(不滿足題目要求)3.1 思路3.2 Java代碼實現3.3 代碼詳解3.4 復雜度分析3.5 不足之處 4. 解法二:哈希表法4.1 思路4.2 Java代碼實現4.3 代碼詳解4.4 復雜度分析4.5 不足之處 5. 解…

第九講 | 模板進階

模板進階 一、非類型模板參數1、模板參數的分類2、應用場景3、array4、注意 二、模板的特化1、概念2、函數模板特化3、類模板特化(1)、全特化:全部模板參數都特化成具體的類型(2)、偏/半特化:部分模板參數特…