树莓派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 = True

	elif ledOn:         # 如果没有找到轮廓,但LED灯是打开的(ledOn为True):关闭LED灯,并将ledOn设置为False。
		GPIO.output(Led, GPIO.LOW)
		ledOn = False

	cv2.imshow("Frame", frame) # 使用OpenCV的imshow函数显示处理后的帧。
	
	key = cv2.waitKey(1) & 0xFF   # 如果按下的键是Esc键(ASCII码为27),则退出循环。  
	if key == 27:
            break

print("\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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/754597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hi3861 OpenHarmony嵌入式应用入门--LiteOS Event

CMSIS 2.0接口使用事件标志是实时操作系统(RTOS)中一种重要的同步机制。事件标志是一种轻量级的同步原语,用于任务间或中断服务程序(ISR)之间的通信。 每个事件标志对象可以包含多个标志位,通常最多为31个&…

你的编程小助手:Kimi!!【送源码】

从OpenAI发布AI大模型到现在已经快2年时间,中间随着新模型的不断出现,也让大家认识到了AI的强大之处,现在AI已经渗透到我们生活,工作的方方面面。 这期间国产大模型也在努力发展,不断完善,甚至一些大模型在…

用Vue3和Plotly.js生成多折线图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 基于 Plotly.js 的交互式折线图绘制 应用场景介绍 本代码示例展示了如何使用 Plotly.js 库创建交互式折线图。用户可以在图中点击点以添加注释,从而实现数据可视化和探索。此功能可广泛应用于数据…

ai智能语音机器人在电销里发挥怎样的作用

得益于语音识别技术的的进步,人工智能发展越来越成熟。相信作为企业的管理者,都遇到过这样的事:一个电销新人刚刚入行,需求经过一两个月的学习培训才能成为一名合格的销售人员。在这段学习的期间,企业投入的成本是没有…

PS-抠图

在一个图片中,当你单独用到一个人物,或者物品的时候,你可以选择抠图,单独把这个人物模型给扣下来,不要他的背景,不要其他物品。 在PS中,我们看到一个大熊猫,当我们想用到这个熊猫的…

快速清理Word中的嵌套表格

实例需求:Word文档中表格有的单元格中包含嵌套表格(注意其中表格中有合并单元格),如下图所示。 现在需要删除单元格顶部的嵌套表格(如上图中的表格1和表格3),如下图所示,如果表格较多…

友力科技广州数据中心搬迁

搬迁工作内容 1.搬迁技术工作 1)确定机房搬迁的负责人以及负责人的联系方式,保证在搬迁的过程中统一指挥管理。 2)确定服务器的数量,服务器的型号,服务器的配置等,如有需要,联系相关服务器的供货商或者厂家提供技术支持…

EdgeOne 边缘函数 - 构建边缘网关

目前,各大主流厂商都推出了自己的边缘 Serverless 服务,如 CloudFlare Workers、 Vercel EdgeRuntime 等;腾讯云 EdgeOne 边缘函数提供了部署在边缘节点的 Serverless 代码执行环境,只需编写业务函数代码并设置触发规则&#xff0…

免费分享:2021年全国30米分辨率最大NDVI数据集(附下载方法)

气候变化及其对陆地生态系统的影响已成为核心议题,备受社会各界的瞩目。植被作为地理环境的关键构成部分,是气候变迁与人文活动对环境影响的敏感晴雨表。其中,归一化植被指数(NDVI)可以作为衡量地面植被状况的重要指标…

【C语言】解决C语言报错:Invalid Pointer

文章目录 简介什么是Invalid PointerInvalid Pointer的常见原因如何检测和调试Invalid Pointer解决Invalid Pointer的最佳实践详细实例解析示例1:未初始化的指针示例2:已释放的指针示例3:返回局部变量的指针示例4:野指针 进一步阅…

①常用API----Math

public static int abs(int a) // 返回参数的绝对值 public static double ceil(double a) // 返回大于或等于参数的最小整数 public static double floor(double a) // 返回小于或等于参数的最大整数 public static int round(f…

ubuntu22.04编译安装tesseract

1、 为什么用自己编译安装,而不采用apt安装? 由于tesseract有很多依赖包,直接用deb包或者rpm包等安装包安装很复杂,不一定能成功安装。 2、安装基本的依赖包 sudo apt update sudo apt install g autoconf automake libtool pkg…

float8格式

产生背景 在人工智能神经元网络中,一个参数用1字节表示即可,或者说,这是个猜想:因为图像的颜色用8比特表示就够了,所以说,猜想神经元的区分度应该小于256。 数字的分配 8比特有256个码位,分为…

AWS云计算平台:全方位服务与实践案例

摘要 在数字化浪潮的推动下,云计算已成为企业转型的强大引擎。AWS作为云计算的先锋,不仅提供了一系列强大的基础设施服务,更是在人工智能领域不断探索和创新。本文将带您领略AWS的全方位服务,并透过实际案例,感受其在…

ROS2创建服务用RCLCPP实现

1.创建服务提供者service_server_01.cpp #include "example_interfaces/srv/add_two_ints.hpp" #include "rclcpp/rclcpp.hpp" class ServiceServer01 : public rclcpp::Node { public: ServiceServer01(std::string name) : Node(name) { RCLCPP_…

应对铜价飙升,慧能泰推出超高性价比240W五芯线专用eMarker芯片

全球铜价仍然居高不下,以前买电线论捆算,现在巴不得论‘克’珍藏。这年头,换根充电线都得三思而后行,考虑的不是颜色款式,而是‘这条线的铜含量,值几个涨停板?’ 说实话,铜价上涨&a…

[AHK]微信表情快捷输入

需求: 希望在电脑上微信聊天时用键盘快捷输入常用表情。 工具: AutoHotkey v1 使用说明: 微信中按空格显示热键提示窗口,输入键盘序列后,按空格输出相应表情 配置: 源代码: /** 脚本&…

Python之父推荐!Star 60k!深入CPython内核:揭秘内部实现细节

都说 Python 是人工智能的“天选”语言,为什么呢? 可能很多读者都知道,Python 的解释器是用 C 语言写的,所以其实我们在谈论 “Python” 的时候,99.9% 的情况说的就是 “CPython”! CPython 是目前最流行的…

一文弄懂线性回归模型

1、引言 今天,我们将深入探讨机器学习中的三个关键概念:线性回归、代价函数和梯度下降。这些概念构成了许多机器学习算法的基础。起初,我决定不写一篇关于这些主题的文章,因为它们已经被广泛涉及。不过,我改变了主意&…

小白快速入门canvas画海报

小编以微信小程序原生语言举例 wxml页面&#xff1a; <canvas type"2d" id"myCanvas" style"width:375px;height:667px;"></canvas> js页面&#xff1a; import drawQrcode from ../../../utils/qrcode/weapp.qrcode.esmdata: {…