当前位置: 首页 > news >正文

[openCV]基于赛道追踪的智能车巡线方案V1

import cv2 as cv
import os
import numpy as npimport time# 遍历文件夹函数
def getFileList(dir, Filelist, ext=None):"""获取文件夹及其子文件夹中文件列表输入 dir:文件夹根目录输入 ext: 扩展名返回: 文件路径列表"""newDir = dirif os.path.isfile(dir):if ext is None:Filelist.append(dir)else:if ext in dir[-3:]:Filelist.append(dir)elif os.path.isdir(dir):for s in os.listdir(dir):newDir = os.path.join(dir, s)getFileList(newDir, Filelist, ext)return Filelistdef mid(follow, mask, img):height = follow.shape[0]  # 输入图像高度width = follow.shape[1]  # 输入图像宽度half = int(width / 2)  # 输入图像中线# 从下往上扫描赛道,最下端取图片中线为分割线for y in range(height - 1, -1, -1):if y == height - 1:  # 刚开始从底部扫描时left = 0right = width - 1left_scale = 0.5  # 初始赛道追踪范围right_scale = 0.5  # 初始赛道追踪范围elif left == 0 and right == width - 1:  # 下层没有扫描到赛道时left_scale = 0.25  # 赛道追踪范围right_scale = 0.25  # 赛道追踪范围elif left == 0:  # 仅左下层没有扫描到赛道时left_scale = 0.25  # 赛道追踪范围right_scale = 0.2  # 赛道追踪范围elif right == width - 1:  # 仅右下层没有扫描到赛道时left_scale = 0.2  # 赛道追踪范围right_scale = 0.25  # 赛道追踪范围else:left_scale = 0.2  # 赛道追踪范围right_scale = 0.2  # 赛道追踪范围# 根据下层左线位置和scale,设置左线扫描范围left_range = mask[y][max(0, left - int(left_scale * width)):min(left + int(left_scale * width), width - 1)]# 根据下层右线位置和scale,设置右线扫描范围right_range = mask[y][max(0, right - int(right_scale * width)):min(right + int(right_scale * width), width - 1)]# 左侧规定范围内未找到赛道if (left_range == np.zeros_like(left_range)).all():left = left  # 取图片最左端为左线else:left = int((max(0, left - int(left_scale * width)) + np.average(np.where(left_range == 255))) * 0.4 + left * 0.6)  # 取左侧规定范围内检测到赛道像素平均位置为左线# 右侧规定范围内未找到赛道if (right_range == np.zeros_like(right_range)).all():right = right  # 取图片最右端为右线else:right = int((max(0, right - int(right_scale * width)) + np.average(np.where(right_range == 255))) * 0.4 + right * 0.6)  # 取右侧规定范围内检测到赛道像素平均位置为右线mid = int((left + right) / 2)  # 计算中点# follow[y, mid] = 255  # 画出拟合中线,实际使用时为提高性能可省略# img[y, max(0, left - int(left_scale * width)):min(left + int(left_scale * width), width - 1)] = [0, 0, 255]# img[y, max(0, right - int(right_scale * width)):min(right + int(right_scale * width), width - 1)] = [0, 0, 255]if y == int((360 / 480) * follow.shape[0]):  # 设置指定提取中点的纵轴位置mid_output = midcv.circle(follow, (mid_output, int((360 / 480) * follow.shape[0])), 5, 255, -1)  # opencv为(x,y),画出指定提取中点error = (half - mid_output) / width * 640  # 计算图片中点与指定提取中点的误差return follow, error, img  # error为正数左转,为负数右转n = -1
# 存放图片的文件夹路径
path = "./d1"
imglist = getFileList(path, [])
for imgpath in imglist:n += 1if n < 0:continuestart_time = time.time()img = cv.imread(imgpath)img = cv.resize(img, (640, 480))# HSV阈值分割img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)mask = cv.inRange(img_hsv, np.array([43, 60, 90]), np.array([62, 255, 255]))follow = mask.copy()follow, error, img = mid(follow, mask, img)print(n, f"error:{error}")end_time = time.time()print("time:", end_time - start_time, "s")cv.imshow("img", img)cv.imshow("mask", mask)cv.imshow("follow", follow)cv.waitKey(0)cv.destroyAllWindows()

