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、最小二乘拟合 

 

 

posted @ 2023-06-29 16:50  Aneverforget  阅读(967)  评论(0编辑  收藏  举报