
作者:Kaustubh Sadekar ?? Satya Mallick校對(duì):王可汗
本文約3200字,建議閱讀5分鐘
本文為大家系統(tǒng)地介紹了使用OpenCV實(shí)現(xiàn)攝像頭標(biāo)定。
攝像頭是一種視覺(jué)傳感器,它已經(jīng)成為了機(jī)器人技術(shù)、監(jiān)控、空間探索、社交媒體、工業(yè)自動(dòng)化,甚至娛樂(lè)業(yè)等多個(gè)領(lǐng)域不可分割的組成部分。
在攝像頭的多種應(yīng)用中,了解攝像頭的參數(shù)對(duì)于視覺(jué)傳感器的有效使用至關(guān)重要。在本文中,將闡述攝像頭標(biāo)定所涉及的步驟及其涵義。此外,文中還共享了棋盤(pán)格模式示例圖像的C++和Python代碼。什么是攝像頭標(biāo)定?
對(duì)攝像頭參數(shù)進(jìn)行估計(jì)的過(guò)程稱為攝像頭標(biāo)定。通過(guò)攝像頭標(biāo)定,可以掌握攝像頭的所有信息(參數(shù)或系數(shù)),從而可以確定現(xiàn)實(shí)世界中的三維點(diǎn)與攝像頭捕獲圖像的二維投影(像素)之間的精確關(guān)系。通常,攝像頭標(biāo)定意味著恢復(fù)以下兩類參數(shù):1. 攝像頭?/鏡頭系統(tǒng)的固有參數(shù)。如:鏡頭的焦距、光心和徑向失真系數(shù)等參數(shù)。2. 外部參數(shù):這是指攝像頭相對(duì)于某個(gè)世界坐標(biāo)系的方向(旋轉(zhuǎn)矩陣R和平移向量t)。在下圖中,采用了幾何標(biāo)定來(lái)估計(jì)透鏡的參數(shù),從而消除圖像的失真。
對(duì)失真圖像采用幾何標(biāo)定之后的效果
使用OpenCV實(shí)現(xiàn)攝像頭標(biāo)定
為了更好地理解整個(gè)標(biāo)定過(guò)程,首先需要了解成像的幾何特征。點(diǎn)擊下面的鏈接來(lái)查看詳細(xì)的解釋。正如前文所述,為了找出一個(gè)三維點(diǎn)在圖像平面上的投影,首先需要使用外部參數(shù)(旋轉(zhuǎn)矩陣R和平移向量t)將該點(diǎn)從世界坐標(biāo)系轉(zhuǎn)換到攝像頭坐標(biāo)系。?
接下來(lái),利用攝像頭的固有參數(shù),將該點(diǎn)投影到圖像平面上。
將世界坐標(biāo)中的三維點(diǎn)(Xw, YW,Zw)投影到圖像坐標(biāo)?(u、v)的關(guān)聯(lián)方程如下所示:
其中,P是一個(gè)由兩部分組成的3×4投影矩陣——包含固有參數(shù)的固有矩陣(K)、由3×3旋轉(zhuǎn)矩陣R和3×1平移向量t組合而成的外部矩陣([R|t])。


cx,cy是圖像平面上光心的x、 y坐標(biāo),這一坐標(biāo)通常用圖像的中心來(lái)近似。攝像頭標(biāo)定的目的
攝像頭標(biāo)定的目的是:利用一組已知的3D點(diǎn)坐標(biāo)(Xw, YW,Zw)及其相應(yīng)的圖像坐標(biāo)(u、v)來(lái)找出3×3矩陣K、3×3旋轉(zhuǎn)矩陣R和3×1平移向量t。當(dāng)?shù)贸龉逃袇?shù)和外部參數(shù)的值之后,便實(shí)現(xiàn)了攝像頭標(biāo)定。總之,攝像頭標(biāo)定算法應(yīng)具備以下輸入和輸出:1. 輸入:已知二維圖像坐標(biāo)和三維世界坐標(biāo)點(diǎn)的圖像集合。2. 輸出:3×3攝像頭固有矩陣,每幅圖像的旋轉(zhuǎn)矩陣和平移向量。注:在OpenCV中,攝像頭固有矩陣沒(méi)有傾斜參數(shù),所以該矩陣的形式為

