【openMV系列】霍夫變換---直線提取

原理部分:

原理部分參考:https://blog.csdn.net/yuyuntan/article/details/80141392

霍夫變換公式:r=xcosθ+ysinθ(x,y代表目標點)

                                                

這樣圖像中的每條直線就對應着一對\left ( r,\theta \right )

在霍夫空間中一個點映射一條直線,下面的曲線是過點(3,4)的所有直線的集合(橫軸r,縱軸θ):

點(3,4)於霍夫空間中

 

所以在霍夫空間檢測共線點的問題可以轉化爲找到併發曲線的問題(即找曲線們霍夫空間中的交點)。

在二維平面座標系中三個點的霍夫空間參數:

       圖3

 

在霍夫空間中這三個位於一條直線的點意味着三條曲線的交點

                               圖4

(2,3)(3,4)(4,5):

              

之於openMV

實現圖像二值化和直線擬合顯示:

import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QQQVGA)
sensor.skip_frames(time = 3000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
clock = time.clock()
THRESHOLD = (0, 110)#二值化閾值(灰度)

while True:
    img = sensor.snapshot().binary([THRESHOLD])#二值化
    line = img.get_regression([(255,255)], robust = True)
    #(255,255):追蹤的顏色範圍
    #robust = True:使用Theil-Sen線性迴歸算法
    if (line):#如果存在符合要求的直線
            rho_err = abs(line.rho())-img.width()/2
            #rho_err:負值直線在左側正值在右側若爲水平線的中垂線則爲0
            #line.rho():通過霍夫變換擬合出直線相對於原點的距離(像素數)(即r=xcosθ+ysinθ中的r)
            #img.width():以像素計圖像的寬度
            if line.theta()>90:
            #line.theta():0-90 Y+半軸和直線的夾角,90-180 Y-半軸和直線的夾角
                theta_err = line.theta()-180
            else:
                theta_err = line.theta()
            #處理後:絕對值爲直線同Y+軸的夾角,右正左負
            img.draw_line(line.line(), color = 127)
            print(rho_err,line.rho(),line.magnitude(),line.theta(),theta_err)
            #line.magnitude():霍夫變換後所得直線的模


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章