基于OpenCV视频帧差分的身高检测

您所在的位置:网站首页 图像识别人 基于OpenCV视频帧差分的身高检测

基于OpenCV视频帧差分的身高检测

2023-10-03 02:33| 来源: 网络整理| 查看: 265

项目地址: https://gitee.com/jcpser/open-cv_height_detect

引 言

  软件身高检测在日常生活中有着一定的应用需求,然而图像背景的多样化干扰着人的识别率和人的识别精准度,虽然目前有基于HOG的算法识别人(HOG+SVM 行人检测),但在一些场景中还是无法精确识别到某一个人,这就导致基于HOG的人体识别算法无法应用到视觉身高检测领域。   另一种身高测量方法,标定图片中的物体尺度,检测出人后获得人的像素,再通过比例变换,计算出人的身高,这样的方法有好处也有坏处,好处就是非常方便,让人与这个物体处于同一图像中就可以进行处理,但如果背景稍微复杂一些,就无法精确裁切人或者裁切这个标定的物体,因此这种算法很大程度上局限于背景的选择。   基于图像帧差分的算法,由于自身的特性,当摄像机相对静止时,可以无视任何复杂的背景(静止背景)。在本项目中,由于加入了帧差分去噪处理,软件能精准探测到运动的相对大型物体,当人走进摄像机视野时,软件能精准探测到人的运动,当人运动到某一点突然相对静止时,说明人已经站好,这时软件退出记录,开始处理记录的帧和数据,提取出关键帧key_frame,由此得到人的身高。

一、整体流程

在这里插入图片描述   本的预处理操作:包括图像灰度化、高斯模糊、二值化,对差分后的图像处理包括去噪、二值数值矫正(在python中,uint8数值类型0-255=1,因此需要手动把1改为0)

  差分图像描述:如果在摄像机相对静止的情况下前方无运动物体,经过帧差分后得到的差分图像,再经过专门的去噪处理,这时差分图像是全黑的,图像矩阵全为0,当有人经过时,程序就能捕捉到运动物体。

二、视频帧处理与图像处理 2.1 视频帧处理

  由于本算法基于视频帧差分,因此需要提取视频中的帧,获得视频的前一帧frame1和后一帧frame2。分别对这两个帧图像进行处理,两个图像的处理流程是一样的,处理流程如下: 在这里插入图片描述

2.2 差分图像处理

  当frame1和frame2处理完成后,即可将得到的两张二值图做差分处理,值得注意的是,因为摄像机不可能绝对的静止,因此需要对得到的差分图像进行去噪操作(去噪原理在2.5节介绍),去噪前与去噪后的对比图如下: 在这里插入图片描述

  相对静止的摄像机前方无运动物体的情况下,去噪后的差分图像矩阵为全0(图像表示为全黑) 在这里插入图片描述   相对静止的摄像机前方有运动物体的情况下: 在这里插入图片描述

2.3 记录有运动物体时的差别数、差分图像

  我们定义差别数为白色像素点的数量,计算方法:将图像转化为numpy array,调用array的sum函数,再除以255,即得到白色像素点的数量。   我们在正式开始提取视频帧前声明2个全局列表:differ_array[]和key_frame[],作用分别是记录差别数和记录关键帧,通过调用自带的append函数即可实现。   当经过去噪后的差分图像中出现了255白色像素(二值化的原因),则说明有相对较大的运动物体,这时就可以对差分图像进行记录,对差分图像中的白色像素点数量进行记录。

2.4 开始记录与结束记录

  在正式对视频进行处理前,定义两个布尔值:isRecording和isRecorded,分别表示是否正在记录、是否已经记录完毕,将这两个布尔值初始化为False。   由于视频是线性的,当差分图像检测到有运动物体后,差分图像矩阵的sum不为0,这时将isRecording置为True,将当前的差别数添加到differ_array列表中,将差分图像添加到key_frame列表中。   那么什么时候结束记录呢?当人在规定位置停下的时候,那个时候差分图像矩阵的sum又重新归零,这时将isRecorded置为True,表示我们已经拿到足够的线性数据了,这时便可以跳出循环,结束对视频的处理,进入到关键帧提取和身高计算模块中。

2.5 差分图像去噪原理

  这里简单介绍一下差分图像的去噪原理,其实很简单,差分图像本质上是二值图,那些噪声都是255的白色像素。不过这个去噪实现的前提是摄像头要相对静止,摄像头运动或者抖动幅度要在1mm/s以内。   我们事先设定一个阈值100,表示最小可以容忍的面积大小,这时我们对差分图像求连通域,然后求连通域的像素面积大小,如果这个连通域的像素面积小于100,则将这块连通域从差分图中抹去(实现方法:使用drawContours,将整个连通域填充为0,0,0)

