第8章 關於繼黃黑色p站張宇考研數學之後,藍色p站也可以學習了這碼事兒——工程數學:最小二乘法在機器視覺中的應用(實習初步學習筆記)
……竟然湊夠了三十人hhhh
那大家就來看H文寫手講數學吧。
哎呦沃日你大壩,word文檔復制粘貼到p站上不會直接把圖導進來,離譜……
先修課程:高等數學(基礎)、线性代數(重要!)、計算方法(重要!)、機器視覺與人工智能一類的視覺算法課(不是很必要)。
這節課我們講《最小二乘法在計算機視覺的一些應用》,全文分為三個部分,第一部分講:什麼是最小二乘法?第二第三部分講最小二乘法的兩個應用。
最小二乘法:背景?性質?用途?
很多時候,我們在工程中會遇到解多元一次方程組的問題,比如我們要解一個三元一次方程組,那很明顯,我們需要三組互相线性不相關的方程,這樣才能恰好解出方程的解X1、X2、X3。也就是說,當我們要解一個n元一次方程組的時候,一般來說是需要n組互相线性不相關的方程的。
這個性質,我們用矩陣來表示:
A(n*n) * X(n*1) = B(n*1)
其中X就是我們要求的解向量。
但是在工程中,我們遇到的問題往往是:我們所列出的方程,每一組都存在誤差,比如模擬到數字的轉化誤差(比如電表量電壓的時候,只能顯示小數點後一位,但是實際上的電壓可能小數點後面還有好幾位)、數據類型轉化產生的誤差(如double到int,6.5->6,這0.5的誤差就出來了)……等等等等。
那這樣一來,我拿著這些帶著誤差的值去求解,那當然是鐵求錯啊!於是乎,工程師們就想了個辦法:既然反正錯了,不如我多用幾組數據去求解,這樣去求一個方差最小的解出來,盡量滿足計算要求。
好家伙,這樣一來,多組數據共同進入運算,互相去消除誤差,聽起來很美妙對吧?Wouldn’t that be lovely?
我說婷婷。
比如我們用十組(n=10)數據去求解一個六元一次方程吧。
我們再把剛才的矩陣表達式帶一遍,會是怎麼樣呢?
A(10*10) * X(6*1) = B(10*1)
發現問題了沒有!矩陣維度根本不一致!這個矩陣乘法等式根本不成立!
那有些同學就問了啊,A它不是一個10*6的矩陣嗎?怎麼到你這就成了10*10了呢?
哎我說這講課不是胡說,編課不是瞎編。我們再寫一下矩陣表達式:
A(10*6) * X(6*1) = B(10*1)
好!矩陣等式至少在維度上成立了!很有精神!大功告成?
我說婷婷。
10組數據根本解不出來6個未知數,這是一個超定問題(已知的量的個數超過求解需要的量的個數)。
那怎麼辦?我總不能一下子扔掉後四個已知量吧?且不說這前邊的六位兄弟賣了後面的四個兄弟,他們的心里冷~冰~冰~,還有就是我們一開始的目的:多組數據共同進入運算,互相去消除誤差沒有達到,可以說沒有充分地利用已知條件。
那這個時候就要到最小二乘法大顯神威了:我們在上一條等式的兩邊乘以A的轉置:
AT(6*6)*A(10*6) * X(6*1) = AT(6*6)*B(10*1)
化簡、合並:
A\u0027(6*6)*X(6*1)=B\u0027(6*1)
這樣就化為了多元一次方程組的解的一般形式了。
應用1:相機標定
相機標定(Camera Calibration),是給定一個真實坐標系,然後將像素坐標轉化到這個坐標系上的問題。我在實習中遇到的問題是:給一張含有DN碼和棋盤格點的圖片(一定是平拍的,不會傾斜,因此不涉及相機傾角的問題,因此可以不用張正友標定發那麼復雜的方法),讀DN碼得到DN碼的方向和DN碼中心的真實坐標,並且依據方向建立基礎坐標系、並利用多個棋盤的格點去確定更精確的圖像坐標系到真實坐標的變換矩陣,最後再用這個變換矩陣去實現相機坐標系到真實坐標系的坐標變換。
如圖。這個大藍圈兒的中心就是用真實坐標(13,21)做反變換得到的相機坐標。別的圈兒是我中間debug的時候畫的。(二維碼的中心坐標是(10,20))
別的一些對應角點、角點排序等問題並不是我們今天的主題,我們不過多贅述,我們今天只講opencv下最小二乘法的應用。
我們三步走:
第一步,根據實際模型填寫矩陣A、B:
第二步:A和B同時乘以A的轉置,得A’、B’。
第三步:用A’·X=B’解得X
那麼最小二乘法應用完了,最核心的問題就解決了,剩下就是將abcdef裝回矩陣,然後用
去做坐標變換罷了。
應用2:小弧度圓的擬合
給定一張圖片,拍攝角度不超過10°的一個圓弧,對應的半徑在像素上是從至少1000到約2600不等,圓心的位置完全不確定,只知道圓弧上的一組最廣分布在±2°上的點和它們不超過±3°的對應旋轉關系。
由於第二個任務目前只是在讓我做一個初步的算法,還沒有具體到實際的可視化,因此不能像第上一個應用那樣去給大家直接展示成果,很多時候只能講理論。
我們假設:原圓心為(x0,y0),一共有a個點,和它們對應的b個旋轉關系。(這里的原圓心是(500,900),每個亞像素的噪聲在x和y向的都是方差為0.5/2.58的AWGN(Addictive White Gaussian Noise),即以99%概率分布在±0.5,由於這個噪聲對於小弧度的圓來說實在過於致命,後來我又用最小二乘法擬合了一條補正的二次曲线,這才有了後面比較精准的解算結果,不過後面的過程我們不多贅述,重點講第一步這個“粗略”圓心是怎麼獲得的)。
話不多說,三板斧開砍。
第一步,根據實際模型填寫矩陣A、B:
這里的實際模型比第一例還要復雜很多,甚至矩陣維度都不是固定的——如果有a個點,A的維度將會是(a*b, a+2)。這里以a=3,b=3為例。
注意這里建模的時候,建立在“三點隸屬同一圓心”這一前提上是十分重要的。Halcon的擬合方法我也用了,它並沒有這樣的功能,只能用一個點去不停地旋。這種擬合出來的圓心是十分離譜的,完全不能用的。
第二步:A和B同時乘以A的轉置,得A’、B’。
第三步:用A’·X=B’解得X
然後,我們取X的前兩項,乘以-0.5,就是圓心的坐標了。
總結:
最小二乘法三步走:填矩陣、兩邊乘轉置、解得。說白了就是這麼簡單。
絕了,經典不務正業,經典一周五千字給金主小刀刮痧但摸魚卻摸的很起勁23333