基于Python OpenCV、使用霍夫变换的小车视觉循线识别

这篇具有很好参考价值的文章主要介绍了基于Python OpenCV、使用霍夫变换的小车视觉循线识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        近期在做一个小车视觉循线的项目。小车将沿着一条线行驶,并用自带的摄像头拍摄道路前方的道路,行驶过程会遇到钝角拐弯、弧线拐弯、直角拐弯这些特殊元素,小车需要在识别元素之后进行合理地转弯。

        在网上看到大部分的循线方法主要是二值化之后遍历图像中的所有像素点然后求亮白色像素点的横坐标平均值,把平均值和图像中心值做差求出小车的偏移量,再控制小车的运动。这样的方法需要用二重for循环遍历捕获图像的所有像素点,效率低下。经过本人的一位学长的点拨,本人遂决定采用霍夫变换的方法进行循线识别。

python小车寻线,副业——视觉,python,opencv,计算机视觉,人工智能,开发语言

                                                                                                                   (图片来自网络,侵删)

思路:

1、首先,要选择正确的识别区域。小车前方的一块区域是小车即将到达的地方,而其他区域大都对识别没有作用。所以,我们要ROI选取选择合适的区域,来提高识别效率。

2、之后,对图像进行初步处理。这里,本人先将凸显变为灰度图像,然后进行大津法的二值化,最后采用高斯滤波。大津法的二值化能够根据图像的具体亮度分布来决定阈值,能够很好地把需要识别的白线分离出来而剔除干扰元素;高斯滤波能够使图像变得平滑,使接下来霍夫变换更加精准。

3、接下来便是霍夫变换了。先把上一步得到的图像进行Canny边缘检测,之后采用霍夫变换函数读取图像中的线段。注意这里要使用概率霍夫变换,否则得出的结果都是直线而非线段,无法得出偏差值。在这之后,我们就会得到所有线段始末两点的横纵坐标。

4、读取这些坐标以后,我们需要两个量:线段的平均偏移量和斜率接近于0的线段数量。前者用于检测小车的偏移情况,否则则用于检测是否有直角弯道。我们可以在用for循环遍历所有线段始末两点的坐标之后,用横坐标累加值除以运算的点的总数再减去图像中心横坐标得出平均偏移量,用斜率计算公式[(y1-y2)/(x1-x2)]检测线段是否水平或接近水平、统计这样的线段数量。

5、最后进行判断:如果水平线段的数量大于0,则说明小车遇到了直角弯道;否则没有遇到直角弯道,小车应当按照偏移量的情况进行打角转弯

 这边附上一段用于检测一帧图像的代码。文章来源地址https://www.toymoban.com/news/detail-596743.html

import cv2
import numpy as np
import matplotlib.pyplot as plt
import pylab

def midsearch():
    img = cv2.imread("pic", -1)                                                   #导入图片,参数请自行修改
    h,w,c= img.shape

    mid=img[int(h*0.7):int(h),int(0.25*w):int(0.75*w)]                            #ROI选区,选择图像前面的一块区域
    hm, wm, cm = mid.shape  
    gray = cv2.cvtColor(mid, cv2.COLOR_BGR2GRAY)                                  #设置图像为灰度图
    ret, gray = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)  #大津法二值化
    gray = cv2.medianBlur(gray, 11)                                                #高斯滤波
    edges = cv2.Canny(gray, 50, 150, apertureSize=3)
    orgb = cv2.cvtColor(mid, cv2.COLOR_BGR2RGB)
    oShow = orgb.copy()
    lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 1, minLineLength=100, maxLineGap=60)#边缘检测之后霍夫变换得出直线
    fn=0
    n=0
    tan=1.0
    T=0.0
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(orgb, (x1, y1), (x2, y2), (255, 0, 0), 5)
        n+=2;
        fn+=x1
        fn+=x2
        if x1!=x2:
            tan=(y1-y2)/(x1-x2)
            if abs(tan)<0.1 and abs(x1-x2)>0.1*wm:
                    T+=1
        else:
            tan=1                                       #通过检测直线斜率检测是否遇到直角
    average=fn/n
    delta=average-wm/2
    # print(T)
    # print(delta)
    # print(average)
    # plt.subplot(121)
    # plt.imshow(oShow)
    # plt.axis('off')
    # plt.subplot(122)
    # plt.imshow(orgb)
    # plt.axis('off')
    # pylab.show()
    return delta,T

