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

树莓派4B_OpenCv学习笔记15:OpenCv定位物体实时坐标

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

 本人所用树莓派4B 装载的系统与版本如下:

 版本可用命令 (lsb_release -a) 查询:

 Opencv 版本是4.5.1:

今日学习 OpenCv定位物体实时位置,代码来源是创乐博,这里作学习解释

文章提供测试代码讲解,整体代码贴出、测试效果图

目录

完整实例代码贴出:

实验过程:

获取小球的准确HSV色域:

将上一步得到的HSV色域替换在程序中:

实验结果截图与视频:

网上查阅资料贴出:


完整实例代码贴出:

这个代码实现了圈出指定HSV色彩范围的圆形物体,并打印出其质心在视频帧上的坐标

并且有LED相关的亮灭操作用于指示是否检测到目标

# -*- coding: utf-8 -*-from __future__ import print_function     # 导入print函数,确保在Python 2和Python 3中都能以兼容的方式使用print。  
from imutils.video import VideoStream # 从imutils库中导入VideoStream,用于从摄像头捕获视频帧。 
import imutils                                             # 导入imutils库,该库提供了图像和视频处理的实用功能。 
import time
import cv2
import os
import RPi.GPIO as GPIO                          # 导入Raspberry Pi的GPIO库,用于控制GPIO引脚。Led = 21                                                      # 定义一个变量Led,表示连LED的GPIO引脚编号。
GPIO.setwarnings(False)                           # 关闭GPIO库的警告信息。
GPIO.setmode(GPIO.BCM)                       # 设置GPIO引脚编号模式为BCM(Broadcom SOC channel mode)。
GPIO.setup(Led, GPIO.OUT)                     # 设置GPIO引脚Led为输出模式。# 定义一个函数,用于打印对象中心的坐标。
def mapObjectPosition (x, y):print ("[INFO] Object Center coordenates at X0 = {0} and Y0 =  {1}".format(x, y))# 打印一条信息,表示正在等待摄像头预热。 
print("[INFO] waiting for camera to warmup...")
vs = VideoStream(0).start()                     # 创建一个VideoStream对象,并启动它。0表示使用默认的摄像头。  
time.sleep(2.0)                                          # 等待2秒,确保摄像头已经预热完成。colorLower = (9,135,231)                         # 定义HSV颜色空间的下限,用于颜色过滤。
colorUpper = (31,255,255)                       # 定义HSV颜色空间的上限,用于颜色过滤。GPIO.output(Led, GPIO.LOW)                # 将Led引脚设置为低电平,关闭LED。 
ledOn = False                                           # 定义一个变量ledOn,表示LED是否已打开。while True:frame = vs.read()                                                        # 从VideoStream中读取一帧图像。  frame = imutils.resize(frame, width=500)               # 调整帧的大小,使其宽度为500像素。frame = imutils.rotate(frame, angle=0)                   # 旋转帧(虽然在这里旋转角度为0,所以实际上没有旋转)。hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)  # 将帧从BGR颜色空间转换为HSV颜色空间。mask = cv2.inRange(hsv, colorLower, colorUpper)# 使用定义的颜色范围创建一个颜色掩码。mask = cv2.erode(mask, None, iterations=2)         # 对掩码进行腐蚀操作,减少噪声。mask = cv2.dilate(mask, None, iterations=2)         # 对掩码进行膨胀操作,确保对象区域被完全覆盖# 在掩码上查找轮廓。 cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if imutils.is_cv2() else cnts[1]            # 根据OpenCV的版本(2或3/4),选择正确的轮廓列表。 center = None                                                            # 初始化一个变量center,用于存储对象的中心坐标。 if len(cnts) > 0:       # 如果找到了轮廓...  c = max(cnts, key=cv2.contourArea)               # 找到面积最大的轮廓。((x, y), radius) = cv2.minEnclosingCircle(c)     # 找到该轮廓的最小外接圆,并获取其圆心和半径。M = cv2.moments(c)                                         # 计算轮廓c的矩,矩是一组值,可以从中推导出对象的形状特征,如面积、质心等。 center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # 使用矩来计算轮廓的质心(或称为中心),并将其存储在变量center中。 if radius > 10:  # 如果找到的最小外接圆的半径大于10(一个阈值,可以根据实际情况调整):cv2.circle(frame, (int(x), int(y)), int(radius),(0, 255, 255), 2)  # 在原帧上绘制找到的最小外接圆,颜色为青色(BGR中的(0, 255, 255)),线宽为2。cv2.circle(frame, center, 5, (0, 0, 255), -1)  # 在原帧上绘制轮廓的质心(或中心),颜色为红色(BGR中的(0, 0, 255)),并填充。mapObjectPosition(int(x), int(y))             # 调用之前定义的函数,打印对象中心的坐标。  if not ledOn:                                              # 如果LED灯之前没打开(ledOn为False),则将其打开,并将ledOn设置为True。GPIO.output(Led, GPIO.HIGH)ledOn = Trueelif ledOn:         # 如果没有找到轮廓,但LED灯是打开的(ledOn为True):关闭LED灯,并将ledOn设置为False。GPIO.output(Led, GPIO.LOW)ledOn = Falsecv2.imshow("Frame", frame) # 使用OpenCV的imshow函数显示处理后的帧。key = cv2.waitKey(1) & 0xFF   # 如果按下的键是Esc键(ASCII码为27),则退出循环。  if key == 27:breakprint("\n [INFO] Exiting Program and cleanup stuff \n")  # 打印一条信息,表示程序正在退出并进行清理。  
GPIO.cleanup()                                                                       # 清理GPIO设置,释放资源。
cv2.destroyAllWindows()                                                      # 关闭所有OpenCV打开的窗口。
vs.stop()                                                                                  # 停止VideoStream的捕获。

