原理部分:
原理部分參考:https://blog.csdn.net/yuyuntan/article/details/80141392
霍夫變換公式:r=xcosθ+ysinθ(x,y代表目標點)
這樣圖像中的每條直線就對應着一對。
在霍夫空間中一個點映射一條直線,下面的曲線是過點(3,4)的所有直線的集合(橫軸r,縱軸θ):
所以在霍夫空間檢測共線點的問題可以轉化爲找到併發曲線的問題(即找曲線們霍夫空間中的交點)。
在二維平面座標系中三個點的霍夫空間參數:
在霍夫空間中這三個位於一條直線的點意味着三條曲線的交點
(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():霍夫變換後所得直線的模