RANSC擬合最優直線,c 實現

2021-09-25 08:23:08 字數 1710 閱讀 4649

直接上**:

// 基於ransac演算法的直線擬合

// pstdata: 指向儲存資料的指標

// datacnt: 資料點個數

// lineparameterk: 直線的斜率

// lineparameterb: 直線的截距

// mincnt: 模型(直線)引數估計所需的資料點的個數

// maxitercnt: 最大迭代次數

// maxerrorthreshold: 最大誤差閾值

// consensuscntthreshold: 模型一致性判斷準則

// modelmeanerror: 模型誤差

// 返回值: 返回0表示獲取最優模型, 否則表示未獲取最優模型

//if(!ransacliner(datapoints, totalcnt, 2, 50, 35, 0.1, a, b, c, meanerror))

int ransacliner(st_point* pstdata, int datacnt, int mincnt, double maxitercnt, int consensuscntthreshold,

double maxerrorthreshold, double& a, double& b, double& c, double& modelmeanerror,

set&consensusindexs)

}// step2: 進行模型引數估計 (y2 - y1)*x - (x2 - x1)*y + (y2 - y1)x2 - (x2 - x1)y2= 0

set::iterator selectiter = selectindexs.begin();

while(selectiter != selectindexs.end())

double deltay = (selectpoints[1]).y - (selectpoints[0]).y;

double deltax = (selectpoints[1]).x - (selectpoints[0]).x;

temp_a = deltay;

temp_b = -deltax;

temp_c = -deltay * (selectpoints[1]).x + deltax * (selectpoints[1]).y;

// step3: 進行模型評估: 點到直線的距離

int dataiter = 0;

double meanerror = 0;

settmpconsensusindexs;

while(dataiter < datacnt)

meanerror += distance;

dataiter++;

}// step4: 判斷一致性: 滿足一致性集合的最小元素個數條件 + 至少比上一次的好

if(tmpconsensusindexs.size() >= consensuscntthreshold && tmpconsensusindexs.size() >= bestconsensuscnt )

iter++;

}return isnonfind;

}

參考鏈結**有些小問題,本文中與參考鏈結**稍有不同,abc需要在函式外邊定義,並將函式內abc修改為temp_a、temp_b、temp_c,然後找到最優直線,將最優直線的引數temp_a、temp_b、temp_更新到abc,以此來儲存最優直線的引數。

C實現hough變換擬合直線

原理 對於平面上的乙個點 x1,y1 滿足方程 y1 mx1 b,經過點 x1,y1 的直線有無數條,只要其滿足剛才的直線方程。然而,可以把直線方程變形一下,b x1 m y1,在考慮由點 m,b 組成的面,這裡叫為引數空間,由 x1,y1 確定一條直線。同樣,由另外乙個點 x2,y2 可以確定引數...

直線擬合 矩陣實現

對於我們孤立的點的集合,我們可以使用矩陣求最小二乘法最優解。create matrix columnedagearr 2,1,matrixida create matrix columnedagearr 1,columnedagearr,matrixidacol1 create matrix col...

最小二乘法擬合直線 c 程式

point.h class point point類的宣告 float getx float gety friend float linefit point l point,int n point 友元函式 int型變數為點數 private 私有資料成員 float x,y end of poin...