【计算机视觉】【图像处理综合应用】路沿检测

实验内容:针对给定的视频,利用图像处理基本方法实现道路路沿的检测;

提示:可利用Hough变换进行线检测,融合路沿的结构信息实现路沿边界定位(图中红色的点位置)。

处理视频文件

处理视频文件的主要流程如下:

读取视频逐帧提取路沿检测逐帧保存输出视频

用python的OpenCV实现视频文件的处理,用videoCapture打开视频文件,读取每一帧进行处理,然后用videoWriter保存成视频。

路沿检测

路沿检测的流程如下:

图像预处理边缘检测Hough变换

图像预处理

灰度化

从视频中取出的每一帧是彩色图像,我们可以先将它变成灰度图像,即将图像中的每个像素的RGB值(红、绿、蓝)转换为一个单一的灰度值。

image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

灰度图像只包含亮度信息,如图1所示,而不包含颜色信息。这样可以简化图像,提高处理速度,突出图像的结构,减少噪声干扰。

图1

均衡化

我们再将图像均衡化,python代码如下。

image = cv2.equalizeHist(image)

图像均衡化可以提高图像的对比度,如图2所示,突出图像的细节轮廓与边缘。

 

图2

二值化

将灰度图转换为只有黑白两种颜色的图像,python代码如下。

image = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

图像二值化可以简化图像信息,突出物体的轮廓,如图3所示。

图3

边缘检测

Canny边缘检测

Canny 边缘检测算法是John F.Canny于1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的最优算法, 最优边缘检测的三个主要评价标准是:

低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。

高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。

最小响应: 图像中的边缘只能标识一次。

Canny边缘检测算法步骤如下:

高斯滤波去噪计算梯度幅值和方向非极大值抑制双阈值处理

高斯滤波器去除噪声

使用高斯滤波器对图像进行平滑处理,以减少噪声的影响。

计算梯度幅值和方向

按照Sobel算子,运用一对卷积阵列 (分别作用于 x 和 y 方向):

使用下列公式计算梯度幅值和方向:

梯度方向近似到四个可能角度之一(一般 0, 45, 90, 135)。

非极大值抑制

沿边缘垂直方向寻找梯度最大值,排除非边缘像素, 仅仅保留了一些细线条(候选边缘)。

双阈值处理

如果某一像素位置的幅值超过高阈值, 该像素被保留为边缘像素。

如果某一像素位置的幅值小于低阈值, 该像素被排除。

如果某一像素位置的幅值在两个阈值之间,该像素仅仅在连接到一个高于高阈值的像素时被保留。

在python中使用canny对图像进行边缘检测,高阈值为175,低阈值为75。

image = cv2.Canny(image, 75, 175)

效果如图4所示,可见canny算法可以有效的提取图像的边缘信息。

图4

但是canny检测出来的边缘中噪声比较多,我们再使用高斯滤波器模糊一下图像,在python中使用5×5的高斯滤波器模糊图像。

image = cv2.GaussianBlur(image, (5, 5), 0)

效果如图5所示,可见高斯滤波器模糊成功地去掉了一些噪声。

图5

Hough变换

Hough变换是一种用于检测图像中几何形状的技术,将图像由图像空间变换为参数空间。它最初是由保罗·霍夫(Paul Hough)在1962年提出的,用于在图像中检测直线。后来,这个方法被扩展到检测其他几何形状,如圆和椭圆。

一条直线在图像二维空间可由两个变量表示,在笛卡尔坐标系中直线可由参数斜率k和截距b表示y=kx+b,在极坐标系中可由参数极径r和极角θ表示。

对于霍夫变换, 我们将用极坐标系来表示直线,因此直线的表达式可为:

图像空间中的一条线对应Hough空间中的一个点。

图像空间中的一个点对应Hough空间中的一条线。

Hough变换的基本思想是将图像中的像素点映射到参数空间中,并通过在参数空间中寻找峰值来检测几何形状。对于直线检测,参数空间通常是极坐标空间,其中每个像素点在参数空间中对应一条直线。通过遍历图像中的像素点,可以累加参数空间中相应的位置,从而构建一个累加器数组。然后,在累加器数组中找到峰值,这些峰值对应于图像中存在的直线。

Hough变换步骤:

离散化θ,θ=-45,0,45,90度。

按照点的坐标(x,y)和每个角度θ求极半径r:

统计(r,θ)出现的次数

最大次数3出现在(2,0°)和(3,90°),则对应的图像空间的线为x=2和y=3。

Hough变换的优点是它对于噪声和图像变形具有一定的鲁棒性。它可以检测到不完整的、部分可见的或被噪声干扰的几何形状。因此,Hough变换在计算机视觉领域中广泛应用于图像分析、目标检测和特征提取等任务。

标准霍夫线变换

提供一组参数对 (θ, rθ) 的集合来表示检测到的直线,在OpenCV 中通过函数 HoughLines来实现。

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

统计概率霍夫线变换

这是执行起来效率更高的霍夫线变换. 它输出检测到的直线的端点 (x0, y0, x1, y1)。在OpenCV 中它通过函数 HoughLinesP来实现。