实验过程:

代码中所用的大部分函数已经在之前的几篇文章提到过了,就不重复解释了:

文章网址如下:

树莓派4B_OpenCv学习笔记9:图片的腐蚀与膨胀-CSDN博客

树莓派4B_OpenCv学习笔记12:OpenCv颜色追踪_画出轨迹_树莓派opencv颜色识别-CSDN博客树莓派4B_OpenCv学习笔记13:OpenCv颜色追踪_程序手动调试HSV色彩空间_检测圆-CSDN博客

获取小球的准确HSV色域:

因为程序中已经存在了寻找最大轮廓圆的处理,因此即使不使用上一节文章的手动调节HSV的处理也没什么大问题,但我这里为了检测更为准确专用,还是加上了上一节代码的HSV微调操作:

文章网址如下:

树莓派4B_OpenCv学习笔记13:OpenCv颜色追踪_程序手动调试HSV色彩空间_检测圆-CSDN博客

拍摄照片获取BGR颜色空间:160    75    13

转换为大致的HSV色彩空间:

再使用之前的颜色小球追踪程序对HSV进行进一步细节调整:

调整前:

[97,100,100]

[117,255,255]

调整后:

[92,189,130]

[117,244,200]

将上一步得到的HSV色域替换在程序中:

实验结果截图与视频:

树莓派4B_OpenCv学习笔记15:OpenCv定位物体

网上查阅资料贴出:

[树莓派基础]11.树莓派OpenCV定位物体的实时位置_哔哩哔哩_bilibili

相关文章:

树莓派4B_OpenCv学习笔记15:OpenCv定位物体实时坐标

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日学习 OpenCv定位物体实时位置,代码来源是…...

MySQL之如何定位慢查询

1、如何定位慢查询 1.1、使用开源工具 调试工具:Arthas 运维工具:Promethuss、Skywalking 1.2、MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒&#x…...

Open3D 删除点云中重复的点

目录 一、算法原理1、重叠点2、主要函数二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、重叠点 原始点云克隆一份   构造重叠区域   合并点云获得重叠点 2、主要…...

填报志愿选专业是兴趣重要还是前景重要?

进行专业评估,找到一个适合自己的专业是一件非常困难的事情。在进行专业选择时,身上理想化色彩非常严重的人,会全然不顾及他人的劝阻,义无反顾的以兴趣为主,选择自己热爱的专业。一些较多考虑他人建议,能听…...

python开发基础——day9 函数基础与函数参数

一、初识函数(function) 编程函数!数学函数,里面的是逻辑,功能,而不是套公式 编程函数的作用实现特定操作的一段代码 你现在请客,每个人都点同样的一份吃的,请100个人 1.薯条 2.上校鸡块 3.可乐 那…...

STM32——使用TIM输出比较产生PWM波形控制舵机转角

一、输出比较简介: 只有高级定时器和通用寄存器才有输入捕获/输出比较电路,他们有四个CCR(捕获/比较寄存器),共用一个CNT(计数器),而输出比较功能是用来输出PWM波形的。 红圈部分…...

