簡體   English   中英

線擬合算法OpenCV

[英]Line fitting algorithm OpenCV

我在源圖像上應用了Canny邊緣檢測,然后使用findContours函數查找最長的輪廓。 但是之后,我想在OpenCV中使用線擬合算法(fitline函數)在源圖像中沿天海線繪制一條線。

源圖像:

源圖像

在檢測Canny邊緣並找到最長的輪廓后:

經過Canny邊緣檢測並找到最長的輪廓

擬合后的預期結果:

擬合線后的結果

任何幫助將不勝感激。

您不只是將Canny邊緣檢測器用於地平線。

(1)應用足夠大的中值過濾器以隱藏小比例尺特征。

cv::medianBlur( imgOriginal, blurred, 101 );

(2)計算梯度幅度。 例如,使用以下難看的前向差異:

cv::Mat m;
blurred.convertTo(m,CV_32F);
cv::Mat crop = m( cv::Rect(0,0,m.cols-1,m.rows-1) );
const cv::Mat shiftx = m( cv::Rect(1,0,m.cols-1,m.rows-1) );
const cv::Mat shifty = m( cv::Rect(0,1,m.cols-1,m.rows-1) );
cv::Mat dx,dy;
cv::subtract( shiftx, crop, dx );
cv::subtract( shifty, crop, dy );
cv::pow( dx, 2.0, dx );
cv::pow( dy, 2.0, dy );
cv::add( dx, dy, dx );
m.setTo(0);
cv::sqrt( dx, crop );

(3)收集梯度幅度高於最大強度一半的點。

cv::minMaxLoc( m, &mi, &ma );
const float thr = ma/2.0;
std::vector< cv::Point2f > pts;
for ( int y=0; y<m.rows;++y)
// ...

(4)並把線對准它們。

你應該很合適。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM