直接上**:
// 基於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...