三、关键帧提取与身高计算 3.1 关键帧提取

  当我们经过以上步骤,拿到了差别数列表和差分图像列表后,便可以对这里面的数据进行分析,提取出关键帧,这个关键帧最好是人停下的瞬间,这时人站在规定距离内,且即将处于静止(表示我准备好测量身高了)   下图是差别数列表的折线图,反映了人的运动程度,横坐标0-70是时序,纵坐标是差别数大小(白色像素点的数量),我们可以从该图中分析出,该折线图整体是先大后小,人刚开始运动得并不激烈(这时人在寻找标定位置),在时间序列到达40左右,运动达到局部峰值,这时人在转身,在时间序列到达50后,发现接下来的白色像素点数量骤降,下降梯度最大,说明在时间序列50这里,人已经站好且即将停止运动,时间序列50对应的差分帧就是我们要找的关键帧。 在这里插入图片描述   为了找到合适的位置,我们需要使用机器学习来拟合这个折线,使用二次曲线来拟合,寻找二次曲线的峰值点,取峰值点右边1/3的位置作为关键帧的下标。 在这里插入图片描述   经过以上算法,提取的关键帧如下: 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

3.2 身高计算

  在提取出关键帧后,我们先从上到下遍历图像矩阵,找到最左上角的点(头部),再进行一次从左下到右上的遍历,找到最左下角的点(脚部),定义一个函数,计算这两点间的距离,再使用勾股定理,计算竖向垂直的像素长度。得到的这个像素长度即为人的身高(目前还是像素表示)。   我们已经知道了4个先决条件:人镜距离、镜头等效焦距、图像处理设备(电脑)屏幕分辨率、图像处理设备(电脑)屏幕英寸,得到了人身高的像素表示后,即可计算现实中人的身高。

计算公式:   图像处理设备PPI = 开根号((屏幕宽度像素数屏幕宽度像素数) + (屏幕高度像素数屏幕高度像素数)) / 屏幕英寸数   身高 = 像素身高长度 / PPI * 25.4 / 等效焦距 * (人镜距离-0.5) / c

公式中的“身高-0.5”:说明人至少距离镜头0.5米的位置,最好为1.5m至3m内,过远的话误差太大 公式中的“c”: 畸变矫正参数,通常取 人镜距离*1.5 毫米数 = 像素数 / PPI

3.3 身高计算示例 3.3.1计算PPI:

  以我的处理设备为例,我的电脑是1920x1080分辨率,15.6英寸屏幕,因此:   计算得到我的电脑屏幕PPI(像素密度)为141(像素/英寸)。

3.3.2 计算身高:

  以示例2为例,以我的拍摄设备为例,iPhoneSE2020等效焦距28mm,拍摄距离2.5m,得到关键帧后遍历得到的头部点为(168, 128), 脚部点为(713, 186),计算得到两点距离为548 pixel,经过勾股定理及畸变矫正后计算得人的像素身高为504 pixel,所有数据代入身高计算公式: 在这里插入图片描述

四、结论

  在此次试验中,参与测试的人员身高为1.68m,示例1(拍摄距离2m)输出为1.70m,示例2(拍摄距离2.5m)输出身高为1.73m,误差分别为2cm和5cm。   此次工作,我们利用视频帧差分的思想,将动态的人从背景中识别出来,通过提取关键帧,找到合适的计算图像矩阵,从而找到人的头部和脚部,获得了头部和脚部的点位后,再利用像素变换的思想,将图像中的像素转变为现实生活中的长度单(米),从而达到测量人身高的目的。   此方法相对便捷,但是也有缺陷,比如视频帧的提取算法,此次我们是利用2次曲线拟合差别数曲线来寻找峰值右边的下标,作为关键帧的下标,这种方法不一定100%有效,假如正好提取到了“坏帧”(如图11所示),则无法正确识别人的身高,因此这个关键帧提取算法还有待改进。 在这里插入图片描述   我们也想到了一种改进办法,那就是将得到的关键帧列表(这时还没有把其中的一个挑出来)逐帧计算人的身高,然后记录起来,将不合理的值(0.5m以下,2.5m以上)忽略,由此计算合理区间中的平均值,得到平均身高估计,给出人的身高。

作者介绍

在这里插入图片描述

项目本体(迅雷网盘): 链接:https://pan.xunlei.com/s/VMV9of81LB8wcBMorbdqCs9lA1 提取码:wesg



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3