def midjudge(delta,T):
    #直角判断
    if delta>0 and T>=1:#右直角
        print("右直角")
    elif delta<0 and T>=1:#左直角
        print("左直角")
    else:
    #正常行驶,包括钝角以及圆弧的转弯
        if abs(delta)<=10:
            print("直行")
        elif delta>10:
            print("右转弯")
        elif delta<-10:
            print("左转弯")


delta,T=midsearch()
midjudge(delta,T)
cv2.waitKey(0)
cv2.destroyAllWindows()

到了这里,关于基于Python OpenCV、使用霍夫变换的小车视觉循线识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • OpenCV——霍夫变换圆检测

        HoughCircles 该函数使用霍夫变换在灰度图像中查找圆。 image :输入图像,需要为 8 位的灰度单通道图像。 circle :找到的圆的输出向量。每个向量被编码为3或4个元素的浮点型向量 ( x , y , r a d i u s ) (x, y, radius) ( x , y , r a d i u s ) 或 ( x , y , r a d i u s , v o t e s ) (x, y, radius,

    2024年02月13日
    浏览(40)
  • OpenCV | 霍夫变换:以车道线检测为例

    霍夫变换 霍夫变换只能灰度图,彩色图会报错 lines = cv2.HoughLinesP(edge_img,1,np.pi/180,15,minLineLength=40,maxLineGap=20) 参数1:要检测的图片矩阵 参数2:距离r的精度,值越大,考虑越多的线 参数3:距离theta的精度,值越大,考虑越多的线 参数4:累加数阈值,值越小,考虑越多的线

    2024年02月04日
    浏览(42)
  • 霍夫变换直线检测算法实现OpenCV(C++)

    一、原理 对于霍夫变换的原理这里就不进行描述啦,感兴趣的可以自行搜索。也可以看知乎上面的这篇贴文通俗易懂理解——霍夫变换原理。 二、算法代码 三、效果测试 测试代码 上述代码中的drawLine()函数是《OpenCV4快速入门》一书的代码清单 7-2中的原函数,只用于画线。

    2024年02月05日
    浏览(46)
  • OpenCV26HoughCircles 霍夫圆变换原理及圆检测

    霍夫圆变换的基本原理与霍夫线变换大体类似 对直线来说,一条直线能由极径极角(r,θ)表示,而对于圆来说,我们需要三个参数:圆心(a,b),半径 r 笛卡尔坐标系中圆的方程为: (x-a)2 + (y-b)2 = r2 化简便可得到: a = x - r·cosθ b = y - r·sinθ 对于(x0,y0),我们可以将通

    2024年02月03日
    浏览(42)
  • OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    🌎上一节我们介绍了OpenCV中傅里叶变换和模板匹配,这一部分我们来聊一聊霍夫线/圈变换的原理和应用、使用分水岭算法实现图像分割和使用GrabCut算法实现交互式前景提取 🏠哈喽大家好,这里是ErrorError!,一枚某高校大二本科在读的♂同学,希望未来在机器视觉领域能够有

    2023年04月08日
    浏览(49)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(68)
  • 基于Python+OpenCV的手势识别系统:智能家居和智能小车的灯光控制

    基于python+opencv的手势识别系统,可控制灯的亮度,智能家居,智能小车。 基于python+opencv的手势识别系统软件。 内含svm模型,和肤色识别,锐化处理。 基于 win10+Python3.7的环境,利用Python的OpenCV、Sklearn和PyQt5等库搭建了一个较为完整的手势识别系统,用于识别日常生活中1-1

    2024年04月15日
    浏览(57)
  • 树莓派视觉小车 -- OpenCV巡线(HSL色彩空间、PID)

    目录 试错 试错1:形态学处理 试错2:HSV色彩空间 基础理论 1、HSV与HSL色彩空间 2、PID调节 一、OpenCV图像处理 1、在HSL色彩空间下得到二值图 2、 对二值图形态学处理 3、找出线的轮廓和中心点坐标 二、PID 三、运动控制 总代码 一开始用的形态学处理,自行改变阈值,调试之后

    2024年02月04日
    浏览(39)
  • 第16章:霍夫变换

    霍夫变换是一种在图像中寻找直线、圆形以及其他简单形状的方法。 霍夫变换采用类似于投票的方式来获取当前图像内的形状集合,该变换由Paul Hough(霍夫)于1962年首次提出。 最初的霍夫变换只能用于检测直线,经过发展后,霍夫变换不仅能够识别直线,还能识别其他简单的

    2024年02月04日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包