多種類型的攝像頭標(biāo)定方法
1. 模式標(biāo)定:當(dāng)能完全控制成像過(guò)程時(shí),執(zhí)行標(biāo)定的最佳方法是從不同的角度捕捉一個(gè)物體或已知維度模式的多幅圖像。本文中涉及到的基于棋盤(pán)格的方法屬于這種標(biāo)定。也可以使用已知尺寸的圓形模式來(lái)替代棋盤(pán)格模式。2. 幾何線索:有時(shí)場(chǎng)景中有如直線和消失點(diǎn)等其他的幾何線索,可以利用于這些幾何線索來(lái)進(jìn)行標(biāo)定。3. 基于深度學(xué)習(xí)的標(biāo)定:當(dāng)對(duì)成像設(shè)置的控制很少時(shí)(例如:當(dāng)只有一個(gè)場(chǎng)景的單一圖像),可使用基于深度學(xué)習(xí)的方法獲得攝像頭的標(biāo)定信息。
攝像頭標(biāo)定的步驟
標(biāo)定過(guò)程的步驟可用下圖中的流程圖來(lái)解釋。
下面,來(lái)看看這些步驟是如何實(shí)現(xiàn)的:第1步:用棋盤(pán)格模式定義真實(shí)世界的坐標(biāo)
世界坐標(biāo)系:世界坐標(biāo)系由附在房間里一面墻上的棋盤(pán)格圖案來(lái)固定,三維點(diǎn)是棋盤(pán)格中正方形的拐角。上述棋盤(pán)格中的任何一個(gè)角都可以定為世界坐標(biāo)系的原點(diǎn)。XW軸和YW軸沿墻移動(dòng),ZW軸垂直于墻移動(dòng)。因此,棋盤(pán)格上的所有點(diǎn)都在XY平面上(即ZW=0)。在標(biāo)定過(guò)程中,通過(guò)一組已知的三維點(diǎn)(Xw, YW,Zw)及其在圖像中相應(yīng)的像素位置(u,v)來(lái)計(jì)算出攝像頭的參數(shù)。對(duì)于3D點(diǎn),可以在許多不同的方向上拍攝一個(gè)已知尺寸的棋盤(pán)格圖案。將世界坐標(biāo)映射到棋盤(pán)格上,由于所有的角點(diǎn)都在一個(gè)平面上,可以任意選取ZW為0。由于各點(diǎn)在棋盤(pán)格中是等間隔的,可以將其中一個(gè)點(diǎn)設(shè)為參考點(diǎn)(0,0),這樣,便很容易定義出每個(gè)三維點(diǎn)的坐標(biāo)(XW,YW)。為什么棋盤(pán)格圖案在攝像頭標(biāo)定中應(yīng)用如此之廣?
棋盤(pán)格圖案的獨(dú)特之處是:在圖像檢測(cè)過(guò)程中,它很容易檢測(cè)到。不僅如此,棋盤(pán)格上的正方形是定位的理想選擇,因?yàn)樗鼈冊(cè)趦蓚€(gè)方向的梯度比較尖銳。此外,這些方格與它們?cè)谄灞P(pán)線的交叉點(diǎn)有關(guān)。所有這些特點(diǎn),都有利于方便地定位出正方形的拐角。
繪制出檢測(cè)到的棋盤(pán)板拐角坐標(biāo)后的結(jié)果圖第2步:從多個(gè)不同的角度捕捉多個(gè)棋盤(pán)格圖像

接下來(lái),確保棋盤(pán)格為靜態(tài),并通過(guò)移動(dòng)攝像頭拍攝出多幅棋盤(pán)圖像。或者,也可以保持?jǐn)z像頭不動(dòng),拍攝不同方向的棋盤(pán)格圖案,從數(shù)學(xué)的角度來(lái)看,這兩種情況很類似。第3步:找出棋盤(pán)格板的二維坐標(biāo)
有了多幅棋盤(pán)格圖像之后,世界坐標(biāo)系上棋盤(pán)格上點(diǎn)的三維位置也已知,最后,需要找出的是圖像在棋盤(pán)格上二維像素的位置。3.1找出棋盤(pán)格的角
OpenCV提供了一個(gè)名為findChessboardCorners的內(nèi)置函數(shù),利用這個(gè)函數(shù)可以找出棋盤(pán)格中各個(gè)角的坐標(biāo)。下面,來(lái)看看這一代碼的用法:


根據(jù)是否檢測(cè)到一個(gè)棋盤(pán)格模式,輸出為真或假。3.2調(diào)整棋盤(pán)格的角
良好的標(biāo)定應(yīng)完全滿足精度的要求。為了獲得良好的結(jié)果,應(yīng)對(duì)各個(gè)角的位置進(jìn)行調(diào)整,以獲得亞像素級(jí)的精度。OpenCV有一個(gè) cornerSubPix函數(shù),利用這個(gè)函數(shù)獲取原始圖像和棋盤(pán)格角的位置,并在原始位置的小范圍內(nèi)找出最佳的位置角度。該算法的本質(zhì)是一個(gè)迭代過(guò)程,為此需要指定終止條件(如,迭代次數(shù)和/或精度)


