OpenCV 學習(直線擬合

2021-10-09 17:59:20 字數 1216 閱讀 8950

hough 變換可以提取影象中的直線。但是提取的直線的精度不高。而很多場合下,我們需要精確的估計直線的引數,這時就需要進行直線擬合。

直線擬合的方法很多,比如一元線性回歸就是一種最簡單的直線擬合方法。但是這種方法不適合用於提取影象中的直線。因為這種演算法假設每個資料點的x 座標是準確的,y 座標是帶有高斯雜訊的。可實際上,影象中的每個資料點的xy 座標都是帶有雜訊的。

下面就來講講適用於提取影象中直線的直線擬合演算法。

乙個點到直線的距離用來表示。

所謂直線擬合,就是找到一條直線,使得:

最小。是距離函式。函式取不同的形式,對應不同的直線擬合方法。opencv 中支援 6 種不同的函式形式。分別是:

cv_dist_l2

這種方法是以距離平方和為擬合判據。也就是常見的最小二乘擬合演算法,執行速度也最快。但是這個演算法也有個很大的問題,就是當干擾點離直線較遠時,乙個干擾點就可能將整條擬合直線拉偏了。簡單的說就是對干擾點的魯棒性不夠。所以後來又提出了其他的函式。

cv_dist_l1

cv_dist_l12

cv_dist_fair

其中 c = 1.3998

cv_dist_welsch

其中 c = 2.9846

cv_dist_huber

來表示,那麼 k = line[1]/line[0],b = line[3] - k * line[2]。

如果直線用來表示, 那麼

影象中有一條直線和一些干擾圖案。

下面的**可以從影象中提取出需要的座標點。

std::vectorgetpoints(cv::mat &image, int value)}}

return points;

}

下面的**可以在圖中畫一條直線。

void drawline(cv::mat &image, double theta, double rho, cv::scalar color)

else

}

下面的**是程式的主體。

如果直線擬合型別選擇 cv_dist_l2。那麼效果就沒這麼好了。**不貼了,就貼個結果。

OpenCV直線擬合

摘抄自 opencv 提供的直線擬合函式。函式原型如下 void fitline inputarray points,outputarray line,int disttype,double param,double reps,double aeps disttype 指定擬合函式的型別,可以取 c...

Opencv 擬合直線

最小二乘法是勒讓德 a.m.legendre 於1805年在其著作 計算慧星軌道的新方法 中提出的。最小二乘法就是通過最小化誤差的平方和,使得擬合物件無限接近目標物件。在影象處理中主要用於擬合線,通過求取樣點距離誤差最小的線,可以是直線,曲線,橢圓,圓等。求解方法目前分為多項式和概率 最大似然 估計...

OpenCV下的直線擬合

出處 opencv中 cvseq 物件由以下語句生成 建立 cvseq的容器物件 cvmemstorage storage cvcreatememstorage 0 建立 cvseq物件 第乙個引數 序列的符號標誌 第二個引數 佇列 sequence 頭的size,必須大於等於sizeof cvse...