树莓派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、也可以用一个计时器,定时一分钟。也就是一分钟就会触发一次事件执行,定义一个全局数字变量,在事件中递增,用逻辑判断这个变量的值即可完成多个想要定时的任务(о∀о) 代码块请参考…...
技术驱动的音乐变革:AI带来的产业重塑
📑引言 近一个月来,随着几款音乐大模型的轮番上线,AI在音乐产业的角色迅速扩大。这些模型不仅将音乐创作的门槛降至前所未有的低点,还引发了一场关于AI是否会彻底颠覆音乐行业的激烈讨论。从初期的兴奋到现在的理性审视࿰…...
重生之我要学后端0--HTTP协议和RESTful APIs
http和RESTful APIs HTTP协议RESTful APIs设计RESTful API设计实例 HTTP协议 HTTP(超文本传输协议)是用于分布式、协作式和超媒体信息系统的应用层协议。它是网页数据通讯的基础。工作原理简述如下: 客户端请求(Request…...
深度之眼(二十八)——神经网络基础知识(三)-卷积神经网络
文章目录 一、前言二、卷积操作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.单例模式的特点…...
Agent技术在现代软件开发与应用中的探索
一、引言 随着计算机科学的快速发展,Agent技术作为人工智能和分布式计算领域的重要分支,已经渗透到软件开发的各个方面。Agent技术通过赋予软件实体自主性和交互性,使得软件系统能够更加智能、灵活地响应环境变化和用户需求。本文将对Agent技…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...