相关文章:

[openCV]基于赛道追踪的智能车巡线方案V1

import cv2 as cv import os import numpy as npimport time# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表""&quo…...

SpringIoc-个人学习笔记

Spring的Ioc、DI、AOP思想 Ioc Ioc思想&#xff1a;Inversion of Control&#xff0c;控制反转&#xff0c;在创建Bean的权利反转给第三方 DI DI思想&#xff1a;Dependency Injection&#xff0c;依赖注入&#xff0c;强调Bean之间的关系&#xff0c;这种关系由第三方负责去设…...

【一文搞懂泛型】

3.3泛型 3.3.1泛型出现的背景 泛型出现的背景有两点&#xff1a; 第一点是在集合容器中&#xff0c;如果没有指定对应类型的话&#xff0c;那么底层的元素就是object&#xff0c;要对容器中的元素进行存取的时候&#xff0c;取出来的同时需要进行类型转换&#xff0c;如果有…...

概念解析 | 利用MIMO雷达技术实现高性能目标检测的关键技术解析

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:MIMO雷达目标检测技术 参考资料:何子述, 程子扬, 李军, 等. 集中式 MIMO 雷达研究综述[J]. 雷达学报, 2022, 11(5): 805-829. 利用MIMO雷达技术实现高性能目标检测的关键技术解…...

Grafana制作图表-自定义Flink监控图表

简要 有时候我们在官网的Grafana下载的图表是这样的&#xff0c;如下图 #算子的处理时间&#xff0c;就是处理数据的延迟数据抓取&#xff0c;这个的说明看下下面的文章 metrics.latency.interval: 60 metrics.reporter.promgateway.class: org.apache.flink.metrics.prometh…...

【TypeScript】初识TypeScript和变量类型介绍

TypeScript 1&#xff0c;TypeScript是什么?2&#xff0c;类型的缺失带来的影响3&#xff0c;Ts搭建环境-本博主有专门的文章专说明这个4&#xff0c;使用tsc对ts文件进行编译5&#xff0c;TS运行初体验简化Ts运行步骤解决方案1解决方案2&#xff08;常见&#xff09; 开始学习…...

阿里云瑶池 PolarDB 开源官网焕新升级上线

导读近日&#xff0c;阿里云开源云原生数据库 PolarDB 官方网站全新升级上线。作为 PolarDB 开源项目与开发者、生态伙伴、用户沟通的平台&#xff0c;将以开放、共享、促进交流为宗旨&#xff0c;打造开放多元的环境&#xff0c;以实现共享共赢的目标。 立即体验全新官网&…...

泡水书为什么不能再出售

近日&#xff0c;京津冀持续强降雨&#xff0c;多家出版机构位于涿州等地的图书库房受到影响。 中图网11日发文称&#xff0c;其位于涿州的仓储中心被洪水淹了&#xff0c;一库房有400多万册的书籍。 网友纷纷在文章下暖心留言&#xff1a;注意人身安全&#xff0c;泡水的书也…...

Mac 执行 .sh命令报错 command not found

使用终端执行.sh命令&#xff0c;可输入&#xff1a; ./FileName.sh如果提示 Permission denied 权限不足&#xff0c;可增加sudo&#xff0c;命令如下&#xff1a; sudo ./FileName.sh如果提示 command not found 可以这样: chmod ux *.sh sudo ./FileName.sh...

postgresql 使用之 存储架构 触摸真实数据的存储结构以及组织形式,存入数据库的数据原来在这里

存储架构 ​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 postgresql 数据库服务运行时&#xff0c;数据在磁…...

Node.Js安装与配置教程

目录 1.下载官网 2.选择安装路径 3.添加环境变量 4.验证是否安装成功 5.修改模块下载位置 (1)查看npm默认存放位置 6.在node.js安装目录下&#xff0c;创建两个文件夹 7.修改默认文件夹 8.测试默认位置是否更改成功 9.安装报错解决办法 10.路径未更改成功解决办法 …...

Element-Plus DatePicker获取时间戳

文章目录 0、先上答案1、渔&#xff1f;1-1 Element-Plus 官网1-2 溯源 Day.js 0、先上答案 <!-- 秒 --><el-date-pickerv-model"timeStamp"type"datetime"value-format"X"/><!-- 毫秒 --><el-date-pickerv-model"tim…...

【算法第十五天7.29】513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

链接力扣513-找树左下角的值 思路 class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> queue new LinkedList<>();queue.offer(root);int res 0;while(!queue.isEmpty()){int size queue.size();for(int i 0; i < size; i)…...

Java thymeleaf bug排查记录

刚学Java 做项目时报了一个错误 一时间看的莫名其妙 EL1008E: Property or field createTime cannot be found on object of type java.util.HashMap - maybe not public or not valid? 随即向上排查至第一个报错&#xff0c;发现是thymeleaf渲染时报错。 Exception proces…...

互感和励磁电感(激磁电感)的关系

互感器&#xff0c;变压器&#xff0c;他们之间有着千丝万缕的联系&#xff0c;自感&#xff0c;互感&#xff0c;激磁电感&#xff0c;漏感、耦合系数、理想互感器、理想变压器&#xff0c;这些东西的概念理解和相互之间的关系式。都搞明白了吗&#xff1f;...

stdexcept和exception,两个头文件的区别?

stdexcept和exception是C标准库中的两个头文件&#xff0c;它们的区别如下&#xff1a; 1. 引用方式&#xff1a;stdexcept是exception的父类&#xff0c;引用时可以通过引用stdexcept来自动引用exception&#xff0c;也可以直接引用exception。 2. 异常处理&#xff1a;std…...

openCV图像的读写操作

文章目录 一、数组下标二、指针 void QuickDemo::pixel_visit_demo(cv::Mat &image) {int w image.cols;int h image.rows;int dim image.channels();for (int row 0; row < h; row){for (int col 0; col < w; col){if (dim 1)//灰度图像{int pv image.at<…...

Android平台GB28181设备接入端如何降低资源占用和性能消耗

背景 我们在做GB28181设备接入模块的时候&#xff0c;考虑到好多设备性能一般&#xff0c;我们一般的设计思路是&#xff0c;先注册设备到平台侧&#xff0c;平台侧发calalog过来&#xff0c;获取设备信息&#xff0c;然后&#xff0c;设备侧和国标平台侧维持心跳&#xff0c;…...

Android Studio安装AI编程助手Github Copilot

csdn原创谢绝转载 简介 文档链接 https://docs.github.com/en/copilot/getting-started-with-github-copilot 它是个很牛B的编程辅助工具&#xff0c;装它&#xff0c;快装它&#xff0e; 支持以下IDE: IntelliJ IDEA (Ultimate, Community, Educational)Android StudioAppC…...

windows部署springboot项目 jar项目 (带日志监听和开机自起脚本)

windows部署springboot项目 jar项目 &#xff08;带日志监听&#xff09; 1.把项目打包成jar包&#xff0c;本例演示打包后的jar文件名为demo.jar ———————————————— 2.需要装好java环境&#xff0c;配置好JAVA_HOME&#xff0c;CLASSPATH&#xff0c;PATH等…...

在Taotoken模型广场根据任务与预算挑选合适模型的实践心得

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在Taotoken模型广场根据任务与预算挑选合适模型的实践心得 作为一名日常需要与各类大模型打交道的开发者&#xff0c;模型选型是项…...

程序员的“黄金5年”:如何快速成为技术骨干

一、认知黄金5年&#xff1a;测试工程师的职业分水岭在软件行业&#xff0c;“黄金5年”是从业者职业发展的关键期&#xff0c;对于软件测试工程师而言更是如此。这5年不仅是技术能力从量变到质变的积累期&#xff0c;更是职业方向从模糊到清晰的定型期。据行业数据显示&#x…...

云工场科技成为海淀3x3超级争霸赛与无锡杯官方算力支持伙伴

真正的速度&#xff0c;从来不只是快。5月&#xff0c;北京海淀3x3超级争霸赛与无锡杯篮球赛相继启动。云工场科技&#xff08;HK.02512&#xff09;以“官方算力支持伙伴”身份参与赛事合作&#xff0c;将算力服务能力带到赛场现场。一个多元化、速度与城市活力&#xff1b;一…...

魔兽世界宏编辑器终极指南:5分钟掌握GSE高级宏编译工具

魔兽世界宏编辑器终极指南&#xff1a;5分钟掌握GSE高级宏编译工具 【免费下载链接】GSE-Advanced-Macro-Compiler GSE is an alternative advanced macro editor and engine for World of Warcraft. 项目地址: https://gitcode.com/gh_mirrors/gs/GSE-Advanced-Macro-Compi…...

如何在5分钟内免费创建4K虚拟显示器:ParsecVDisplay终极指南

如何在5分钟内免费创建4K虚拟显示器&#xff1a;ParsecVDisplay终极指南 【免费下载链接】parsec-vdd ✨ Perfect virtual display for game streaming 项目地址: https://gitcode.com/gh_mirrors/pa/parsec-vdd 想要在Windows电脑上快速扩展工作空间&#xff0c;享受4K…...

AMD Ryzen SMU Debug Tool完全指南:揭秘硬件级调试的三大实战场景

AMD Ryzen SMU Debug Tool完全指南&#xff1a;揭秘硬件级调试的三大实战场景 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址:…...

智能体编排框架实战:构建可控可观测的多AI协同工作流

1. 项目概述与核心价值最近在折腾AI应用开发&#xff0c;特别是想把多个大语言模型&#xff08;LLM&#xff09;和工具&#xff08;Tools&#xff09;组合起来&#xff0c;搞点自动化流程。市面上现成的框架不少&#xff0c;但要么太重&#xff0c;要么太“黑盒”&#xff0c;想…...

技术解析【无人机实时建图】 - DenseFusion:如何实现CPU上的大规模密集点云与DSM在线融合

1. DenseFusion框架的核心价值 第一次接触DenseFusion时&#xff0c;最让我惊讶的是它在普通笔记本电脑CPU上就能跑出实时建图效果。要知道传统无人机建图方案要么依赖昂贵GPU&#xff0c;要么需要后期数小时处理。这个框架通过三个关键创新点实现了突破&#xff1a;虚拟立体对…...

学Simulink——微电网中双向DC-AC逆变器的孤岛检测与运行控制仿真

目录 手把手教你学Simulink——微电网中双向DC-AC逆变器的孤岛检测与运行控制仿真 一、背景与挑战 1.1 什么是孤岛?为什么它是“安全隐患”? 1.2 核心痛点与设计目标 二、系统架构与核心控制推导 2.1 整体架构:感知、决策与执行的分层设计 2.2 核心数学推导:孤岛检测…...

手把手教你用逻辑分析仪抓取RF433遥控器信号(附我家窗帘遥控器完整解码过程)

手把手教你用逻辑分析仪抓取RF433遥控器信号&#xff08;附我家窗帘遥控器完整解码过程&#xff09; 无线遥控技术早已渗透进日常生活&#xff0c;从车库门到智能窗帘&#xff0c;这些设备背后的RF433MHz通信协议却像黑匣子般神秘。本文将用一台百元级的逻辑分析仪和常见的超外…...