基于OpenCV的巡线小车多赛道识别

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

对摄像头拍摄到的多赛道进行检测并输出每条赛道的角度和中点坐标

运行结果:

基于OpenCV的巡线小车多赛道识别,python,opencv,Powered by 金山文档

下面的代码都有注释

下面函数是先对整个画面进行扫描,选取合适的色块并排列得到他们的面积和对应的索引

def FindRoad():#在这里面寻找面积最大的4目标没有意义,这里我们主要用到的是没有找到目标时返回的结果
    area2 = []
    b = []
    Inf = -1
    if len(contour1) >= 1:                             #找到目标至少为一
        for i in range(len(contour1)):
            if cv2.contourArea(contour1[i])>50:
                area2.append(cv2.contourArea(contour1[i]))  #将找到目标面积储存到area2
        if len(area2)!=0:
            for j in range(4):   #只对前4个最大的面积进行操作
                b.append(area2.index(max(area2)))           #把目标按照面积大小从大到小存入列表b
                area2[area2.index(max(area2))] = Inf        #把刚刚存入列表的面积重新赋值为-1
        else:
            return 1

        b.sort()   #因为目标赛道检测到的面积有可能并不是按照顺序排列,所以在这里进行排列
        return b
    else:
        return 1

设置判断赛道之间的间距,根据的是得到的赛道边缘的横坐标

def JudgeRoad(n):
    s = []
    try:
        if n[2]-n[1]!=n[1]-n[0]:
            s.append(n[1])                    #列表s储存赛道边缘位置横坐标
        else:
            s.append(min(n))
        try:
            for i in range(len(n)):
                if n[i + 1] - n[i] >= 50:  #赛道的间距>50
                    s.append(n[i])
                    s.append(n[i + 1])
                if i==len(n)-2:
                    if n[len(n)-1] - n[len(n)-2]<5:
                        s.append(n[len(n)-1])
                        break
                    else:
                        s.append(n[len(n)-2])
                        break
        except:
            pass
        return s                   #返回赛道横坐标列表
    except Exception :
        return 1                   #错误时一定要返回值
        pass

计算赛道的角度

def calc_angle(x1,y1,x2,y2):
    angle = 0
    k = 0
    h = 0
    y = y1-y2
    x = x1-x2
    if x == 0:
        pass
    else:
        k = y/x
        h = math.atan(k)
        angle = 90 - abs(math.degrees(h))
    return angle

完整代码:文章来源地址https://www.toymoban.com/news/detail-557570.html

import cv2
import numpy as np
import math

# cap = cv2.VideoCapture('C:/Users/K2095/Desktop/777.mp4')(这是我提前拍摄的模拟小车运行时摄像头的画面)
cap = cv2.VideoCapture(0)

def FindRoad():
    area2 = []
    b = []
    Inf = -1
    if len(contour1) >= 1:                             #找到目标至少为一
        for i in range(len(contour1)):
            if cv2.contourArea(contour1[i])>50:
                area2.append(cv2.contourArea(contour1[i]))  #将找到目标面积储存到area2
        if len(area2)!=0:
            for j in range(4):   #只对前4个最大的面积进行操作
                b.append(area2.index(max(area2)))           #把目标按照面积大小从大到小存入列表b
                area2[area2.index(max(area2))] = Inf        #把刚刚存入列表的面积重新赋值为-1
        else:
            return 1
        b.sort()   #因为目标赛道检测到的面积有可能并不是按照顺序排列,所以在这里进行排列
        return b
    else:
        return 1

def JudgeRoad(n):
    s = []
    try:
        if n[2]-n[1]!=n[1]-n[0]:
            s.append(n[1])                    #列表s储存赛道边缘位置横坐标
        else:
            s.append(min(n))
        try:
            for i in range(len(n)):
                if n[i + 1] - n[i] >= 50:  #赛道的间距>50
                    s.append(n[i])
                    s.append(n[i + 1])
                if i==len(n)-2:
                    if n[len(n)-1] - n[len(n)-2]<5:
                        s.append(n[len(n)-1])
                        break
                    else:
                        s.append(n[len(n)-2])
                        break
        except:
            pass
        return s                   #返回赛道横坐标列表
    except Exception :
        return 1                   #错误时一定要返回值
        pass

def calc_angle(x1,y1,x2,y2):
    angle = 0
    k = 0
    h = 0
    y = y1-y2
    x = x1-x2
    if x == 0:
        pass
    else:
        k = y/x
        h = math.atan(k)
        angle = 90 - abs(math.degrees(h))
    return angle

