For slam, 直線相對于點這些特征來說會更robust, 更常見纷捞。 畢竟點特征更需要環(huán)境紋理信息很豐富痢虹。
剛好最近瞎看了一些關于直線檢測的問題。
#############################霍夫變換########################
第一個canny edge檢測主儡,她基于梯度可以檢測出圖像的大部分邊緣線奖唯。 基本步驟canny
然后如何人基于邊緣找直線呢?
1)??Hough Transform
2) 利用線的方向?
Straight line detector =
canny + gradient orientations +orientation binning +linking + check for straightness
#############LSD:a Line Segment Detector####################
可以參考別人的一個博客糜值,寫的很清楚LSD
##############################################################
#python opencv自帶的提取line的特征
def line_detection_save(self,fidin,rgb):
? ? gray= cv2.cvtColor(rgb, cv2.COLOR_BGR2GRAY)
lsd= cv2.createLineSegmentDetector(2)
# Detect lines in the image
? ? lines= lsd.detect(gray)# Position 0 of the returned tuple are the detected lines
? ? for dlinein lines[0]:
? ? ? ? ? x0= int(round(dline[0][0]))
? ? ? ? ? ?y0= int(round(dline[0][1]))
? ? ? ? ? ? x1= int(round(dline[0][2]))
? ? ? ? ? ? y1= int(round(dline[0][3]))
? ? ? ? ? ? string= str(x0)+ ' ' + str(y0)+ ' ' + str(x1)+ ' ' + str(y1)+ '\n'
? ? ? ? fidin.write(string)
return fidin
##########################################
霍夫變換丰捷,同樣是opencv python的代碼
############################################
img = cv2.imread('lines.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
minLineLength=100
lines = cv2.HoughLinesP(image=edges,rho=0.02,theta=np.pi/500, threshold=10,lines=np.array([]), minLineLength=minLineLength,maxLineGap=100)
a,b,c = lines.shape
for i in range(a):? ??
? ? ? ?cv2.line(img, (lines[i][0][0], lines[i][0][1]), (lines[i][0][2], lines[i][0][3]), (0, 0, 255), 3,? cv2.LINE_AA)? ?
? ? ? cv2.imwrite('houghlines5.jpg',img)
!<呕恪2⊥!另外還有一些基于深度學習的方法,但是不是很robust健无,pixel誤差比較大
#######################LSD line 檢測##############
有開源代碼荣恐,超級好用,推薦