今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)
本人所用树莓派4B 装载的系统与版本如下:
版本可用命令 (lsb_release -a) 查询:
Opencv 版本是4.5.1:
今日尝试使用倒叙的方式来学习Open'CV颜色追踪,尝试一种新的笔记写法吧......
代码是根据创乐博(MAKEROBO)的视频代码学习的 ,我只是查阅资料学习与解释
贴出的解释部分是由百度文心一言AI生成的...
文章提供测试代码讲解,整体代码贴出、测试效果图
目录
测试视频效果展示:
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)#计算轮廓的质心