OpenCV实现直线检测

作者:Robin?Long?2018 时间:2023-08-14 01:37:35 

本文实例为大家分享了OpenCV实现直线检测的具体代码,供大家参考,具体内容如下

1 介绍

本文主要介绍OpenCV自带的直线检测函数HoughLines()的用法,这个函数的第一个参数是一个二值化图像,所以在进行霍夫变换之前要首先进行二值化,或者进行Canny 边缘检测。第二和第三个值分别代表β 和 θ 的精确度。第四个参数是阈值,只有累加其中的值高于阈值时才被认为是一条直线,也可以把它看成能检测到的直线的最短长度(以像素点为单位)。返回值就是(β; θ)。β 的单位是像素,θ的单位是弧度。

2 代码 

#直线检测
#使用霍夫直线变换做直线检测,前提条件:边缘检测已经完成
import cv2 as cv
import numpy as np
import matplotlib.pylab as plt
 
#标准霍夫线变换
def line_detection(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  #apertureSize参数默认其实就是3
    cv.imshow("edges", edges)
    lines = cv.HoughLines(edges, 1, np.pi/180, 80)
    for line in lines:
        rho, theta = line[0]  #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
        a = np.cos(theta)   #theta是弧度
        b = np.sin(theta)
        x0 = a * rho    #代表x = r * cos(theta)
        y0 = b * rho    #代表y = r * sin(theta)
        x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
        y1 = int(y0 + 1000 * a)    #计算起始起点纵坐标
        x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
        y2 = int(y0 - 1000 * a)    #计算直线终点纵坐标    注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)    #点的坐标必须是元组,不能是列表。
    cv.imshow("image-lines", image)
 
#统计概率霍夫线变换
def line_detect_possible_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_RGB2GRAY)
    edges = cv.Canny(gray, 50, 150, apertureSize=3)  # apertureSize参数默认其实就是3
    lines = cv.HoughLinesP(edges, 1, np.pi / 180, 60, minLineLength=60, maxLineGap=5)
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
    cv.imshow("line_detect_possible_demo",image)
 
src = cv.imread(r'..\edge.jpg')
print(src.shape)
cv.namedWindow('input_image', cv.WINDOW_AUTOSIZE)
cv.imshow('input_image', src)
line_detection(src)
src = cv.imread(r'..\edge.jpg') #调用上一个函数后,会把传入的src数组改变,所以调用下一个函数时,要重新读取图片
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

3 效果 

OpenCV实现直线检测

来源:https://blog.csdn.net/u013419318/article/details/102565086

标签:OpenCV,直线检测
0
投稿

猜你喜欢

  • Python3中安装后SSL问题及解决

    2022-07-04 14:41:16
  • 99%的程序员都会收藏的书单 你读过几本?

    2022-10-01 19:45:59
  • FCKeditor的几点修改小结

    2023-05-15 22:13:09
  • 详解Mysql主从同步配置实战

    2024-01-14 16:36:13
  • 基于hashlib模块--加密(详解)

    2023-10-08 15:46:29
  • python使用cartopy库绘制台风路径代码

    2023-08-22 15:50:18
  • ASP连接SQL2005数据库连接代码

    2011-03-25 10:44:00
  • python游戏库pygame经典教程(推荐!)

    2022-10-02 06:26:11
  • Python Pyperclip模块安装和使用详解

    2023-06-25 13:52:11
  • Python将list元素转存为CSV文件的实现

    2022-03-14 20:15:00
  • 解剖JavaScript中的null和undefined

    2009-03-01 12:49:00
  • Python实现发送QQ邮件的封装

    2022-10-08 21:19:56
  • vue+AI智能机器人回复功能实现

    2024-04-27 15:49:14
  • python selenium自动上传有赞单号的操作方法

    2023-05-21 13:24:43
  • MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)问题的解决

    2024-01-26 23:19:50
  • JavaScript中使用Async实现异步控制

    2023-08-23 00:55:54
  • 网站的视觉设计

    2008-08-15 12:58:00
  • 解决mysql输入密码闪退的问题

    2024-01-21 02:29:14
  • vue3 reactive函数用法实战教程

    2023-07-02 16:37:36
  • 大数据量时提高分页的效率

    2024-01-25 09:07:37
  • asp之家 网络编程 m.aspxhome.com