python 用opencv实现霍夫线变换

yizhihongxing

标题:Python使用OpenCV实现霍夫线变换

简介

霍夫线变换是一种基于数学方法的图像处理技术,它可以用于找到图像中的直线。OpenCV是一个常用的计算机视觉库,它提供了相应的API支持,方便我们使用Python实现霍夫变换。

步骤

1.导入库

在这个过程中,需要使用OpenCV和NumPy两个库。

import cv2
import numpy as np

2.读取图像

通过cv2.imread()函数来读取图像,需要指定读取的文件名和文件路径。

img = cv2.imread("sample.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

3.应用霍夫线变换

lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)

以上代码实现了对图像中的直线进行霍夫变换,其中的参数1表示霍夫变换中的ρ精度,即直线到图像原点(0, 0)的距离精度;参数2表示霍夫变换中的θ精度,即识别直线的角度精度;参数3表示在多少个点以上才判定这是一条直线。

4.绘制直线

要在图像上绘制直线,需要先用cv2.linse()函数画出直线。画直线时需要指定直线的起点和终点坐标,颜色,线条粗细等。画出直线后可以使用cv2.imshow()函数显示并保存图像。

for line in lines:
    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(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以上代码中的 for 循环用来遍历每一个直线,rho 和 theta 是霍夫变换的两个返回值,a 和 b 分别是该直线的参数,用于计算直线的起点和终点坐标(x1, y1)和(x2, y2)。

示例

示例1:对一张图片进行霍夫线变换并显示结果

import cv2
import numpy as np

img = cv2.imread("sample.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)

for line in lines:
    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(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例2:对一段视频进行霍夫线变换并显示结果

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    lines = cv2.HoughLines(edges, 1, np.pi / 180, 200)

    if lines is not None:
        for line in lines:
            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(frame, (x1, y1), (x2, y2), (0, 0, 255), 2)

    cv2.imshow("result", frame)

    k = cv2.waitKey(1)
    if k == 27:
        break

cap.release()
cv2.destroyAllWindows()

以上代码中的 while 循环用来对视频进行处理,cap.read() 用来读取视频帧,if 判断用来判别是否有直线。
其中,cv2.waitKey(1) 的参数含义是等待键盘输入事件,1代表等待1毫秒。如果在等待时间内,有按键按下,则返回相应的ASCII值,否则返回-1。

结论

利用Python和OpenCV实现霍夫线变换是一种简单有效的图像处理技术,它可以用于图像识别、物体跟踪、平面角度检测等领域。同时,我们可以采用以上提到的代码,通过对图像和视频进行处理,来更好地了解和应用此技术。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 用opencv实现霍夫线变换 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Django工程的分层结构详解

    下面我会详细讲解“Django工程的分层结构详解”的完整攻略。 1. 概述 Django工程采用MVC的分层结构,将整个项目分为了模型(Model)、视图(View)和控制器(Controller)三层。此外,Django还加入了一个名叫模板(Template)的层,用于处理网页的渲染。 从模型层开始,我们逐层向上介绍各层的作用及其文件夹结构。 2. 模型层…

    人工智能概论 2023年5月25日
    00
  • SpringCloud-Hystrix组件使用方法

    SpringCloud Hystrix 组件使用方法攻略 概述 SpringCloud Hystrix 组件是一个用于服务容错和限流的工具,用于帮助我们处理分布式系统的各种问题,提升系统的可用性、稳定性和弹性。本文将详细讲解 Hystrix 组件的使用方法,包括如何在项目中配置 Hystrix、如何编写 Hystrix Command、如何在 Feign 中…

    人工智能概览 2023年5月25日
    00
  • Serverless 架构如何演进详细介绍

    Serverless 架构是一种基于事件驱动的计算模型,它使开发人员可以编写和部署函数,而不必担心底层的基础设施和服务器管理。相比传统的基础设施,Serverless 更具有弹性和可扩展性。本文将介绍 Serverless 架构的演进历程,以及相关技术和工具的变化。 Serverless 的演进历程 第一阶段:无服务器计算 最初,Serverless 只是一…

    人工智能概览 2023年5月25日
    00
  • 浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点

    浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点 在tensorflow中,要构建高效且正确的数据输入流程,通常需要用到两个重要的函数:dataset.shuffle和dataset.batch。本文将讨论这两个函数的用法及其注意点,还会简单介绍dataset.repeat函数。 dat…

    人工智能概论 2023年5月24日
    00
  • 用ASP实现分级权限控制

    以下是用ASP实现分级权限控制的完整攻略,包括步骤和示例说明。 步骤 创建数据库:首先,需要创建一个数据库,用于存储用户信息、角色信息、权限信息等。 设计数据库表结构:在数据库中创建用户信息表、角色信息表、权限信息表等表结构,并通过外键关联来建立它们之间的关系。例如,用户表和角色表之间可以通过用户id和角色id的关联来实现。 编写代码:使用ASP编写代码来操…

    人工智能概览 2023年5月25日
    00
  • ahjesus安装mongodb企业版for ubuntu的步骤

    安装mongodb企业版 for Ubuntu 需要分以下几个步骤: 添加 mongodb 企业版的 apt-key 添加 mongodb 企业版的 apt repository 安装 mongodb 企业版 启动 mongodb 企业版 下面是详细的安装过程: 1. 添加 mongodb 企业版的 apt-key 在终端中输入以下命令: wget -qO …

    人工智能概览 2023年5月25日
    00
  • pytorch 使用半精度模型部署的操作

    使用半精度模型可以显著地降低内存占用和计算时间,因此在部署深度学习模型时,使用半精度模型已经是一个不错的选择。在 PyTorch 中,使用半精度模型的相关操作可以参考以下攻略: 1. 确认半精度支持 在 PyTorch 中,半精度支持可以使用 torch.cuda 中的相关 API 进行判断和开启。可以使用以下代码进行确认: import torch # 判…

    人工智能概论 2023年5月25日
    00
  • 利用JavaScript如何查询某个值是否数组内

    JavaScript提供了Array对象,可以用来操作数组。查询某个值是否在数组内可以借助其中的方法实现。 使用indexOf方法 indexOf方法可以用于查找数组中某个元素第一次出现的位置,如果存在返回该元素的索引值,否则返回-1。因此,我们可以利用该方法来判断某个值是否在数组内。 示例代码: const fruits = [‘apple’, ‘bana…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部