opencv: 直线拟合,霍夫变换cv2.HoughLines、cv2.line,最小二乘cv2.fitline
参考网页:
(19条消息) OpenCV | 直线拟合fitline函数(Python)_cv2.fitline_lovetaozibaby的博客-CSDN博客
例子,出来的结果是非常多直线的,所以需要在拟合前检测出图像焊缝,并提取出拟合点,再进行霍夫变换。
import cv2 import numpy as np from skimage import morphology def show_processImg(img): cv2.imshow('img', img) # cv2.waitKey(0) while True: if cv2.getWindowProperty('img', 0) == -1: # 当窗口关闭时为-1,显示时为0 break cv2.waitKey(1) # cv2.destroyWindow('img') cv2.destroyAllWindows() img = cv2.imread('D:/project/project/line_detect/resources/welding_line.png', 0) recognizeImg=cv2.Canny(img,50,10) #霍夫检测直线。 #HoughLines函数输出检测到直线的矢量表示集合,每一条直线由具有两个元素的矢量(ρ, θ)表示,其中ρ表示直线距离原点(0, 0)的长度,θ表示与直线垂直线的角度(弧度) lines = cv2.HoughLines(recognizeImg, 1, np.pi / 180, 100) # print(lines.shape,lines[0]) #绘制直线 for line in lines: rho,theta=line[0] x0=rho*np.cos(theta) y0 = rho * np.sin(theta) k=np.around(-x0/y0,decimals=2)#两垂直线截距互为倒数,且变负号 b=y0-k*x0#截距 height,width=recognizeImg.shape x1=int(x0-width//2) y1=int(k*x1+b) x2=int(x0+width//2) y2=int(k*x2+b) # print(k) # print(recognizeImg.shape) cv2.line(recognizeImg,(x1,y1),(x2,y2),(255,0,0),1) show_processImg(recognizeImg)
2、最小二乘拟合