• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    OpenCV半小时掌握基本操作之直线检测

    【OpenCV】 ⚠️高手勿入! 半小时学会基本操作 ⚠️ 直线检测

    概述

    OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. (第 13 课)

    霍夫直线变换

    霍夫变换 (Hough Line Transform) 是图像处理中的一种特征提取技术. 通过平面空间到极值坐标空间的转换, 可以帮助我们实现直线检测. 如图:

    原理详解

    当我们把直线 y = kx + b 画在指标坐标系上, 如下图. 我们再从原点引线段到直线上的任一点.

    我们可以得到这条线段与 x 轴的夹角为 θ, 距离是 r. 对于直线上的任一点 (x0, y0), 我们可以得到公式:

    代码实战

    HoughLines

    格式:

    cv2.HoughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None)
    

    参数:

    例子:

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    # 读取图片
    image = cv2.imread("sudoku.jpg")
    image_copy = image.copy()
    
    # 转换成灰度图
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 边缘检测, Sobel算子大小为3
    edges = cv2.Canny(image_gray, 170, 220, apertureSize=3)
    
    # 霍夫曼直线检测
    lines = cv2.HoughLines(edges, 1, np.pi / 180, 250)
    
    # 遍历
    for line in lines:
        # 获取rho和theta
        rho, theta = line[0]
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a * rho
        y0 = b * rho
        x1 = int(x0 + 1000 * (-b))
        y1 = int(y0 + 1000 * (a))
        x2 = int(x0 - 1000 * (-b))
        y2 = int(y0 - 1000 * (a))
        cv2.line(image_copy, (x1, y1), (x2, y2), (0, 0, 255), thickness=5)
    
    # 图片展示
    f, ax = plt.subplots(2, 2, figsize=(12, 12))
    
    # 子图
    ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    ax[0, 1].imshow(image_gray, "gray")
    ax[1, 0].imshow(edges, "gray")
    ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))
    
    # 标题
    ax[0, 0].set_title("original")
    ax[0, 1].set_title("image gray")
    ax[1, 0].set_title("image edge")
    ax[1, 1].set_title("image line")
    
    plt.show()
    

    输出结果:

    HoughLinesP

    此函数在 HoughLines 的基础上末尾加了一个代表概率 (Probabilistic) 的 P, 表明它可以采用累计概率霍夫变换, 来找出二值图像中的直线.

    格式:

    HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)
    

    参数:

    例子:

    import numpy as np
    import cv2
    from matplotlib import pyplot as plt
    
    # 读取图片
    image = cv2.imread("sudoku.jpg")
    image_copy = image.copy()
    
    # 转换成灰度图
    image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 边缘检测, Sobel算子大小为3
    edges = cv2.Canny(image_gray, 170, 220, apertureSize=3)
    
    # 霍夫曼直线检测
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=100, maxLineGap=10)
    
    # 遍历
    for line in lines:
    
        # 获取坐标
        x1, y1, x2, y2 = line[0]
        cv2.line(image_copy, (x1, y1), (x2, y2), (0, 0, 255), thickness=5)
    
    
    # 图片展示
    f, ax = plt.subplots(2, 2, figsize=(12, 12))
    
    # 子图
    ax[0, 0].imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    ax[0, 1].imshow(image_gray, "gray")
    ax[1, 0].imshow(edges, "gray")
    ax[1, 1].imshow(cv2.cvtColor(image_copy, cv2.COLOR_BGR2RGB))
    
    # 标题
    ax[0, 0].set_title("original")
    ax[0, 1].set_title("image gray")
    ax[1, 0].set_title("image edge")
    ax[1, 1].set_title("image line")
    
    plt.show()
    

    输出结果:

    到此这篇关于OpenCV半小时掌握基本操作之直线检测的文章就介绍到这了,更多相关OpenCV直线检测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • OpenCV半小时掌握基本操作之分水岭算法
    • 最简单的javascript对象实例代码
    • OpenCV半小时掌握基本操作之傅里叶变换
    • OpenCV半小时掌握基本操作之图像轮廓
    • OpenCV半小时掌握基本操作之直方图
    • OpenCV半小时掌握基本操作之模板匹配
    • OpenCV半小时掌握基本操作之圆圈检测
    • OpenCV半小时掌握基本操作之对象测量
    • OpenCV半小时掌握基本操作之像素加减乘除&逻辑运算
    上一篇:Ubuntu下安装卸载python3.8的过程
    下一篇:Python基础之python循环控制语句break/continue详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    OpenCV半小时掌握基本操作之直线检测 OpenCV,半小时,掌握,基本操作,