lines = cv2.HoughLinesP(edge, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=1)

Hough线变换应用路沿检测

本次我们采用标准Hough线变换来检测路沿,经过多次测试和调参,我们最后采用高斯模糊进行图像预处理,然后使用canny进行边缘提取,最后使用Hough线变换绘制直线。

def detect(image):

    gauss = cv2.GaussianBlur(image, (5, 5), 0)

    edge = cv2.Canny(gauss, 75, 175)

    # 进行Hough直线变换

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

视频检测效果

第一个视频是一个静止不动的路沿,检测效果如图6所示。

图6

第二个视频中,路沿开始变化起来,检测效果如图7所示。

第三个视频中出现了转弯,检测效果如图8所示,因为我们只做了线变化,因此对于路沿弯曲的部分只能画出直线部分。

图8

代码

import cv2
import numpy as np


def detect(image):
    gauss = cv2.GaussianBlur(image, (5, 5), 0)
    edge = cv2.Canny(gauss, 75, 175)
    # 进行Hough直线变换
    lines = cv2.HoughLines(edge, 1, np.pi / 180, 220)
    # 绘制检测到的直线
    if lines is not None:
        for rho, theta in lines[:, 0, :]:
            if theta < 2:
                continue
            a = np.cos(theta)
            b = np.sin(theta)
            x0 = a * rho
            y0 = b * rho
            x1 = int(x0 - 350 * (-b))
            y1 = int(y0 - 350 * a)
            x2 = int(x0 - 700 * (-b))
            y2 = int(y0 - 700 * a)
            cv2.line(image, (x1, y1), (x2, y2), (0, 255, 0), 4)
    return image


