废话不多说直接上代码!!
# 这是一个示例 Python 脚本。
import cv2
import numpy as npdef track_object ( ) : # 打开摄像头外接cap = cv2. VideoCapture ( 0 ) while True: # 读取摄像头帧# ret (Return Value)是一个布尔值,表示是否成功读取了一帧图像。如果成功读取,ret为True;否则,为False。 # frame 是读取到的图像帧。 ret, frame = cap. read ( ) # 将图像转换为HSV颜色空间。cv2. COLOR_BGR2HSV参数表示将BGR格式转换为HSV格式。# BGR(蓝绿红)格式的图像帧转换为HSV(色相、饱和度、明度)格式。HSV颜色空间更适合进行颜色相关的图像处理。 hsv = cv2. cvtColor ( frame, cv2. COLOR_BGR2HSV) # 定义追踪的颜色范围(此处以蓝色物体为例,可根据需要进行微调)#第一个参数:色相(Hue):可以尝试在0 到179 之间选择一个适当的范围。。#第二个参数:饱和度(Saturation):通常在较高的范围,例如1 到255 之间。#第三个参数:明度(Value):根据具体场景,可以在较高的范围,例如0 到255 之间。lower_color = np. array ( [ 90 , 50 , 50 ] ) upper_color = np. array ( [ 130 , 255 , 255 ] ) # 根据颜色范围创建掩膜。#用于过滤出在指定颜色范围内的部分。这个掩码可以用于后续的图像处理,例如颜色分割或物体识别。mask = cv2. inRange ( hsv, lower_color, upper_color) #开运算(Opening):先进行腐蚀,然后进行膨胀。它有助于去除小的噪点和分离相邻的物体。#闭运算(Closing):先进行膨胀,然后进行腐蚀。它有助于填充物体中的小孔,连接相邻的物体。mask = cv2. erode ( mask, None, iterations= 2 ) # 对掩膜进行腐蚀处理,以去除噪声 。iterations为次数mask = cv2. dilate ( mask, None, iterations= 2 ) #膨胀处理# 寻找物体的轮廓# cv 2.f indContours函数来找到二值图像中的轮廓。 #参数:#参数1 :输 入的二值图像。通常是经过阈值处理后的图像,例如在颜色过滤之后生成的掩码。#参数2 ( cv2. RETR_EXTERNAL) :轮廓的检索模式。有几种模式可选,常用的包括:# cv 2. RETR_EXTERNAL:只检测最外层的轮廓。# cv 2. RETR_LIST:检测所有的轮廓并保存到列表中。# cv 2. RETR_CCOMP:检测所有轮廓并将其组织为两层的层次结构。# cv 2. RETR_TREE:检测所有轮廓并重构整个轮廓层次结构。 # 参数3 ( cv2. CHAIN_APPROX_SIMPLE) :轮廓的近似方法。有两种方法可选,常用的有:# cv 2. CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向上的所有轮廓,只保留端点。# cv 2. CHAIN_APPROX_NONE:保留所有的轮廓点。 #返回值: contours:包含检测到的轮廓的列表。每个轮廓由一系列点组成。
# _(下划线):层次信息,通常在后续处理中可能会用到。在这里,我们通常用下划线表示我们不关心这个返回值。contours, _ = cv2. findContours ( mask. copy ( ) , cv2. RETR_EXTERNAL, cv2. CHAIN_APPROX_SIMPLE) # 初始化物体中心,center是一个包含两个整数的元组,表示轮廓的质心坐标center = Noneif len ( contours) > 0 : #说明检测到轮廓# 找到面积最大的轮廓的点集,从轮廓列表中,计算出面积最大的轮廓的点集。contourArea是计算轮廓面积的函数。# max 的第一个参数:可以为一个列表。第二个参数:固定为 key= 功能函数。 #作用:从列表中遍历成员实现功能函数。max_contour = max ( contours, key= cv2. contourArea) # 计算物体的最小外接圆,参数为:轮廓的点集#( x, y) :外接圆的圆心坐标。# radius :外接圆的半径。 ( ( x, y) , radius) = cv2. minEnclosingCircle ( max_contour) # 计算物体的中心坐标# M为字典,里面存着 二值图像矩阵信息 M = cv2. moments ( max_contour) # m 00 = moments[ 'm00' ] # 面积# cx = moments[ 'm10' ] / moments[ 'm00' ] # 质心的x坐标# cy = moments[ 'm01' ] / moments[ 'm00' ] # 质心的y坐标 center = ( int ( M[ "m10" ] / M[ "m00" ] ) , int ( M[ "m01" ] / M[ "m00" ] ) ) # 只有当物体半径大于一定值时才显示追踪结果if radius > 10 : #外接圆半径大于10 # 在图像上绘制物体的圆形轮廓和中心# 这一行代码绘制一个以 ( x, y) 为圆心,半径为 radius 的圆。颜色为 ( 0 , 255 , 255 ) 表示BGR格式中的黄色,线宽度为2 。cv2. circle ( frame, ( int ( x) , int ( y) ) , int ( radius) , ( 0 , 255 , 255 ) , 2 ) #这一行代码绘制一个半径为5 的实心圆作为中心点,以 center 为中心。颜色为 ( 0 , 0 , 255 ) 表示BGR格式中的红色。。cv2. circle ( frame, center, 5 , ( 0 , 0 , 255 ) , - 1 ) # 显示实时追踪结果#这行代码使用OpenCV的cv2. imshow函数来显示帧,窗口标题为 "Object Tracking" 。cv2. imshow ( "Object Tracking" , frame) # 按下Esc键退出追踪if cv2. waitKey ( 1 ) == 27 : break # 释放摄像头并关闭窗口cap. release ( ) cv2. destroyAllWindows ( ) # 运行物体追踪程序
track_ob