python+opencv

python+opencv

看图片就知道什么精度,权当熟悉社交距离检测基本思路,后期可以使用任意高效精确的(yolov4,v5等)人检测模型替换。

思路说明:

1.使用MobileNet-SSD检测人物

2.首先计算出焦距,使用三角形相似度,让我们设定一个人与相机距离为D(厘米),人平均身高H设定为170厘米。我们可以使用边界框坐标统计人的像素高度P。使用这些值,可以使用以下公式计算相机的焦距

(设物体到光心的距离为P,则虚像到光心的距离可用F表示出来,由两个像的高度(P,H)比等于他们到光心的距离比 F/P=D/H)

焦距计算:F = (P x D) / H

3.在计算出相机的焦距之后,我们可以使用人的实际身高H,人的像素高度P和相机F的焦距来计算人与相机的距离D' (感觉并不精确,转换成俯瞰图 应该相对更好一些,待研究)

人与相机距离计算公式:D' = (H x F) / P

4.现在我们可以计算摄像机中人物的深度,接下来我们可以继续计算视频中两个人之间的距离。视频中可能检测到n个人。因此,欧氏距离是在所有检测到的人的边界框的中点之间计算的。通过这样做,我们得到了x和y值。使用公式2将这些像素值转换为厘米。

5.我们拥有每个人的x,y和z(人与相机的距离)坐标,以cm为单位。使用(x,y,z)坐标计算每个检测到的人之间的欧几里得距离。并对每个人进行连线,如果两个人之间的距离小于200厘米,则会在他们周围显示一个红色的边框,表明他们没有保持社交距离。

基本思路以上,下面是代码配置展示相关

1.参考代码下载,改修

git clone

2.环境配置

python=3.7

下面这两个包要指定版本搭配安装 ,其他包正常安装即可

opencv_python=4.2.0.32

numpy=1.16.2

3.确认模型路径,设定人检测置信度,本模型效果较差,阈值设定较低

2.人物之间追加连线代码

4.运行模型并展示

打开终端:

python social_distance_detection.py --prototxt SSD_MobileNet_prototxt.txt --model SSD_MobileNet.caffemodel --labels class_labels.txt -v pedestrians.mp4

俯瞰图(鸟瞰图):

焦距: