Python+OpenCV實現(xiàn)相機標(biāo)定的方法詳解
opencv中內(nèi)置了張正友的棋盤格標(biāo)定法,通過一些姿態(tài)各異的棋盤格圖像,就能標(biāo)定相機的內(nèi)外參數(shù)。
角點檢測
第一步是角點檢測,首先需要讀取棋盤格圖像
import numpy as np
import cv2
import os
path = 'imgs' # 圖像文件夾;相對路徑
fs = os.listdir(path)
grays = []
for f in fs:
fName = os.path.join(path, f)
img = cv2.imread(fName)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 圖像轉(zhuǎn)灰度
grays.append(gray)
其中,grays中便是所有棋盤格灰度圖像,接下來,就要找到這些棋盤格的角點位置,主要用到函數(shù)findChessboardCorners,其輸入?yún)?shù)為棋盤格圖像、角點個數(shù)以及標(biāo)志位。
w, h = 11, 8 # 交點橫縱個數(shù) # 亞像素點的檢測條件 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) pImgs = [] for g in grays: # cs即位初步檢測的角點 ret, cs = cv2.findChessboardCorners(g, (w, h), None) # 亞像素角點檢測 pImg = cv2.cornerSubPix(g, cs.astype(np.float32), (5, 5), (-1, -1), criteria) pImgs.append(np.squeeze(pImg))
其中,pImg用于存放像素坐標(biāo)中的二維點。
查看角點
為了驗證角點檢測是否合理,可以將其畫出來,用opencv自帶的工具就像下面這樣就可以,
cv2.drawChessboardCorners(grays[0], (w, h), pImgs[0], None)
cv2.imshow('findCorners', grays[0])
cv2.waitKey(1000)但窗口縮放比較麻煩,所以更推薦用經(jīng)典的matplotlib來畫圖
import matplotlib.pyplot as plt pts = pImgs[0].squeeze().reshape(-1,2).T plt.imshow(grays[0]) plt.scatter(pts[0], pts[1], marker='*', c='red') plt.show()
效果如下

標(biāo)定
函數(shù)calibrateCamera可用于圖像標(biāo)定,只需將現(xiàn)實世界的點和相機坐標(biāo)系中的角點的一一對應(yīng)關(guān)系輸入,便能得到相應(yīng)的相機矩陣。其中,現(xiàn)實世界中哦的三維點,一般成為對象點,由于棋盤格中每個方塊都是等距的,故可直接建立為類似(1,0,0), (2,0,0)...即可
objp = np.zeros((6*7,3), np.float32) objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2) pObj = np.zeros((w*h, 3), np.float32) pObj[:,:2] = np.mgrid[0:w, 0:h].T.reshape(-1,2) pObjs = [pObj for _ in range(len(pImgs))]
至此,萬事俱備,只需調(diào)用
size = grays[0].shape[::-1] # 圖像尺寸 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(pObjs, pImgs, size, None, None)
其中,rec為成功標(biāo)志,為True時表示標(biāo)定成功。
mtx為內(nèi)參矩陣,差不多是

dist為畸變參數(shù),最多有8個,分別表示k1,k2,p1,p2,k3,k4,k5,k6,本次標(biāo)定得到的結(jié)果為
>>> print(dist)
[[-8.36577030e-02 -1.68977185e-01 -1.12233478e-03 9.45685802e-04
-2.04246147e+01]]
這些畸變參數(shù)的物理意義如下

以上就是Python+OpenCV實現(xiàn)相機標(biāo)定的方法詳解的詳細內(nèi)容,更多關(guān)于Python OpenCV相機標(biāo)定的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python自定義sorted排序?qū)崿F(xiàn)方法詳解
這篇文章主要介紹了Python自定義sorted排序?qū)崿F(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
在python 不同時區(qū)之間的差值與轉(zhuǎn)換方法
今天小編就為大家分享一篇在python 不同時區(qū)之間的差值與轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python代碼操作Excel條件格式的實戰(zhàn)指南
用代碼操作Excel條件格式,本質(zhì)上就是把你手動點鼠標(biāo)的步驟寫成腳本,數(shù)據(jù)更新了,腳本跑一遍,格式自動生成,下面我們就來看看具體的實現(xiàn)方法吧2026-03-03
python算法測試結(jié)果自動保存到excel表格的實現(xiàn)步驟
我們在進行算法評估是通常會針對每個樣本的算法處理結(jié)果進行統(tǒng)計,例如每個樣本正確預(yù)測數(shù)量、漏檢數(shù)量和誤檢數(shù)量、精度等,本文小編將給大家介紹python算法測試結(jié)果自動保存到excel表格的實現(xiàn)步驟,感興趣的朋友可以參考下2023-12-12
Python系統(tǒng)公網(wǎng)私網(wǎng)流量監(jiān)控實現(xiàn)流程
這篇文章主要介紹了Python系統(tǒng)公網(wǎng)私網(wǎng)流量監(jiān)控實現(xiàn)流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
手把手教你如何使python變?yōu)榭蓤?zhí)行文件
對于exe可執(zhí)行文件,相信大家都不陌生,下面這篇文章主要給大家介紹了關(guān)于如何使python變?yōu)榭蓤?zhí)行文件的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-02-02

