---------------基於ransac算法直線檢測:
(1)從樣本集N中,隨機選n個點作爲初始子集(但是所選取的這n個點點必須能夠表達待擬合的模型,比如擬合直線的話最少需要2個點,所以n=2(這是正常求解方式),但是基於最小二乘的思想的化最少需要大於2個點,所以n>2(必須))。
(2)根據(1)中擬合的模型,遍歷N集合中的數據,如果在設置的距離閾值範圍之內,則將其視爲內點,將所有的內點稱爲一致集。
(3)如果一致集中的內點個數大於設置的閾值個數T,則用內點重新擬合模型算法結束。
(4)如果一致集中的內點個數小於設置的閾值個數T,則重複重新進行(1)(2)(3)(4)。
(5)經過重複選擇一個最大的一致集,並重新估計模型,並跳出,算法結束。
---------------基於ransac算法平面檢測:
1、確定迭代次數;
2、在迭代次數內:
2.1 隨機選擇三個點組成平面(判斷三個點是否共線);
2.2 構造座標矩陣;
2.3 求平面方程;
2.4 求所有點到平面的距離;
2.5 統計inlier個數(距離小於閾值);
3、迭代選擇inlier個數最多的平面。
PS:如果你進行的是地面分割,只使用inlier作爲判斷條件的不足;導致某個點數較多的非地面平面佔據inlier個數;爲了避免將平直牆面檢測爲地面,必須將夾角加入判斷條件;(夾角就是法向量與Z軸(0,0,1)的夾角。
判斷三個點是否共線的兩種方法:
1、滿足滿秩矩陣(利用滿秩行列式不等於0)用三點其中任意兩點組成向量,求這樣兩個不同向量是否平行就行了.也就是說三個點的座標組成一個三階行列式,只要三階行列式爲0,且該矩陣秩爲1,則必定是共線的。
2、利用比例關係(就是兩兩向量成比例)爲了方便,我數字設簡單一點比如(0,0,0),(1,2,3),(4,5,6)三點先任取兩個想減得到(1-0,2-0,3-0)和(4-1,5-2,6-3)兩個向量即(1,2,3)和(3,3,3)這兩個向量然後設一個比例常數t使1*t=3解得t=3帶入2*t得6與對應的y=3不等所以不共線。(即設三點爲A、B、C .利用向量證明:λAB=AC(其中λ爲非零實數))
3、利用點差法求出ab斜率和ac斜率 相等即三點共線
4、取兩點確立一條直線,計算該直線的解析式,代入第三點座標 看是否滿足該解析式。
5、證明平角即可例如,三點ABC,有任意一點D,若角DBA+角DBC=180度,即角ABC=180度,則點ABC三點共線幾何表達:因爲角ABC=180度所以點ABC三點共線(初中方法)
ransac算法平面檢測數學知識擴展:
三點式平面方程:ax+by+cz=d 點到平面的距離公式:
(1)滿秩矩陣:設A是n階矩陣, 若r(A) = n(記爲rank=n), 則稱A爲滿秩矩陣。但滿秩不侷限於n階矩陣。如果n階方陣A滿秩,就是A的秩爲n,則A有一個n階子式不等於0,因爲A只有一個n階子式,即其本身,所以|A|≠0(滿秩行列式不等於0)。
於 mxn的非方陣而言,它可能的最大秩爲 min{m,n}. 當 rank=m時,稱其行滿秩;當 rank=n時,稱其列滿秩。
若矩陣秩等於行數,稱爲行滿秩;若矩陣秩等於列數,稱爲列滿秩。既是行滿秩又是列滿秩則爲n階矩陣即n階方陣。行滿秩矩陣就是行向量線性無關,列滿秩矩陣就是列向量線性無關;所以如果是方陣,行滿秩矩陣與列滿秩矩陣是等價的。
對於向量組而言,要考慮向量的維數和個數:
如果向量個數大於其維數(比如說10個三維向量),則該向量組必線性相關,也就是下面左圖情況。也就是說,向量組的秩,不超過 min{向量的個數,向量的維數}。
解釋爲什麼線性代數中向量個數大於向量維數,那麼這幾個向量就線性相關呢??答案就是:判斷向量組的線性相關性就是看方程x1A1+x2A2+...+xkAk=0有沒有非零解.把它展開就是一個線性方程組,係數矩陣有k列,其行數就是向量的維數.若向量的維數小於k(是表示方程組的個數比未知數多嗎???),那麼方程組有非零解(方程個數小於未知量個數時,齊次線性方程組非零解,因爲係數矩陣的秩≤行數<未知量個數)(向量組線性相關的充分必要條件是它們所拼成的矩陣的秩小於向量的個數。當向量個數大於維數時,矩陣的秩≤行數=向量維數<向量個數,所以向量組一定線性相關。 )
我印象中好像教科書上沒有介紹非方陣和向量組的滿秩的定義。。所以也可以不用糾結,強調是行滿秩還是列滿秩就行了。我個人認爲,向量組滿秩可以定義爲向量組的秩等於向量的個數,那麼下圖一種情況可能滿秩,上圖一種情況不可能滿秩因爲上圖中響亮的個數爲10,但是向量組的秩不超過3(因爲取最小嘛)。
(2)滿秩矩陣:秩=階數的方陣。滿秩矩陣也可以被稱爲可逆矩陣;(初等矩陣是由單位陣E經過初等變換得到的矩陣,這句話跟此處無關只是看到了記一下)
三個向量行列式爲零,這說明三個向量組成的矩陣不滿秩,也就是說向量組的極大無關組裏,向量的個數小於3,就是說,一定有向量可以由其他向量線性表制示,這就說說明三個向量共面(不共線)。
行列式在數學中,是一個函數,其定義域爲det的矩陣A,取值爲一個標量,寫作det(A)或 | A | 。無論是在線性代數、多項式理論,還是在微積分學中(比如說換元積分法中),行列式作爲基本的數學工具,都有着重要的應用。
行列式可以看做是有向面積或體積的概道念在一般的歐幾里得空間中的推廣。或者說,在 n 維歐幾里得空間中,行列式描述的是一個線性變換對“體積”所造成的影響。
貼一個點法式的平面方程表達形式:
已知三個三維點,求他們的平面方程:
已知三個點座標爲P1(x1,y1,z1), P2(x2,y2,z2), P3(x3,y3,z3)
所以可以設方程爲A(x - x1) + B(y - y1) + C(z - z1) = 0 (點法式) (也可設爲過另外兩個點)
核心代碼:
//在此之前寫好錄入三個三維點的代碼,然後就是處理待定係數,如下:
A = (y3 - y1)*(z3 - z1) - (z2 -z1)*(y3 - y1);
B = (x3 - x1)*(z2 - z1) - (x2 - x1)*(z3 - z1);
C = (x2 - x1)*(y3 - y1) - (x3 - x1)*(y2 - y1);
即得過P1,P2,P3的平面方程
方程也可寫爲 Ax + By + Cz + D = 0 (一般式) 其中D = -(A * x1 + B * y1 + C * z1)
改天分析代碼吧,先睡覺去了。