Python opencv相機標(biāo)定實現(xiàn)原理及步驟詳解
相機標(biāo)定相機標(biāo)定的目的
獲取攝像機的內(nèi)參和外參矩陣(同時也會得到每一幅標(biāo)定圖像的選擇和平移矩陣),內(nèi)參和外參系數(shù)可以對之后相機拍攝的圖像就進(jìn)行矯正,得到畸變相對很小的圖像。
相機標(biāo)定的輸入
標(biāo)定圖像上所有內(nèi)角點的圖像坐標(biāo),標(biāo)定板圖像上所有內(nèi)角點的空間三維坐標(biāo)(一般情況下假定圖像位于Z=0平面上)。
相機標(biāo)定的輸出
攝像機的內(nèi)參、外參系數(shù)。
拍攝的物體都處于三維世界坐標(biāo)系中,而相機拍攝時鏡頭看到的是三維相機坐標(biāo)系,成像時三維相機坐標(biāo)系向二維圖像坐標(biāo)系轉(zhuǎn)換。不同的鏡頭成像時的轉(zhuǎn)換矩陣不同,同時可能引入失真,標(biāo)定的作用是近似地估算出轉(zhuǎn)換矩陣和失真系數(shù)。為了估算,需要知道若干點的三維世界坐標(biāo)系中的坐標(biāo)和二維圖像坐標(biāo)系中的坐標(biāo),也就是拍攝棋盤的意義。
相機成像
相機的成像原理:小孔成像

相機的內(nèi)參相機的外參
在實際由于設(shè)計工藝問題、相機安裝環(huán)境或物體擺放位置等影響,會照成成像與實際圖像不一樣的現(xiàn)象。
由于設(shè)計工藝照成的影響是無法改變的事實,所以這將是相機的內(nèi)參;
由環(huán)境或安裝方式照成的影響是可以改變的,這就是相機的外參。
張正友標(biāo)定相機原理
1.求得相機內(nèi)參數(shù):
用于標(biāo)定的棋盤格是特制的,其角點坐標(biāo)已知。標(biāo)定棋盤格是三維場景中的一個平面∏,棋盤格在成像平面為π(知道了∏與π的對應(yīng)點坐標(biāo)之后,可求解兩個平面1對應(yīng)的單應(yīng)矩陣H)。
根據(jù)相機成像模型,P為標(biāo)定的棋盤坐標(biāo),p為其像素點坐標(biāo)。則
,通過對應(yīng)的點坐標(biāo)求解H后,可用于求K,R,T。
2.設(shè)棋盤格所在平面為世界坐標(biāo)系上XOY平面,則棋盤格上任一角點P世界坐標(biāo)系為(X,Y,0)。

3、內(nèi)參約束條件




實驗步驟打印棋盤圖片(網(wǎng)上找一張)

將打印出的紙固定放到一個平面上,使用同一相機從不同的位置,不同的角度,拍攝標(biāo)定板的多張照片(我拍了15張)手機型號是華為mate9

提取標(biāo)定板的世界坐標(biāo)
標(biāo)定板的大小是標(biāo)定板在水平和豎直方向上內(nèi)角點的個數(shù)。內(nèi)角點指的是,標(biāo)定板上不挨著邊界的角點。
我打印的是6x9的標(biāo)定板。

標(biāo)定相機



