Python+OpenCV 直线检测

霍夫直线变换介绍

1、Hough Line Transform用来做直线检测

2、前提条件——边缘检测已经完成

3、平面空间到极坐标空间转换

import cv2 as cv
import numpy as np


def line_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    # apertureSize做Canny时梯度窗口的大小
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    # 返回的是r和theta
    lines = cv.HoughLines(edges, 1, np.pi/180, 200)
    for line in lines:
        print(type(line))
        rho, theta = line[0]
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        # 乘以1000,是根据源码乘的,通过x1、x2、y1、y2画一条直线
        x1 = int(x0+1000*(-b))
        y1 = int(y0+1000*a)
        x2 = int(x0-1000*(-b))
        y2 = int(y0-1000*a)
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)  # 2是所画直线长度的宽
    cv.imshow('image_lines', image)


def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    # 做Canny时梯度窗口的大小
    edges = cv.Canny(gray, 50, 150, apertureSize=3)
    # minLineLength是线段最小长度,maxLineGap是线段最大间隔,该间隔之内的认为是一条直线
    lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)
    for line in lines:
        print(type(line))
        # (x1,y1),(x2,y2)是线段的两点,只画出了一个个线段
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow('image_lines', image)


src = cv.imread('C:/Users/Y/Pictures/Saved Pictures/morph02.png')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

发布了70 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Acmer_future_victor/article/details/104153119