while True:
    success , img = cap.read()
    img = cv2.resize(img, (640, 480))
    imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    lowerblack = np.array([0, 0, 0])
    upperblack = np.array([255, 255, 120])
    maskblack = cv2.inRange(imgHSV, lowerblack, upperblack)
    contour1, hierarchy1 = cv2.findContours(maskblack, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    color = maskblack[380]                          #遍历掩膜第380行全部像素值
    color2 = maskblack[420]

    blackindex = np.where(color == 255)                      #储存像素为255的索引值
    blackindex2 = np.where(color2 == 255)
    npindex = np.array(blackindex)
    npindex2 = np.array(blackindex2)
    a = npindex.ravel()                                 #将数组维度拉成一维数组
    c = npindex2.ravel()

    FindRoad()
    o = FindRoad()  #为赛道的索引
    b = JudgeRoad(a)  #赛道边缘的横坐标,为偶数个
    b1 = []   #储存赛道中点横坐标
    blackindex2 = JudgeRoad(c)

    npindex2 = []

    if o == 1:
        print('未找到赛道')
        pass
    else:
        if len(str(b)) <= 1:       #b类型转换成字符串(防止报错)
            b1.append(1)
        else:
            for i in range(len(b)):
                if i % 2 == 0:
                    b1.append((b[i] + b[i + 1]) / 2)
                else:
                    pass
        if len(str(blackindex2)) <= 1:
            npindex2.append(1)
        else:
            for i in range(len(blackindex2)):
                if i % 2 == 0:
                    npindex2.append((blackindex2[i] + blackindex2[i + 1]) / 2)
                else:
                    pass
        if len(b1)==len(npindex2):
            for i in range(len(b1)):
                angle = calc_angle(npindex2[i], 420, b1[i], 380)
                cv2.circle(img, (int(npindex2[i]), 420), 3, 255, -1)
                cv2.circle(img, (int(b1[i]), 380), 3, 255, -1)
                print('赛道{}角度:{},中点横坐标:{}'.format(i+1,angle,b1[i]))
        else:
            pass
    cv2.imshow('s',maskblack)
    cv2.imshow('s1', img)
    if cv2.waitKey(30) & 0xFF == 27:  # 按Esc关闭
        break

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

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

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

相关文章

  • 树莓派视觉小车 -- OpenCV巡线(HSL色彩空间、PID)

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

    2024年02月04日
    浏览(38)
  • 智能车巡线python-opencv

    思路:先拿赛道通过HSV调阈值,然后得到二值化图片,对二值化图像进行巡线; 以左线为例子:(图片大小为480*640) 图片以最后一行开始往第一行循环作为外循环(设为i),以中线开始往左减一作为内循环(设为j);记录该行的跳变点:即如果该行的该列为白色(255),

    2024年02月04日
    浏览(47)
  • 电赛智能送药小车_OpenMV巡线&识别十字路口完整代码

      整体思路 :通过划分ROI区域分区进行识别,中央 ROI 区域为巡线,左右两侧的 ROI_L 和 ROI_R 为十字路口识别 . 主程序如下 : # 本文代码中所导入的pid.py就是OpenMV官网上例程的代码 需要完整源码请私信我。

    2024年02月12日
    浏览(54)
  • 基于Python_opencv的车牌识别系统

    一、说明 根据现有的车牌识别系统,本人对代码进行了优化,原有功能: 1、对图片中的车牌号进行识别,并对车牌所属地可视化 2、将识别出的车牌号、车牌所属地等信息导出Excel表格 3、根据QtDesinger设计GUI界面,将程序系统化 添加功能:调用摄像头实时识别捕捉到的车牌

    2023年04月15日
    浏览(36)
  • 基于 OpenCV + Python 的人脸识别上课签到系统

    目录 前言 安装第三方库 第一步:采集人脸图像 (1)修改姓名学号 (2)运行capture_face.py  (3)采集人脸图像  (4)查看采集到的人脸图像 第二步:训练模型 第三步:识别签到 (1)建立签到表 (2)运行sign_in.py,进行签到 (3)查看签到结果 第四步:设计GUI 完整项目的

    2024年02月04日
    浏览(44)
  • 基于python+opencv+mediapipe实现手势识别详细讲解

    目录 运行环境: 一、opencv 二、meidapipe配置 三、实现手部的识别并标注 1、参数分析 1.multi_hand_landmarks  2.multi_hand_world_landmarks 3.multi_handedness 2.绘制信息点和连线 python3.9.7  opencv-python4.6.0.66  mediapipe0.8.11 运行之前先要安装opencv-python、opencv-contrib-python、mediapipe 项目可能对版本的

    2024年01月25日
    浏览(46)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 一、简单介绍 二、简单进行人脸训练与识别 1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别 2、实现步骤: 3、判断是谁的人脸: 案例中涉及的关键函数说

    2024年04月26日
    浏览(86)
  • 基于python+opencv的人脸识别打卡(手把手教你)

    2.1新建members.csv文件 文件内容依次是id,First_name,Last_name,如图: 2.2新建face文件夹 里面存放采集的人脸信息,用于训练 2.3注意事项 脸部识别特征模块 Path路径为你创建环境下的cv2包中haarcascade_frontalface_default.xml对应的地址 只加了opencv中脸部特征,没加眼部识别。(cv2包中还有眼

    2024年02月02日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包