Opencv霍夫直线检测

一、Opencv霍夫直线检测需要拟合吗

Opencv霍夫直线检测的基本原理是将物体上的曲线或者边缘进行检测和提取。在直线的情况下,原理是将直线的参数进行变换,转换为Hough空间的点,在Hough空间中找出在一定范围内累计值最高的点,通过反演变换,将Hough空间的点映射回到直线上,从而得到直线参数。

在使用Opencv霍夫直线检测时,通常得到的是直线的参数,可以直接使用这些参数进行绘制,而不需要拟合。但是,在某些情况下,直线可能不是完整的,可能存在断点或曲折,这时可以使用拟合的方法将多个线段拟合成一条直线。

下面是一个简单的例子,演示直接绘制霍夫直线检测的结果和拟合后的结果:

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
lines = cv.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))
    cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)

# 拟合结果
lines = cv.HoughLinesP(edges,1,np.pi/180,100,minLineLength=100,maxLineGap=10)
for line in lines:
    x1,y1,x2,y2 = line[0]
    cv.line(img,(x1,y1),(x2,y2),(0,255,0),2)

cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

二、Opencv霍夫变换检测矩形

除了检测直线,Opencv霍夫变换还可以用于检测矩形。对于矩形检测,我们可以使用霍夫变换的概率式算法,通过调整参数来检测出符合条件的矩形。

下面是一个简单的例子,演示Opencv霍夫变换用于检测矩形的结果:

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
lines = cv.HoughLinesP(edges,1,np.pi/180,20,minLineLength=30,maxLineGap=10)

# 转换为霍夫坐标系
for i in range(lines.shape[0]):
    line = lines[i][0]
    x1,y1,x2,y2 = line
    cv.line(img,(x1,y1),(x2,y2),(0,0,255),1,cv.LINE_AA)

# 检测矩形
contours, hierarchy = cv.findContours(edges, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

for i in range(len(contours)):
    cnt = contours[i]
    area = cv.contourArea(cnt)
    if area  10000:
        continue
    rect = cv.minAreaRect(cnt)
    box = cv.boxPoints(rect)
    box = np.int0(box)
    cv.drawContours(img,[box],0,(0,255,0),2)

cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

三、Opencv检测直线选取

在Opencv霍夫直线检测中,由于图像中的直线可能会非常多,因此我们需要对直线进行筛选和选取,以便于我们更加有效地分析和处理图像。

在直线的筛选中,可以根据直线的长度、角度、距离等特征进行筛选,只保留符合条件的直线。在选取直线时,可以根据直线的位置、长度、交叉情况等因素进行选择,以便于我们更好地分析图像的特征。

下面是一个简单的例子,演示如何对直线进行筛选和选取:

import cv2 as cv
import numpy as np

img = cv.imread('image.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray,50,150,apertureSize = 3)
lines = cv.HoughLinesP(edges,1,np.pi/180,20,minLineLength=30,maxLineGap=10)

# 直线的筛选和选取
h,w = img.shape[:2]
lineInfoList = []
for i in range(lines.shape[0]):
    line = lines[i][0]
    x1,y1,x2,y2 = line

    # 直线长度筛选
    length = np.sqrt((x1-x2)**2 + (y1-y2)**2)
    if length < 50:
        continue
    # 直线角度筛选
    angle = np.arctan2(y2-y1, x2-x1) * 180.0 / np.pi
    if angle  10:
        continue
    # 直线距离筛选
    distance = abs(x1-x2) + abs(y1-y2)
    if distance > 0.2*w:
        continue

    # 记录直线信息
    lineInfoList.append((x1,y1,x2,y2))

# 直线的选取
for i in range(len(lineInfoList)):
    for j in range(i+1, len(lineInfoList)):
        x1,y1,x2,y2 = lineInfoList[i]
        x3,y3,x4,y4 = lineInfoList[j]
        # 交叉情况筛选
        if (abs(x1-x3) + abs(y1-y3) + abs(x2-x4) + abs(y2-y4)) > (abs(x1-x4) + abs(y1-y4) + abs(x2-x3) + abs(y2-y3)):
            continue
        # 直线长度筛选
        length1 = np.sqrt((x1-x2)**2 + (y1-y2)**2)
        length2 = np.sqrt((x3-x4)**2 + (y3-y4)**2)
        if length1 < 50 or length2 < 50:
            continue

        # 绘制选中的直线
        cv.line(img,(x1,y1),(x2,y2),(0,0,255),2)
        cv.line(img,(x3,y3),(x4,y4),(0,0,255),2)

cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/311344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2025-01-05 13:23
下一篇 2025-01-05 13:23

相关推荐

  • 如何在PyCharm中安装OpenCV?

    本文将从以下几个方面详细介绍如何在PyCharm中安装OpenCV。 一、安装Python 在安装OpenCV之前,请确保已经安装了Python。 如果您还没有安装Python,可…

    编程 2025-04-29
  • Python OpenCV 直线检测

    本文将介绍在Python OpenCV中进行直线检测的方法,主要涉及到图像的边缘检测、霍夫变换和绘制直线等操作。 一、边缘检测 由于直线检测是从图像的边缘开始的,因此必须先找到图像…

    编程 2025-04-29
  • 如何求直线与曲线的交点

    对于数学问题来说,求直线与曲线的交点可能是其中一种最基本的问题之一。在本文中,我们将从多个方面详细阐述关于求解直线与曲线交点的方法。 一、解析几何方法 解析几何是数学中比较基础的一…

    编程 2025-04-29
  • Python编程乌龟画直线

    本文将详细介绍如何使用Python编写程序来控制乌龟画直线。 一、安装turtle库 要使用Python完成乌龟画直线的编程,需要安装turtle库。其实,在安装Python时已经…

    编程 2025-04-27
  • Python直线

    Python是一种高层次、通用、解释型、开源、动态数据类型的编程语言。它有快速、可读性强的特点,同时在数据分析、人工智能、Web开发等领域也有广泛的应用。本文将从多个方面详细阐述P…

    编程 2025-04-27
  • Opencv 实现读取 BMP 图片

    Opencv 是一个基于 C/C++ 语言的开源计算机视觉库,可以用于图像处理、特征识别、目标跟踪、机器学习等领域。在图像处理中,读取 BMP 图片是常见操作之一。 一、打开 BM…

    编程 2025-04-27
  • opencv鼠标绘图

    本文将为您详细介绍如何使用opencv在原始图片上进行鼠标绘图。 一、准备工作 在开始绘制之前,您需要先准备好以下的工作: 1、安装opencv库,可以通过pip install …

    编程 2025-04-27
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • OpenCV的全面介绍

    OpenCV是一款强大的开源计算机视觉库,它包含了各种用于图像和视频处理,图像识别和机器学习的函数,它可以用于开发实时的计算机视觉软件和系统,特别适用于图像处理、物体识别、人脸识别…

    编程 2025-04-25
  • Opencv CUDA编译用法介绍

    本文将从多个方面对Opencv CUDA编译进行详细的阐述和解读。通过以下小标题,我们将详细介绍如何进行编译。 一、环境搭建 在使用CUDA进行加速之前,需要进行CUDA的环境搭建…

    编程 2025-04-25

发表回复

登录后才能评论