mtx -->內(nèi)參數(shù)矩陣
dist --> 畸變系數(shù)
rvecs --> 旋轉(zhuǎn)向量
tvecs --> 平移向量
我們可以通過反投影誤差來評估結(jié)果的好壞,越接近0,說明結(jié)果越理想。
通過之前計算的內(nèi)參數(shù)矩陣、畸變系數(shù)、旋轉(zhuǎn)矩陣和平移向量,使用cv2.projectPoints()計算三維點到二維圖像的投影,然后計算反投影得到的點與圖像上檢測到的點的誤差,最后計算一個對于所有標(biāo)定圖像的平均誤差即反投影誤差
我的棋盤打印出來有些不平整,可能是打印的紙張沒有放正,導(dǎo)致有些地方翹著,效果不是很好,誤差值有些大了,把紙張貼平整應(yīng)該會好很多。而且我可能拍照的角度變化不是太大,可以試著把拍照的角度更加差異些,結(jié)果會更明顯。
import cv2
import numpy as np
import glob
# 設(shè)置尋找亞像素角點的參數(shù),采用的停止準(zhǔn)則是最大循環(huán)次數(shù)30和最大誤差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)
# 獲取標(biāo)定板角點的位置
objp = np.zeros((6 * 9, 3), np.float32)
objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) # 將世界坐標(biāo)系建在標(biāo)定板上,所有點的Z坐標(biāo)全部為0,所以只需要賦值x和y
obj_points = [] # 存儲3D點
img_points = [] # 存儲2D點
images = glob.glob("E:/test_pic/qipan/*.jpg")
for fname in images:
img = cv2.imread(fname)
cv2.imshow('img',img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
size = gray.shape[::-1]
ret, corners = cv2.findChessboardCorners(gray, (6, 9), None)
print(ret)
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria) # 在原角點的基礎(chǔ)上尋找亞像素角點
#print(corners2)
if [corners2]:
img_points.append(corners2)
else:
img_points.append(corners)
cv2.drawChessboardCorners(img, (8, 6), corners, ret) # 記住,OpenCV的繪制函數(shù)一般無返回值
cv2.imshow('img', img)
cv2.waitKey(2000)
print(len(img_points))
cv2.destroyAllWindows()
# 標(biāo)定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)
print("ret:", ret)
print("mtx:\n", mtx) # 內(nèi)參數(shù)矩陣
print("dist:\n", dist) # 畸變系數(shù) distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:\n", rvecs) # 旋轉(zhuǎn)向量 # 外參數(shù)
print("tvecs:\n", tvecs ) # 平移向量 # 外參數(shù)
print("-----------------------------------------------------")
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python如何爬取51cto數(shù)據(jù)并存入MySQL
這篇文章主要介紹了Python如何爬取51cto數(shù)據(jù)并存入MySQL,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
PyQt中使用QProcess運行一個進(jìn)程的示例代碼
這篇文章主要介紹了在PyQt中使用QProcess運行一個進(jìn)程,本例中通過按下按鈕,啟動了windows系統(tǒng)自帶的記事本程序,即notepad.exe, 因為它在windows的系統(tǒng)目錄下,該目錄已經(jīng)加在了系統(tǒng)的PATH環(huán)境變量中,所以不需要特別指定路徑,需要的朋友可以參考下2022-12-12
終于搞懂了Keras中multiloss的對應(yīng)關(guān)系介紹
這篇文章主要介紹了終于搞懂了Keras中multiloss的對應(yīng)關(guān)系介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Pytorch 的損失函數(shù)Loss function使用詳解
今天小編就為大家分享一篇Pytorch 的損失函數(shù)Loss function使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
TensorFlow人工智能學(xué)習(xí)Keras高層接口應(yīng)用示例
這篇文章主要為大家介紹了TensorFlow人工智能學(xué)習(xí)中Keras高層接口的應(yīng)用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
pytorch 數(shù)據(jù)處理:定義自己的數(shù)據(jù)集合實例
今天小編就為大家分享一篇pytorch 數(shù)據(jù)處理:定義自己的數(shù)據(jù)集合實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Python實現(xiàn)批量提取Excel數(shù)據(jù)
在數(shù)據(jù)處理和分析的過程中,Excel 是一種廣泛使用的數(shù)據(jù)存儲格式,本文將詳細(xì)介紹如何使用 pandas、openpyxl 和 xlrd 三種庫來批量提取 Excel 數(shù)據(jù),并提供相應(yīng)的示例代碼,需要的可以參考下2024-12-12