video = cv2.VideoCapture('Task2/03.avi')  # 打开视频文件
# 获取视频的宽度和高度以及帧率信息
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = video.get(cv2.CAP_PROP_FPS)
# 创建VideoWriter对象,用于保存处理后的视频
videoWriter = cv2.VideoWriter('Task2/video3.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
while True:
    have, frame = video.read()  # 读取当前帧
    if have:
        frame = detect(frame)  # 在这里对每一帧进行处理
        videoWriter.write(frame)  # 将处理后的帧写入输出视频文件
    else:
        break
video.release()  # 释放资源
videoWriter.release()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191353.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Nginx(资源压缩)

建立在动静分离的基础之上&#xff0c;如果一个静态资源的Size越小&#xff0c;那么自然传输速度会更快&#xff0c;同时也会更节省带宽&#xff0c;因此我们在部署项目时&#xff0c;也可以通过Nginx对于静态资源实现压缩传输&#xff0c;一方面可以节省带宽资源&#xff0c;第…

GPT4测试 — 答题能力及文档处理能力

创建gdp.txt文件&#xff08;使用word 2013创建的文档测试了也可以&#xff0c;WPS建的不行&#xff09; 上传文件&#xff0c;输入prompt: 请帮我答题&#xff0c;把那个正确答案的选项的字母序号填在&#xff08;&#xff09;中&#xff0c;并返回文件blabla… 给我一个文件…

第二十三章 解析PR曲线、ROC曲线、AUC、AP(工具)

混淆矩阵Confusion Matrix 混淆矩阵定义 混淆矩阵是机器学习中总结分类模型预测结果的情形分析表&#xff0c;以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值&#xff0c;矩阵的列表示预测值&#xff0c;下面我…

可燃气体监测仪助力燃气管网安全监测,效果一览

城市地下管线是指城市范围内供应水、排放水、燃气等各类管线及其附属设施&#xff0c;它们是保障城市正常运转的重要基础设施且影响着城市生命线。其中燃气引发的事故近些年不断增加&#xff0c;由于燃气管线深埋地下环境复杂&#xff0c;所以仅仅依赖人工巡查难以全面有效地防…

PCIE链路训练-状态机描述3

Configuration.Idle 1.当使用8b/10b编码时&#xff0c;non-flit模式下&#xff0c;在所用配置的lane上发送s Idle data Symbols&#xff0c;在flit mode下发送IDLE flit。 2.linkup 0 link两端的component均支持64.0GT/s的速率&#xff0c;根据进入此状态之前发送的8个TS2或…

2023/11/26总结

一些学习记录&#xff1a; 在对数据库进行一系列操作的时候&#xff0c;遇到一个问题&#xff0c;在插入数据的时候&#xff0c;我数据库对应的是自增id&#xff0c;但是插入后想获取到这个id去使用。我以为是不可以马上获取的&#xff0c;然后看到 项目进度 购物车&#xff…

springboot核心原理之@SpringbootApplication

1.SpringbootApplication Configuration标志的类 在spring ioc启动的时候就会加载创建这个类对象 EnableAutoConfiguration 中有两个注解 &#xff08;1&#xff09;AutoConfigurationPackage 扫描主程序包(主程序main所在包及其子包) 可以看到这个类 &#xff1a; static c…

Ubuntu:安装VSCode

参考博客Ubuntu下安装VSCODE_ubuntu安装vscode-CSDN博客中的第二种方式【安装包方式安装】&#xff0c;即可&#xff0c;安装非常easy~~~ 安装包方式安装&#xff1a; 1. 从VSCode官网下载最新版的deb安装包&#xff1a; https://code.visualstudio.com/Download&#xff0c;…

【论文解读】Real-ESRGAN:使用纯合成数据训练真实世界的超分辨率图像

图一是4种超分方法的对比效果 。 0 摘要 尽管在盲超分辨率方面已经进行了许多尝试&#xff0c;以恢复具有未知和复杂退化的低分辨率图像&#xff0c;但它们仍然远远不能解决一般的真实世界退化图像。在这项工作中&#xff0c;我们将强大的 ESRGAN 扩展到一个实际的恢复应用程序…

85基于Matlab的交通设施识别

基于Matlab的交通设施识别。 GUI设计图像处理, 基于数字图像处理&#xff0c;设计实现一个自然场景下公路交通限速标志分割和识别的程序。要求系统具有界面&#xff0c;并实现以下功能&#xff1a; 1&#xff09;读入自然场景下包含交通标志的图像&#xff1b; 2&#xff09;对…

Java多线程并发中部分不并发的问题

写Java实验发现个有意思的问题 三个线程&#xff0c;一个线程打印字符a&#xff0c;一个线程打印字符b&#xff0c;另一个线程打印数字&#xff0c;多次运行结果都是先打印混合输出的ab&#xff0c;完了再打印数字 有图有真相&#xff0c;我运行了10次 完整的代码是这个 clas…

win10下载Remix IDE桌面版以及空白页面的解决

文章目录 Remix IDE 的下载Remix IDE 空白页面的解决 Remix IDE 的下载 到 github 地址 https://github.com/ethereum/remix-desktop/releases 选择exe文件或根据自己电脑版本选择对应的zip文件进行下载&#xff0c;然后正常安装即可。 Remix IDE 空白页面的解决 有时打开Remix…

7 通用数字量输入输出GPIO

文章目录 7.0 GPIO概念7.1 GPIO工作原理7.2 GPIO寄存器以及编程7.2.5 GPIO寄存器编程设置与应用 7.3 GPIO跑马灯7.3.1 LED 输出初始化7.3.2 跑马灯输出实验7.3.3 按键输入实验 7.0 GPIO概念 GPIO&#xff08;general purpose intput output&#xff09;是通用输入输出端口的简…

记一次Kotlin Visibility Modifiers引发的问题

概述 测试环境爆出ERROR告警日志java.lang.IllegalStateException: Didnt find report for specified language&#xff0c;登录测试环境ELK查到如下具体的报错堆栈日志&#xff1a; java.lang.IllegalStateException: Didnt find report for specified language at com.aba.…

7000字详解 动态代理(JDK动态代理 CGLIB动态代理)与静态代理

代理模式 1. 代理模式 概念2. 静态代理3. 动态代理3.1.JDK动态代理3.2.CGLIB动态代理3.3. JDK动态代理和CGLIB动态代理区别 4.静态代理和动态代理区别5.篇末 1. 代理模式 概念 代理模式是一种设计模式。 使用代理对象来替代真实对象&#xff0c;用代理对象去访问目标对象。这样…

笔记(三)maxflow push relabel与图像分割

笔记&#xff08;三&#xff09;maxflow push relabel与图像分割 1. Push-Relabel算法思想2.Push-Relabel算法原理示意图3.Push-Relabel算法具体实例4. push relabel与图割 1. Push-Relabel算法思想 对于一个网络流图: 该算法直观可以这样理解&#xff0c;先在源节点处加入充足…

WordPress无需插件禁用WP生成1536×1536和2048×2048尺寸图片

我们在使用WordPress上传图片媒体文件的时候&#xff0c;是不是看到媒体库中有15361536和20482048的图片文件&#xff0c;当然这么大的文件会占用我们的服务器空间&#xff0c;如何禁止掉呢&#xff1f; function remove_default_image_sizes( $sizes) {unset( $sizes[1536x15…

人力资源管理后台 === 组织架构

目录 1.组织架构-树组件应用 2.组织架构-树组件自定义结构 3.组织架构-获取组织架构数据 4.组织架构-递归转化树形结构 5.组织架构-添加子部门-新建弹层组件 6.组织架构-添加子部门-表单结构 7.组织架构-添加子部门-表单基本校验 8.组织架构-添加子部门-表单业务校验 9…

ATK-ESP8266 WIFI模块串口通信通用实现方案

ATK-ESP8266 WIFI模块是一种常用的无线模块&#xff0c;它可以通过串口与外部设备进行通信&#xff0c;实现数据的收发和控制。本文将介绍一种通用的实现方案&#xff0c;帮助您在项目中使用ATK-ESP8266 WIFI模块进行串口通信。 【方案概述】 这个通用实现方案涵盖了ATK-ESP82…

VMWare虚拟机ubuntu克隆打不开

ubuntu克隆打不开 复制的存有ubuntu克隆的文件夹&#xff0c;导入vmware打不开 说找不到这个文件&#xff0c;那就到目录把它的删掉 的删掉 换000001.vmdk后缀的