视频演示
大家好,今天给大家分享一个使用yolo12算法进行区域内目标实时计数的项目。
计数效果
如上图所示,程序会检测画面中的所有行人,紫色的矩形框是我们统计的区域
当行人从北向南进入紫色矩形框时,会计入进入人数
当行人从南向北进入紫色矩形框时,会计入离开人数
核心代码
处理的核心流程大概如下:
-
读取视频
-
设置区域的坐标
-
初始化目标计数对象
-
依次读取视频中的帧图像,调用counter进行统计
-
释放视频资源
import cv2
from ultralytics import solutions读取视频
cap = cv2.VideoCapture("MOT16-04-raw.webm")
#判断视频是否读取成功
assert cap.isOpened(), "Error reading video file"检测区域的坐标
region_points = [(20, 400), (1080, 400)] # line counting
region_points = [(20, 400), (600, 400), (600, 300), (20, 300)] # rectangle region
region_points = [(20, 400), (1080, 400), (1080, 360), (20, 360), (20, 400)] # polygon region
初始化目标计数对象
counter = solutions.ObjectCounter(
show=True, # 是否显示检测过程
region=region_points, # 检测区域
model="yolo12n.pt", # 使用的检测模型
classes=[0], # 检测的类别
)处理视频
while cap.isOpened():
# 读取视频帧图像
success, im0 = cap.read()#判读是否读取成功 if not success: print("Video frame is empty or processing is complete.") break #调用counter进行计数处理 results = counter(im0)
#释放视频对象
cap.release()
#按键处理
cv2.waitKey(0)
cv2.destroyAllWindows() # 关闭所有窗口
上述代码中,我们已经对关键地方做了注释,这里大概对关键地方进行下说明:
我们这里需要region_points设置区域的坐标,分别是四组坐标,分别表示矩形区域的左上角、右上角、右下角、左下角。
region_points坐标除了设置矩形外,还可以设置直线和多边形,当坐标只有两组的时候,是一条直线,当超过4组之后,是多边形区域。
在solutions.ObjectCounter我们需要设置一些参数,这里的model需要填写权重文件,这里我们写了yolo12n的预训练权重文件。
GUI系统
上述我们提到,我们需要设定一组坐标来控制检测的区域部分,但是坐标的部分不是太好把控,因为我们需要把坐标值和视频中的实际位置关联起来。
所以更好的办法是做一个界面,然后可以通过鼠标在图像上进行框选来绘制矩形框,这样更加直观的显示矩形框的位置。
界面我们采用pyqt5实现的,可以选择绘制矩形还是直线。
有GUI后,我们对程序把控的能力会更强一些,我们可以中途停止视频的处理,也可以随时更换新的视频来进行检测。
这就是本次的内容,有问题欢迎小伙伴评论区留言~