图解 cv2.HoughLines & cv2.line 参数原理

这篇具有很好参考价值的文章主要介绍了图解 cv2.HoughLines & cv2.line 参数原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能实现:利用cv.HoughLines寻找图像中霍夫直线,然后用cv2.line绘制红色的直线。

拓展:计算整幅图像的平均灰度值,以及经过筛选的霍夫直线的平均灰度值,并进行比较。

目录

一、效果图以及参数讲解 

二、图解霍夫直线的返回参数

三、源码(包含注释)

四、拓展


一、效果图以及参数讲解 

图解 cv2.HoughLines & cv2.line 参数原理 图1 原图

图解 cv2.HoughLines & cv2.line 参数原理

 图2 边缘处理后的图像

图解 cv2.HoughLines & cv2.line 参数原理

图3 绘制红色霍夫直线的图像 

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

  • image_edge:经过图像边缘处理后的图像
  • 1:像素之间的距离为1
  • np.pi/180:直线角度范围,2pi/(pi/180) = 360°
  • 180:一条预选直线上的最少像素点个数

注意:

如果距离是1,180个像素即可生成直线,如果距离是2,至少360个像素才可以生成直线。

cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1) 

  • img:在图像img上绘制直线
  • (x1, y2)、(x2, y2):直线的两个端点,直接相连便可得到所需直线
  • (0, 0, 255):红色
  • 1:设置直线的宽度为1

注意:

直线的两个端点可以是负数。

二、图解霍夫直线的返回参数

cv2.HoughLines 的返回参数 line ==  ,其中,第一个参数表示图像原点距离直线的长度,第二个参数表示沿着x轴的角度大小。

如下图所示,首先通过 cv.HoughLines 得到 line ,此时已经确定了直线的位置,然后需要确定直线上的两个坐标点来充当 cv.line 的输入参数,最后,在源图像上通过 cv.line 来绘制红色直线。

图解 cv2.HoughLines & cv2.line 参数原理

 图4 图解cv2.HoughLines的返回参数

        # 延长直线的长度,保证在整幅图像上绘制直线
        x1 = int(x0 + 2000 * (-b))
        y1 = int(y0 + 2000 * (a))
        x2 = int(x0 - 2000 * (-b))
        y2 = int(y0 - 2000 * (a))

前面讲到, 霍夫直线值仅仅返回两个参数,并不会直接返回直线上的坐标点,我们在选取直线坐标点的时候,需要尽量选取图像外部的点(即负数),这样才会过整幅图像绘制直线。

三、源码(包含注释)

import cv2
import numpy as np
from numpy import mean


# 读取图像以及图像的宽和高
img = cv2.imread('./img.png')
h = img.shape[0]
w = img.shape[1]

# 求取图像的平均灰度值
img_gray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)
all_gray = []
for i in range(h):
    for j in range(w):
        all_gray.append(img_gray[i, j])
print('图像的平均灰度值:', mean(all_gray))

# Canny算子寻找图像的边缘
image_edge = cv2.Canny(img, 200, 200)

# 寻找霍夫直线
lines = cv2.HoughLines(image_edge, 1, np.pi/180, 180)

# 绘画霍夫直线
if lines is not None:
    for n, line in enumerate(lines):
        # 沿着左上角的原点,作目标直线的垂线得到长度和角度
        rho = line[0][0]
        theta = line[0][1]
        # if np.pi / 3 < theta < np.pi * (3 / 4):
        a = np.cos(theta)
        b = np.sin(theta)
        # 得到目标直线上的点
        x0 = a * rho
        y0 = b * rho

        # 延长直线的长度,保证在整幅图像上绘制直线
        x1 = int(x0 + 2000 * (-b))
        y1 = int(y0 + 2000 * (a))
        x2 = int(x0 - 2000 * (-b))
        y2 = int(y0 - 2000 * (a))

        # 连接两点画直线
        # print((x1, y1), (x2, y2))  # (-148, 993) (335, -947)
        cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 1)

        # ===============================CAB================================ #
        xDis = x2 - x1  # x的增量
        yDis = y2 - y1  # y的增量
        if (abs(xDis) > abs(yDis)):
            maxstep = abs(xDis)
        else:
            maxstep = abs(yDis)
        xUnitstep = xDis / maxstep  # x每步骤增量
        yUnitstep = yDis / maxstep  # y的每步增量
        x = x1
        y = y1
        average_gray = []
        for k in range(maxstep):
            x = x + xUnitstep
            y = y + yUnitstep
            # print("x: %d, y:%d" % (x, y))
            if 0 < x < h and 0 < y < w:
                # print(img_gray[int(x), int(y)])
                average_gray.append(img[int(x), int(y)])
        print('第{}霍夫直线的平均灰度值:'.format(n), mean(average_gray))  # 平均115,阴影的边界在125以上,堵料的边界在105左右
        # ================================================================== #

    print('直线的数量:', len(lines))
else:
    print('直线的数量:', 0)

# 可视化图像
cv2.imshow('0', img)
cv2.imshow('1', image_edge)
cv2.waitKey(0)

