在地图上标记出禁区(多边形),用计算机视觉技术监控进入禁区的物体。
用到的技术有:
- 目标检测(行人识别)
- 多目标跟踪(MOT)
1. 点在多边形内
如果把行人用1个坐标点来表示,核心要做的是判断点是否在多边形(禁区)内。
如果禁区是简单的矩形,判断方法非常简单,用 x,y 坐标大小即可判断。
但如果禁区是复杂多边形,要怎么判断呢
这时候,我想到了 ChatGPT,它给出了一种射线法来判断
方法是,画一条以坐标点为起点的水平射线,射线与多边形的边交点个数为奇数个时,点在多边形内,偶数个时,点在多边形外。
def is_point_in_polygon(self, vertices, point):
"""
判断点是否在多边形内
:param vertices: 多边形顶点坐标列表 [(x1, y1), (x2, y2), ..., (xn, yn)]
:param point: 需要判断的点坐标 (x, y)
:return: True or False
"""
n = len(vertices)
inside = False
p1x, p1y = vertices[0]
for i in range(1, n + 1):
p2x, p2y = vertices[i % n]
if point[1] > min(p1y, p2y):
if point[1] <= max(p1y, p2y):
if point[0] <= max(p1x, p2x):
if p1y != p2y:
xints = (point[1] - p1y) * (p2x - p1x) / (p2y - p1y) + p1x
if p1x == p2x or point[0] <= xints:
inside = not inside
p1x, p1y = p2x, p2y
return inside
2. 人体识别
人体识别一般用目标检测模型,具体的方案也有很多,这里我用的是YOLOv5。
YOLOv5使用预训练模型即可,当然你可以训练自己的模型,关于YOLOv5模型的训练,我在之前的文章里介绍过很多次,感兴趣的朋友可以自行查询。
这里也用 ChatGPT 生成了YOLOv5识别行人的代码,返回的结果比较啰嗦,代码量比我们自己写的要多很多,我没有直接用
3. 行人跟踪
多目标跟踪(MOT)我们之前也介绍过它的原理和各种方案的对比,这里也不再赘述了。
多目标跟踪的目的是可以给同一个行人打上唯一的标识,这样,我们就可以追踪到同一个人,方便做统计。
这里我用的是ByteTrack做多目标追踪,同样可以让ChatGPT代码