最近在做相机的人体姿态检测问题,由于选择的是Kinect_v1相机,根据Kinect的参数表:
可以知道Kinect_v1的垂直角度是43°,图像大小640*480.根据项目需求,我们需要相机在人体0.5米远的地方检测到人体的膝盖到腰部之间的位置,也就是大腿部分。一个成年人大概身高170cm,大腿部分高度大概50cm。根据针孔成像原理:
当已知图像高度为480,且视角为43°时,我们可以求得图像的像距X为609.再根据相机距人体0.5米,列方程:
480/609=x/0.5
得到x=0.394
可以看到其能检测的高度只有0.4m不能满足要求。在不能改变水平距离的情况下,我们考虑是否能通过调整相机的角度来达到更好的检测效果。示意图如下:
已知条件包括:
BC=480;
DE=609;
∠BEC=43°;
EF=500;
GH=500;
BE=CE。
待求量为:∠ABC
这里直接求∠ABC不太好算,所以可以考虑从别的角入手。由于AB∥FH,所以我们可以得到
∠ABG=∠BGH;
同时由∠BEC=43°与BE=CE可知:
∠BCE=∠CBE=68.5°
则∠ABC=∠ABG-∠CBE=∠ABG-68.5=∠BGH-68.5
在△EGH中,由于∠BEC=∠GEH=43°,所以求∠BGH等同于求∠EHG。
设∠EHG=φ;EG=a;EH=b。
联立方程:
1)sin∠EGF=EF/EG=500/a;
2)tan∠EGF=500/FG;
3)cos∠EHG=HF/EH=(500+FG)/EH=(500+FG)/b。
由2)得FG=500/tan∠EGF,代入3)式得
b=(500+500/tan∠EGF)/cos∠EHG
由1)得:
a=500/sin∠EGF
再根据三角形定理S=1/2absinC可知:
1/2500/sin∠EGFb=(500+500/tan∠EGF)/cos∠EHGsin∠EHG=1/2EFGH=1/2500*500
化简得:
(1/sin∠EGF)((1+1/tan∠EGF)/cos∠EHG)sin∠EHG=1
移项:
两边同乘cos∠EGH
由于∠EGF=∠HEG+∠EHG=43+φ,所以上式化为关于未知数φ的三角函数关系式:
左右两边同时展开:
同除以cosφ的三次方得:
(1/cosφ)(0.049tanφ^2+1.413tanφ ) = (0.682+0.731tanφ)(0.682+0.731tanφ)
同时根据:
cosx=±1/根号(tanφ^2+1)
所以最后式子可以化为只包含未知数tanφ的函数:
虽然其只包含一个未知数,但是该式子同样不能用简单的方式解出来,但是我们可以通过尝试的取值判断是否存在解
令tanφ=x,转化为关于x的函数:
由于
f(0) = -0.465<0;
f(1) = 0.071>0;
所以x在0-1之间至少存在一个解,根据三角形本身的一些性质我们大致能确定这个解是唯一的。通过类似于二分法我们逼近这个近似解:
f(0.8) = -0.117<0;
f(0.9) = -0.031<0;
f(0.95) = 0.018>0;
f(0.925) = -0.007<0;
f(0.9375) = 0.005>0;
f(0.93) = -0.002<0
f(0.934) = 0.001>0
当取值为0.934时f(x)的值为0.001非常接近于0,则我们认为x=0.934是该方程的一个解,应该也是唯一解。
当tanφ=0.943
反求得φ≈43.07
则∠EGH=180-43-43.07=93.93
有此求得∠ABC=∠EGH-68.5=25.43°
即当相机向下倾斜25.43°时满足测量要求。
理论求解,实际效果不一定。