使用Halcon完成最小二乘法拟合直线

使用Halcon完成最小二乘法拟合直线

本篇博客主要为了展示通过Halcon内的一系列点(不在同一条直线)的集合拟合成一条直线,这里使用的方法为经常用到的最小二乘法,本篇不再对最小二乘的原理进行阐述,而是直接利用其公式\(A^TAX=A^Tb\),其中A为两列N行的矩阵,其行数等于点的个数,其每行第一个元素为点的X坐标,对应Halcon中的列坐标,而每行的第二个坐标为1,X为一个列向量,第一个元素即为\(y=ax+c\)中的a,而第二个元素为c,b为一列N行的列向量,其每行的元素对应点的Y坐标,即Halcon中的行坐标。

最小二乘法
*****************************最小二乘法拟合直线*****************************

*点数据
Rows := []
Cols := []

*模拟直线数据
a := 1
b := 10
for Index := 0 to 9 by 1
    *y = ax + b
    TempCol := Index * 20
    TempRow := a * TempCol + b
    Rows := [Rows,TempRow]
    Cols := [Cols,TempCol]
endfor

a := 1
b := 20
for Index := 0 to 9 by 1
    *y = ax + b
    TempCol := Index * 20
    TempRow := a * TempCol + b
    Rows := [Rows,TempRow]
    Cols := [Cols,TempCol]
endfor

gen_cross_contour_xld (Cross, Rows, Cols, 6, 0.785398)

*根据最小二乘法公式ATAX = ATb ===> X = (ATA)逆*(ATb)

*创建矩阵A
A := [Cols[0],1,\
      Cols[1],1,\
      Cols[2],1,\
      Cols[3],1,\
      Cols[4],1,\
      Cols[5],1,\
      Cols[6],1,\
      Cols[7],1,\
      Cols[8],1,\
      Cols[9],1,\
      Cols[10],1,\
      Cols[11],1,\
      Cols[12],1,\
      Cols[13],1,\
      Cols[14],1,\
      Cols[15],1,\
      Cols[16],1,\
      Cols[17],1,\
      Cols[18],1,\
      Cols[19],1]
b := [Rows[0],\
      Rows[1],\
      Rows[2],\
      Rows[3],\
      Rows[4],\
      Rows[5],\
      Rows[6],\
      Rows[7],\
      Rows[8],\
      Rows[9],\
      Rows[10],\
      Rows[11],\
      Rows[12],\
      Rows[13],\
      Rows[14],\
      Rows[15],\
      Rows[16],\
      Rows[17],\
      Rows[18],\
      Rows[19]]
      
create_matrix (20, 2,A, MatrixAID)
create_matrix (20, 1,b, MatrixbID)
*计算ATA(其实Halcon里对于AX = b,有直接求解的算子,solve_matrix)
mult_matrix (MatrixAID, MatrixAID, 'ATB', MatrixATAID)
*计算(ATA)逆
invert_matrix (MatrixATAID, 'general', 0, MatrixInvID)
*计算(ATA)逆*AT
mult_matrix (MatrixInvID, MatrixAID, 'ABT', MultMatrixID)
*最终结果
mult_matrix (MultMatrixID, MatrixbID, 'AB', MatrixRes)

get_full_matrix (MatrixRes, Values)
*得到a和b
a := Values[0]
b := Values[1]
*绘制拟合直线
Col1 := 0
Row1 := a * Col1 + b

Col2 := 300
Row2 := a * Col2 + b
gen_contour_polygon_xld (Contour, [Row1,Row2], [Col1,Col2])

总共拟合了二十个点,其中十个点来自一条直线,另外十个点来自另外一条直线,则对应于\(A^TX=A^Tb\)中的\(A\)

\[\left[ \begin{matrix} Col1 & 1 \\ Col2 & 1 \\ Col3 & 1 \\ ... & ... \\ Col20 & 1 \end{matrix} \right] \ \]

\(b\)则对应

\[\left[ \begin{matrix} Row1\\ Row2\\ Row3\\ ... \\ Row20 \end{matrix} \right] \ \]


拟合的结果:
image

posted @ 2022-05-11 20:27  木乔ni  阅读(1843)  评论(0编辑  收藏  举报