第十五章 集合(set)(Python)

文章目录 前言一、集合 前言 集合(set)是一个无序的不重复元素序列。 一、集合 set {1, 2, 3, 4}...

面试-javaIO机制

1.BIO BIO:是传统的javaIO以及部分java.net下部分接口和类。例如,socket,http等,因为网络通信同样是IO行为。传统IO基于字节流和字符流进行操作。提供了我们最熟悉的IO功能,譬如基于字节流的InputStream 和OutputStream.基于字符流…...

在.NET Core中,config和ConfigureServices的区别和作用

在.NET Core中,config和ConfigureServices是两个不同的概念,它们在应用程序的启动和配置过程中扮演着不同的角色。 ConfigureServices:这是ASP.NET Core应用程序中的一个方法,位于Startup类的内部。它的作用是配置依赖注入(DI)容器…...

App Inventor 2 如何实现多个定时功能?

1、可以使用多个“计时器”组件。 2、也可以用一个计时器,定时一分钟。也就是一分钟就会触发一次事件执行,定义一个全局数字变量,在事件中递增,用逻辑判断这个变量的值即可完成多个想要定时的任务(о∀о) 代码块请参考&#xf…...

技术驱动的音乐变革:AI带来的产业重塑

📑引言 近一个月来,随着几款音乐大模型的轮番上线,AI在音乐产业的角色迅速扩大。这些模型不仅将音乐创作的门槛降至前所未有的低点,还引发了一场关于AI是否会彻底颠覆音乐行业的激烈讨论。从初期的兴奋到现在的理性审视&#xff0…...

重生之我要学后端0--HTTP协议和RESTful APIs

http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下: 客户端请求(Request&#xf…...

深度之眼(二十八)——神经网络基础知识(三)-卷积神经网络

文章目录 一、前言二、卷积操作2.1 填充(padding)2.2 步长2.3 输出特征图尺寸计算2.4 多通道卷积 三、池化操作四、Lenet-5及CNN结构进化史4.1 Lenet-5 一、前言 卷积神经网络–AlexNet(最牛)-2012 Lenet-5-大规模商用(1989) 二、…...

AI Infra简单记录

向量数据库的作用 1. 在AI大模型训练过程中,向量数据库可以有效提升数据检索、特征提取等任务的效率。 2、在AI大模型推理过程中,向量数据库为大模型提供外挂知识库,提升模型时效性与准确性,提供缓存能力,减少调用开…...

三英战吕布 | 第5集 | 温酒斩华雄 | 竖子不足与谋 | 三国演义 | 逐鹿群雄

🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 📌这篇博客分享的是《三国演义》文学剧本第Ⅰ部分《群雄逐鹿》的第5️⃣集《三英战吕布》的经典语句和文学剧本全集台词 文章目录 1.经典语句2.文学剧本台…...

【C语言】自定义类型:结构体

目录 1. 结构体类型的声明 1.1. 结构的一般声明 1.2. 结构的特殊声明 2. 结构体变量的创建和初始化 3. 结构体的自引用 4. 结构体内存对齐 4.1. 对其规则(面试考点) 4.2. 为什么存在内存对齐? 4.2.1. 平台原因(移植…...

算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法,它广泛应用于分类和回归问题中。它的核心思想是将复杂的决策过程分解成一系列简单的决…...

[每周一更]-(第103期):GIT初始化子模块

文章目录 初始化和更新所有子模块分步骤操作1. 克隆包含子模块的仓库2. 初始化子模块3. 更新子模块 查看子模块状态提交子模块的更改处理子模块路径错误的问题 该问题的缘由是因为:在写某些代码的时候,仓库中有些文件夹,只提交了文件夹名称到…...

单例模式---线程安全实现

文章目录 1.单例模式的特点😊2.单例模式两种实现🤣🤗😊2.1 饿汉式2.2 懒汉式 3.传统单例模式的线程安全问题4.解决方法4.1静态局部变量4.2加锁4.3双重检查锁(DCL)4.4pthread_once 1.单例模式的特点&#x1…...

Agent技术在现代软件开发与应用中的探索

一、引言 随着计算机科学的快速发展,Agent技术作为人工智能和分布式计算领域的重要分支,已经渗透到软件开发的各个方面。Agent技术通过赋予软件实体自主性和交互性,使得软件系统能够更加智能、灵活地响应环境变化和用户需求。本文将对Agent技…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...