第4步:標(biāo)定攝像頭
攝像頭標(biāo)定的最后一步是:將世界坐標(biāo)中的三維點(diǎn)及其在所有圖像的二維位置傳遞給OpenCV的calibrateCamera 方法。這是基于張正友的一篇論文。數(shù)學(xué)上有點(diǎn)復(fù)雜,需要線性代數(shù)的背景知識(shí)。
來(lái)看看calibrateCamera方法的語(yǔ)法



攝像頭標(biāo)定的Python和C++代碼如下。利用下面的鏈接,下載所有的圖像和代碼則更為簡(jiǎn)單。
攝像頭標(biāo)定的Python代碼
請(qǐng)仔細(xì)閱讀代碼的注釋,它們對(duì)每一步都在做什么作了詳細(xì)解釋。

C++ 源代碼
請(qǐng)通讀每一條注釋,以了解每一步都實(shí)現(xiàn)了什么。
獨(dú)家|OpenCV?1.1 Mat?- 基本圖像容器(附鏈接)
獨(dú)家|OpenCV?1.3 矩陣的掩膜操作(附鏈接)
獨(dú)家|OpenCV?1.5 利用OpenCV疊加(混合)兩幅圖像
獨(dú)家|OpenCV 1.6 改變圖像的對(duì)比度和亮度!
獨(dú)家|OpenCV?1.7 離散傅里葉變換
獨(dú)家|OpenCV?1.8 使用XML和YAML文件實(shí)現(xiàn)文件的輸入/輸出
獨(dú)家|OpenCV?1.9 如何利用OpenCV的parallel_for_并行化代碼(附代碼)
陳之炎,北京交通大學(xué)通信與控制工程專業(yè)畢業(yè),獲得工學(xué)碩士學(xué)位,歷任長(zhǎng)城計(jì)算機(jī)軟件與系統(tǒng)公司工程師,大唐微電子公司工程師,現(xiàn)任北京吾譯超群科技有限公司技術(shù)支持。目前從事智能化翻譯教學(xué)系統(tǒng)的運(yùn)營(yíng)和維護(hù),在人工智能深度學(xué)習(xí)和自然語(yǔ)言處理(NLP)方面積累有一定的經(jīng)驗(yàn)。業(yè)余時(shí)間喜愛(ài)翻譯創(chuàng)作,翻譯作品主要有:IEC-ISO 7816、伊拉克石油工程項(xiàng)目、新財(cái)稅主義宣言等等,其中中譯英作品“新財(cái)稅主義宣言”在GLOBAL TIMES正式發(fā)表。能夠利用業(yè)余時(shí)間加入到THU 數(shù)據(jù)派平臺(tái)的翻譯志愿者小組,希望能和大家一起交流分享,共同進(jìn)步
工作內(nèi)容:需要一顆細(xì)致的心,將選取好的外文文章翻譯成流暢的中文。如果你是數(shù)據(jù)科學(xué)/統(tǒng)計(jì)學(xué)/計(jì)算機(jī)類的留學(xué)生,或在海外從事相關(guān)工作,或?qū)ψ约和庹Z(yǔ)水平有信心的朋友歡迎加入翻譯小組。
你能得到:定期的翻譯培訓(xùn)提高志愿者的翻譯水平,提高對(duì)于數(shù)據(jù)科學(xué)前沿的認(rèn)知,海外的朋友可以和國(guó)內(nèi)技術(shù)應(yīng)用發(fā)展保持聯(lián)系,THU數(shù)據(jù)派產(chǎn)學(xué)研的背景為志愿者帶來(lái)好的發(fā)展機(jī)遇。
其他福利:來(lái)自于名企的數(shù)據(jù)科學(xué)工作者,北大清華以及海外等名校學(xué)生他們都將成為你在翻譯小組的伙伴。
點(diǎn)擊文末“閱讀原文”加入數(shù)據(jù)派團(tuán)隊(duì)~
轉(zhuǎn)載須知
如需轉(zhuǎn)載,請(qǐng)?jiān)陂_(kāi)篇顯著位置注明作者和出處(轉(zhuǎn)自:數(shù)據(jù)派ID:DatapiTHU),并在文章結(jié)尾放置數(shù)據(jù)派醒目二維碼。有原創(chuàng)標(biāo)識(shí)文章,請(qǐng)發(fā)送【文章名稱-待授權(quán)公眾號(hào)名稱及ID】至聯(lián)系郵箱,申請(qǐng)白名單授權(quán)并按要求編輯。
發(fā)布后請(qǐng)將鏈接反饋至聯(lián)系郵箱(見(jiàn)下方)。未經(jīng)許可的轉(zhuǎn)載以及改編者,我們將依法追究其法律責(zé)任。