许飞鸿 孙林 齐鹏 王钰琪 胡浩
摘 要:为满足现代社会对于减少坐姿引发的健康问题的需求,文章基于ORB算法,应用图像直方图,使用Python编程语言和OpenCV库提出了一种可实现的坐姿识别方法,并对其进行实验验证。
关键词:图像识别;ORB算法;Python OpenCV;直方图;坐姿识别
现代社会存在一个巨大的群体,出于工作学习的原因,他们需要维持数个小时的静坐状态,在这样的情况下正确坐姿的重要性就凸显出来。长期不正确的坐姿对人体的健康将产生巨大的影响。计算机的飞速普及,让人们将越来越多的工作放在计算机上去完成,各行各业,尤其是程序开发人员、文字工作者,在计算机上的工作时间越来越长,这种情况下不良的坐姿对颈肩腰椎都会产生很大影响,容易导致多种疾病的发生。调查显示肩部腰部疾病的发病率越来越高,发病年龄越来越小,跟长期坐着工作有关。这些问题都说明,坐姿正确与否对健康有很大影响。在这样的情况下,有效预防不正确坐姿具有重大实际意义。
1 坐姿识别应用前景
要识别坐姿,首先要区分正确坐姿与不正确坐姿。正确的坐姿要求坐下时人身体端正,不左右斜靠,不前后仰躺,头部略微前倾,颈椎略微弯曲但是弯曲程度不宜过大,腰部保持挺直,身体自然放松,肩部自然下垂。胸部距离书桌边沿约一拳位置,保持头、颈、胸的正常生理曲线。如果是使用电脑的情况下,电脑屏幕中间应刚好与下巴呈水平,两者距离保持约35 cm。如果是阅读书籍或写作的情况下正确的坐姿要求书本与眼睛距离在30~35 cm最佳。
不正确的坐姿大致分为6类:头部倾斜、身体左倾、身体右倾、身体前倾、脊椎前曲、身体后仰[1],这些不正确的坐姿都将对身体健康造成损害,头部倾斜、脊椎前曲是造成颈椎病,颈椎弯曲的重大原因之一;身体左倾、身体右倾、身体前倾增大腰部负担,造成腰椎弯曲、腰椎间盘突出、腰部疼痛等多种疾病。在这种情况之下,坐姿识别技术拥有广泛的应用前景,并有望在预防坐姿不正确引发的各类疾病方面起到重大作用。
坐姿识别技术主要是指通过现代科技力量判断人们现阶段的坐姿情况,从而对不正确的坐姿起到警醒的作用。坐姿识别技术的分类大体与人体动作姿势的识别方法分类相同。
2 坐姿识别技术概述
人体动作姿态的识别方法可分为3类:基于统计的方法、基于模板的方法和基于语法的方法[2]。其中,基于统计的方法主要是隐马尔可夫模型(Hidden Markov Model,HMM)和动态贝叶斯网络(Dynamic Bayesian Network,DBN)两种方法,基于语法的方法最主要基于图像序列的相关应用。这两种方法这里我们不予讨论。本文研究的基于快速特征点提取和描述(Oriented FAST and Rotated BRIEF,ORB)算法图像识别技术属于基于模板的方法。基于模板的姿态识别方法核心思想就是比较实际检测对象与标准模板对象的相似程度,以此对人体的姿态情况进行判断。这种方法应用广泛且可靠性高,在实际应用中有较高价值。
3 基于ORB算法的坐姿识别过程
3.1 ORB算法介绍
ORB算法是一种快速特征点提取和描述算法,这个算法分为两部分,分别是特征点提取和特征点描述。特征提取是由FAST算法发展来的,特征点描述是根据BRIEF特征描述算法改进的。ORB特征是将FAST特征点的检测方法与BRIEF特征描述子结合起来,并在它们原来的基础上做了改进与优化。ORB算法最大的特点就是计算速度快。这首先得益于使用FAST检测特征点,FAST的检测速度非常快。再次是使用BRIEF算法計算描述子,该描述子特有的2进制串的表现形式不仅节约了存储空间,而且大大缩短了匹配的时间[3]。
3.2 图像直方图介绍
直方图统计是图像处理中的一个非常重要的操作。图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用[4]。
3.3 姿态检测原理
将摄像头拍摄到的一张图片与标准坐姿图片进行对比,通过ORB算法对两张图片进行特征点匹配,然后根据匹配的特征点坐标确定特征点匹配的对数,再通过设置阈值的方式来判断两张图片姿态的相似度。同时计算两张图片的直方图,通过绘制灰度值曲线来比较两张图的相似度,并且输出两张图的相似度,再通过对两种方法相似度的综合判断,来判断这两张图片中人体姿态。即若是两张方法判断出来两张图片的相似度都很高,那么可以判定两张图片中的人体姿态是一致的,也就是说摄像头拍到的图片中的人坐姿是标准的,若是两种方法判断的图片相似度都不高或者其中之一不高,则可以判断图片中人的坐姿是不标准的[5]。
3.4 方法实现
在实现方法前首先要安装好Python运行环境并安装好OpenCV库,将摄像头拍摄的人体姿态图片与标准姿态图片进行对比,利用ORB算法匹配两张图片的特征点,在运用图像直方图来比较两张图片相似度,若匹配到的特征点对数超过阈值且图片相似度也很高,则输出“坐姿标准”[6]。以下为该方法实现用到的主要函数:
(1)实现ORB特征匹配的函数。
def drawMatches(img1, kp1, img2, kp2, matches):
rows1 = img1.shape[0]
cols1 = img1.shape[1]
rows2 = img2.shape[0]
cols2 = img2.shape[1]
out = np.zeros((max([rows1,rows2]),cols1 + cols2, 3),dtype = ‘uint8)
#拼接图像
out[:rows1, :cols1] = np.dstack([img1, img1,img1])
out[:rows2, cols1:] = np.dstack([img2, img2,img2])
for mat in matches:
img1_idx = mat.queryIdx
img2_idx = mat.trainIdx
(x1,y1) = kp1[img1_idx].pt
(x2,y2) = kp2[img2_idx].pt
#绘制匹配点
cv2.circle(out, (int(x1),int(y1)),4,(255,255,0),1)
cv2.circle(out,(int(x2)+cols1,int(y2)),4,(0,255,255),1)
cv2.line(out,(int(x1),int(y1)),(int(x2)+cols1,int(y2)),(255,0,0),1)
return out
(2)实现图像直方图相似度统计的函数。
def classify_gray_hist(image1,image2,size = (256,256)):
#先计算直方图
image1 = cv2.resize(image1,size)
image2 = cv2.resize(image2,size)
hist1 = cv2.calcHist([image1],[0],None,[256],[0.0,255.0])
hist2 = cv2.calcHist([image2],[0],None,[256],[0.0,255.0])
#比较以下直方图
plt.plot(range(256),hist1,r)
plt.plot(range(256),hist2,b)
plt.show()
#计算直方图重合度
degree = 0
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + (1 - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree = degree + 1
degree = degree/len(hist1)
return degree
#计算单通道的直方图
def calculate(image1,image2):
hist1 = cv2.calcHist(image1,[0],None,[256],range(0.0,255.0))
hist2 = cv2.calcHist(image2,[0],None,[256],range(0.0,255.0))
#计算直方图的重合度
degree = 0
for i in range(len(hist1)):
if hist1[i] != hist2[i]:
degree = degree + (1 - abs(hist1[i]-hist2[i])/max(hist1[i],hist2[i]))
else:
degree = degree + 1
degree = degree / len(hist1)
return degree
#通过得到每个通道的直方图来计算相似度
def classify_hist_with_split(image1,image2,size = (256,256)):
#將图像resize后,分离为三个通道,再计算每个通道的相似值
image1 = cv2.resize(image1,size)
image2 = cv2.resize(image2,size)
sub_image1 = cv2.split(image1)
sub_image2 = cv2.split(image2)
sub_data = 0
for im1,im2 in zip(sub_image1,sub_image2):
sub_data += calculate(im1,im2)
sub_data = sub_data/3
return sub_data
3.5 方法论证
以某个被测人的100张不同姿态照片与该被测人的标准姿态照片进行测试,随机选取10组识别结果。经过测试可看到10组中识别准确的组别有8组,识别准确率达到80%,因此该方法可正确的识别姿态标准程度[7]。
4 结语
本文提出了基于ORB算法进行人体坐姿识别的一种方法,ORB图像识别算法在人脸识别、坐姿识别领域的应用较少,拓宽了ORB图像识别算法的应用领域,同时将ORB图像识别和直方图统计相结合解决人体坐姿识别相关问题,提高了图像识别的准确性。同时,对于上班族久坐且坐姿不正确导致的各种健康问题,本文提出了一种有效的预防方法,通过ORB算法对不正确的坐姿进行识别并且发出提醒,从而起到不断提醒人们关注自己的坐姿,及时改正错误坐姿的作用。
[参考文献]
[1]谢红莉,谢作揩,叶景,等.我国青少年近视现患率及相关因素分析[J].中华医学杂志,2010(7):15.
[2]王春阳.基于图像技术的人体坐姿监测研究[D].西安:西安电子科技大学,2013.
[3]黄国范,李亚.人体动作姿态识别综述[J].电脑知识与技术,2013(1):133-135.
[4]张宇.基于人脸检测与肤色统计的坐姿行为监测[J].计算机与网络,2017(7):73-76.
[5]高强,潘俊.基于ORB的图像特征提取与匹配研究[J].福建电脑,2019(1):21-22.
[6]范新南,顾亚飞,倪建军.改进ORB算法在图像匹配中的应用[J].计算机与现代化,2019(2):1-6,14.
[7]李乐鹏,孙水发,夏冲,等.直方图均衡技术综述[J].计算机系统应用,2014(3):1-8.