久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

您的位置:首頁技術(shù)文章
文章詳情頁

Python opencv相機標定實現(xiàn)原理及步驟詳解

瀏覽:2日期:2022-07-30 14:41:01

相機標定相機標定的目的

獲取攝像機的內(nèi)參和外參矩陣(同時也會得到每一幅標定圖像的選擇和平移矩陣),內(nèi)參和外參系數(shù)可以對之后相機拍攝的圖像就進行矯正,得到畸變相對很小的圖像。

相機標定的輸入

標定圖像上所有內(nèi)角點的圖像坐標,標定板圖像上所有內(nèi)角點的空間三維坐標(一般情況下假定圖像位于Z=0平面上)。

相機標定的輸出

攝像機的內(nèi)參、外參系數(shù)。

拍攝的物體都處于三維世界坐標系中,而相機拍攝時鏡頭看到的是三維相機坐標系,成像時三維相機坐標系向二維圖像坐標系轉(zhuǎn)換。不同的鏡頭成像時的轉(zhuǎn)換矩陣不同,同時可能引入失真,標定的作用是近似地估算出轉(zhuǎn)換矩陣和失真系數(shù)。為了估算,需要知道若干點的三維世界坐標系中的坐標和二維圖像坐標系中的坐標,也就是拍攝棋盤的意義。

相機成像

相機的成像原理:小孔成像

Python opencv相機標定實現(xiàn)原理及步驟詳解

相機的內(nèi)參相機的外參

在實際由于設(shè)計工藝問題、相機安裝環(huán)境或物體擺放位置等影響,會照成成像與實際圖像不一樣的現(xiàn)象。

由于設(shè)計工藝照成的影響是無法改變的事實,所以這將是相機的內(nèi)參;

由環(huán)境或安裝方式照成的影響是可以改變的,這就是相機的外參。

張正友標定相機原理

1.求得相機內(nèi)參數(shù):

用于標定的棋盤格是特制的,其角點坐標已知。標定棋盤格是三維場景中的一個平面∏,棋盤格在成像平面為π(知道了∏與π的對應(yīng)點坐標之后,可求解兩個平面1對應(yīng)的單應(yīng)矩陣H)。

根據(jù)相機成像模型,P為標定的棋盤坐標,p為其像素點坐標。則Python opencv相機標定實現(xiàn)原理及步驟詳解,通過對應(yīng)的點坐標求解H后,可用于求K,R,T。

2.設(shè)棋盤格所在平面為世界坐標系上XOY平面,則棋盤格上任一角點P世界坐標系為(X,Y,0)。

Python opencv相機標定實現(xiàn)原理及步驟詳解

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

Python opencv相機標定實現(xiàn)原理及步驟詳解

Python opencv相機標定實現(xiàn)原理及步驟詳解

Python opencv相機標定實現(xiàn)原理及步驟詳解

Python opencv相機標定實現(xiàn)原理及步驟詳解

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

Python opencv相機標定實現(xiàn)原理及步驟詳解

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

Python opencv相機標定實現(xiàn)原理及步驟詳解

提取標定板的世界坐標

標定板的大小是標定板在水平和豎直方向上內(nèi)角點的個數(shù)。內(nèi)角點指的是,標定板上不挨著邊界的角點。

我打印的是6x9的標定板。

Python opencv相機標定實現(xiàn)原理及步驟詳解

標定相機

Python opencv相機標定實現(xiàn)原理及步驟詳解

Python opencv相機標定實現(xiàn)原理及步驟詳解

Python opencv相機標定實現(xiàn)原理及步驟詳解

mtx -->內(nèi)參數(shù)矩陣

dist --> 畸變系數(shù)

rvecs --> 旋轉(zhuǎn)向量

tvecs --> 平移向量

我們可以通過反投影誤差來評估結(jié)果的好壞,越接近0,說明結(jié)果越理想。

通過之前計算的內(nèi)參數(shù)矩陣、畸變系數(shù)、旋轉(zhuǎn)矩陣和平移向量,使用cv2.projectPoints()計算三維點到二維圖像的投影,然后計算反投影得到的點與圖像上檢測到的點的誤差,最后計算一個對于所有標定圖像的平均誤差即反投影誤差

我的棋盤打印出來有些不平整,可能是打印的紙張沒有放正,導(dǎo)致有些地方翹著,效果不是很好,誤差值有些大了,把紙張貼平整應(yīng)該會好很多。而且我可能拍照的角度變化不是太大,可以試著把拍照的角度更加差異些,結(jié)果會更明顯。

import cv2import numpy as npimport glob# 設(shè)置尋找亞像素角點的參數(shù),采用的停止準則是最大循環(huán)次數(shù)30和最大誤差容限0.001criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)# 獲取標定板角點的位置objp = np.zeros((6 * 9, 3), np.float32)objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) # 將世界坐標系建在標定板上,所有點的Z坐標全部為0,所以只需要賦值x和yobj_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()# 標定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í)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 五原县| 翁牛特旗| 靖宇县| 石城县| 弋阳县| 禹城市| 遂平县| 合肥市| 泰顺县| 张北县| 阿拉尔市| 丰顺县| 农安县| 隆回县| 区。| 武陟县| 永善县| 杭锦旗| 文昌市| 民丰县| 常熟市| 成武县| 普格县| 雷山县| 孟连| 乡宁县| 张家港市| 宣恩县| 西盟| 碌曲县| 延庆县| 社会| 曲周县| 淳化县| 琼结县| 石棉县| 光泽县| 定远县| 子长县| 安吉县| 北碚区|