在本次教程中,我們將介紹:
· 由相機引起的失真型別,
· 如何找到相機的固有和非固有特性
· 如何根據這些特性使影象不失真
一些針孔相機會給影象帶來明顯的失真。兩種主要的變形是徑向變形和切向變形。徑向變形會導致直線出現彎曲。
距影象中心越遠,徑向畸變越大。例如,下面顯示乙個影象,其中棋盤的兩個邊緣用紅線標記。但是,我們會看到棋盤的邊框不是直線,並且與紅線不匹配,所有預期的直線都凸出。
徑向變形可以表示成如下:
同樣,由於攝像鏡頭未完全平行於成像平面對齊,因此會發生切向畸變。因此,影象中的某些區域看起來可能比預期的要近。切向畸變的量可以表示為:
簡而言之,我們需要找到五個引數,稱為失真係數,公式如下:
除此之外,我們還需要其他一些資訊,例如相機的內在和外在引數。內部引數特定於攝像機。它們包括諸如焦距(f_x,f_y)和光學中心(c_x,c_y)之類的資訊。焦距和光學中心可用於建立相機矩陣,該相機矩陣可用於消除由於特定相機鏡頭而引起的畸變。相機矩陣對於特定相機而言是唯一的,因此一旦計算出,就可以在同一相機拍攝的其他影象上重複使用。它表示為3x3矩陣:
外在引數對應於旋轉和平移向量,其將3d點的座標平移為座標系。
對於立體聲應用,首先需要糾正這些失真。要找到這些引數,我們必須提供一些定義良好的圖案的示例影象(例如西洋棋棋盤)。我們找到一些已經知道其相對位置的特定點(例如棋盤上的四角)。我們知道現實世界空間中這些點的座標,也知道影象中的座標,因此我們可以求解失真係數。為了獲得更好的結果,我們至少需要10個測試模式。
相機校準原理
首先先簡單的了解一下相機標定的原理。
攝像機標定(camera calibration)簡單來說是從世界座標系換到影象座標系的過程,也就是求最終的投影矩陣 p 的過程。
一般來說,標定的過程分為兩個部分:
· 第一步是從世界座標系轉換為相機座標系,這一步是三維點到三維點的轉換,包括 r,t (相機外參)等引數;
· 第二部是從相機座標系轉為影象座標系,這一步是三維點到二維點的轉換,包括 k(相機內參)等引數;
世界座標系轉換為相機座標系:
公式表達如下:
其中:
相機座標系轉換為影象座標系:
其中:· c點表示camera centre,即相機的中心點,也是相機座標系的中心點;
· z 軸表示principal axis,即相機的主軸;
· p 點所在的平面表示image plane,即相機的像平面,也就是座標系所在的二維平面;
· p點表示principal point,即主點,主軸與像平面相交的點;
· c 點到 p 點的距離,也就是右邊圖中的f 表示focal length,即相機的焦距;
· 像平面上的 x 和 y 座標軸是與相機座標系上的 x 和 y 座標軸互相平行的;
· 相機座標系是以 x, y, z三個軸組成的且原點在 c 點,度量值為公尺(m);
· 像平面座標系是以 x,y(小寫)兩個軸組成的且原點在 p 點,度量值為公尺(m);
· 影象座標系一般指相對座標系,在這裡可以認為和像平面座標繫在乙個平面上,不過原點是在的角上,而且度量值為畫素的個數(pixel);
通過對上面座標系的介紹,可以得到以下的轉換公式:
加上偏移量:
如上圖所示,其中主點 p 是像平面座標系的原點,但在影象座標系中的位置為 (px,py),在這裡,圖形座標系的原點是的左下角,所以可以得到:
把這個換成矩陣計算:
最後,可以得到矩陣k,就是相機內參:
投影矩陣p(在這裡可以認為旋轉矩陣 r 為單位矩陣 i,平移矩陣 t 都為0):
從上面兩個轉換的過程,我們可以得到從世界座標軸轉換到影象的過程可以把投影矩陣p表示為:
其中:在這裡,k 一般稱為相機內參,描述了相機的內部引數,包括焦距 f、主點 p 的位置、以及畫素與真實環境的大小比例等,這個是固有屬性,是提供好的;r 和 t 稱為相機外參,r 在這裡是旋轉矩陣,可以轉換為三維的旋轉向量,分別表示繞x,y,z 三個軸的旋轉角度,t 目前就是乙個平移向量,分別表示在x,y,z 三個方向上的平移量。
了解完一定原理之後,我們在下個教程中將開始實踐一下。
OpenCV Python系列之哈里斯角檢測
我們在上次簡述了opencv的特徵基礎原理,本次我們將步入實戰部分,開始進行特徵的初階檢測。原理 在上乙個教程中,我們知道了角點是影象中向任意方向發生改變時,都引起影象強烈變動的區域。chris harris 和 mike stephens 在他們1988年的 a combined corner a...
OpenCV Python系列之拉普拉斯運算元
我們在上乙個教程中前面的例子學習了使用sobel邊緣檢測。原理是利用邊緣區域畫素值的跳變。通過求一階導數,可以使邊緣值最大化。如下圖所示 那麼,如果求二階導數會得到什麼呢?可以觀察到二階導數為0的地方。因此,可以利用該方法獲取影象中的邊緣。然而,需要注意的是二級導數為0的不只出現在邊緣地方,還可能是...
OpenCV Python系列 第二十二集 戴面具
tip 實時監測人臉,並戴上面具。coding utf 8 created on tue sep 4 08 50 53 2018 author administrator import cv2 def maskman face mask 獲取面具的寬高 h mask,w mask face mask...