树莓派4B_OpenCv学习笔记12:OpenCv颜色追踪_画出轨迹

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

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

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

 Opencv 版本是4.5.1:

今日尝试使用倒叙的方式来学习Open'CV颜色追踪,尝试一种新的笔记写法吧......

代码是根据创乐博(MAKEROBO)的视频代码学习的 ,我只是查阅资料学习与解释

贴出的解释部分是由百度文心一言AI生成的...

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

目录

测试视频效果展示:

完整实例代码贴出:

代码小结:

创建掩膜/图像的膨胀腐蚀:

开运算 与 闭运算: 

掩膜(mask)上寻找各个轮廓(cnts)函数:

众多轮廓中(cnts)找到最大轮廓(C)函数:

计算轮廓(C)最小包围圆:

计算轮廓(C)的质心(center):

OpenCv画圆函数:

双端队列:

网上查阅资料贴出:


测试视频效果展示:

OpenCv颜色追踪

 

完整实例代码贴出:

这个代码例程实现了使用最小圆来圈出识别追踪到的颜色物体,并画出轨迹

颜色可以在代码中初始化的部分更改:(注意先将BGR转换为HSV色彩空间)

之后会详细解释其中的一些关键函数:

完整代码与解释如下:

# -*- coding: utf-8 -*-

# 导入必要的库
from collections import deque  # 导入双端队列,用于存储物体的中心点  
import numpy as np             # 导入numpy库,用于数学和数组操作  
import argparse                # 导入argparse库,用于处理命令行参数 
import imutils
import cv2                     # 导入OpenCV库,用于视频和图像处理 

ap = argparse.ArgumentParser() # 创建命令行参数解析器 
# 添加命令行参数:--video,可选的视频文件路径  
ap.add_argument("-v", "--video",help="path to the (optional) video file")
# 添加命令行参数:--buffer,双端队列的最大长度,默认为64  
ap.add_argument("-b", "--buffer", type=int, default=64,help="max buffer size")
# 解析命令行参数,并将结果存储在args字典中  
args = vars(ap.parse_args())

# 定义HSV颜色空间中的颜色范围,用于追踪颜色物体
colorLower = (18, 100, 100)
colorUpper = (38, 255, 255)

# 初始化双端队列,用于存储物体的中心点,最大长度为args["buffer"] 
pts = deque(maxlen=args["buffer"])
 
# 如果没有提供视频文件,则使用默认的摄像头
if not args.get("video", False):
	camera = cv2.VideoCapture(0)
# 否则,使用提供的视频文件路径
else:
	camera = cv2.VideoCapture(args["video"])

# 无限循环,读取和处理视频帧 
while True:
	(grabbed, frame) = camera.read() # 读取一帧图像 
 
  # 如果是视频文件,并且没有成功读取帧(即视频结束),则退出循环
	if args.get("video") and not grabbed:
		break
 
 
	frame = imutils.resize(frame, width=600) # 调整帧的大小为600像素宽,保持其原始宽高比 
	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)[-2]
	center = None  # 初始化中心点变量  
 
  # 如果找到了轮廓  
	if len(cnts) > 0:
		c = max(cnts, key=cv2.contourArea)#找到最大的轮廓 
		((x, y), radius) = cv2.minEnclosingCircle(c)#计算该轮廓的最小包围圆 
		M = cv2.moments(c)#计算轮廓的质心
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NULL指向我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值