四、拓展

因项目的需求,需要比对霍夫直线和整幅图像的平均灰度值的大小关系,所以在上面的源码中,我把此项功能加入到其中,希望对你有所帮助。


>>> 如有疑问,欢迎评论区一起探讨。文章来源地址https://www.toymoban.com/news/detail-405980.html

到了这里,关于图解 cv2.HoughLines & cv2.line 参数原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cv2.line使用报错【已解决】error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function ‘line‘ > Overload

    cv2.line: image = cv2.line(image, 直线起点坐标, 直线终点坐标, 颜色, 粗细) 使用cv2.line时,报告了如下错误 error提示索引为1的参数类型错误,即(weigh, right_y), (0, left_y) 通过打印发现weigh、right_y、left_y数据类型为float 将数据类型修改为int后不在报错

    2024年02月11日
    浏览(51)
  • cv2.drawContours的参数

    cv2.drawContours() 函数有以下参数: image:输入图像,一般是二值图像或彩色图像; contours:要绘制的轮廓,是一个 Python 列表,每个列表元素都是一个 Numpy 数组,代表一个轮廓; contourIdx:要绘制的轮廓的索引,默认为 -1,代表绘制所有轮廓; color:轮廓的颜色,是一个三元组

    2024年02月14日
    浏览(79)
  • cv2.videocapture.read()参数

    cv2.videocapture.read()是OpenCV库中读取视频文件的函数,其参数为一个可选的参数,用于指定读取视频文件时的参数。该参数是一个整数类型的值,可以为以下值之一: 0: 默认参数,表示从第一个可用的摄像头中读取视频流。 1: 表示从第二个可用的摄像头中读取视频流。 字符串

    2024年02月16日
    浏览(39)
  • 复现路上的花开花落(2)cv2.error: OpenCV(4.6.0) :-1: error: (-5:Bad argument) in function ‘line‘

    复现complex yolo 运行检测程序报错 原因:类型出错 解决办法: 第一种:将报错语句中所有能改类型的值全加上int强制转成整型 第二句更正为: 第二种:opencv-python版本过高导致,降低版本 参考别的博主,从4.6.0降下来,亲测该版本可行 参考链接: 无法解析“pt1”。索引为

    2024年02月16日
    浏览(49)
  • 在python中,cv2.calibrateCamera包含哪些输入参数和输出参数

    在 Python 中, cv2.calibrateCamera 函数是用于相机标定的函数。以下是该函数的主要参数和返回值: retval, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvecs, tvecs, flags, criteria)   输入参数: objectPoints : 一个包含每个棋盘格图像的物理

    2024年03月24日
    浏览(42)
  • 【OpenCV】仿射变换中cv2.estimateAffine2D 的原理

    目录 一、介绍 二、仿射变换矩阵 (M) 1.M中六个元素的说明 2.计算旋转角度 3.M的计算过程 三、输出状态 (inliers) 四、错切参数 1.错切参数的定义 2.错切参数例子 (1)水平错切 (2)垂直错切         cv2.estimateAffine2D 是 OpenCV 库中的一个函数,用于估计两个二维点集之间的

    2024年02月04日
    浏览(48)
  • opencv 进阶10-人脸识别原理说明及示例-cv2.CascadeClassifier.detectMultiScale()

    人脸识别是指程序对输入的人脸图像进行判断,并识别出其对应的人的过程。人脸识别程 序像我们人类一样,“看到”一张人脸后就能够分辨出这个人是家人、朋友还是明星。 当然,要实现人脸识别,首先要判断当前图像内是否出现了人脸,也即人脸检测。只有检 测到图像

    2024年02月09日
    浏览(53)
  • 第一篇【传奇开心果短博文系列】Python的库OpenCV技术点案例示例:cv2常用功能和方法

    cv2是Python中常用的第三方库,也称为OpenCV库,用于图像处理和计算机视觉任务。它提供了许多功能和方法,可以读取、处理和显示图像,以及执行各种图像处理操作。 以下是cv2库的一些常用功能和方法的介绍: 读取和显示图像: 保存图像: 转换图像颜色空间: 裁剪和调整

    2024年01月23日
    浏览(54)
  • cv2.approxPolyDP函数实现轮廓线的多边形逼近

            实际项目需要拟合轮廓线,提取更贴合目标的四个点,于是找到了cv2.approxPolyDP函数。cv2.approxPolyDP() 使用了Douglas-Peucker算法,算法原理如下: 输入一组曲线点集合S,输出折线点集合T流程:         step1、设阈值thresh,取A的起点A和终点B加入T;         st

    2023年04月13日
    浏览(94)
  • opencv视频截取每一帧并保存为图片python代码CV2实现练习

    当涉及到视频处理时,Python中的OpenCV库提供了强大的功能,可以方便地从视频中截取每一帧并将其保存为图片。这是一个很有趣的练习,可以让你更深入地了解图像处理和多媒体操作。 使用OpenCV库,你可以轻松地读取视频文件,并在循环中逐帧读取视频的每一帧。随后,你可

    2024年02月12日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包