考虑到具有视角fov
,以厘米为单位height
的安装高度和框架为image
的高架摄像机,我可以计算最小和最大长度边使用以下代码来检测人的包围盒(以像素为单位):
def min_max_area(img, height, fov):
"""
Use height (in centimeters) to determine the appropriate minimum and
maximum pixel area for detecting people.
"""
min_cm_width = 30 # female forearm-to-forearm is about 45 cm
max_cm_width = 70 # male forearm-to-forearm is about 55 cm
avg_person_height = 169
# get real distance of camera view width and centimeters per pixel
x = (height - avg_person_height) * math.tan(math.radians(fov/2)) * 2
cm_per_pixel = x / img.shape[1]
# determine minimum and maximum edge length of bounding box
min_pixel_width = min_cm_width / cm_per_pixel
max_pixel_width = max_cm_width / cm_per_pixel
return min_pixel_width**2, max_pixel_width**2
这对于标准焦距镜头或短焦距镜头安装在离地面较远的位置时效果很好。例如,我已经用安装在274厘米处的106度FOV相机进行了测试,没关系。安装在209厘米处的60-70度FOV镜头可以很好地工作,但不能捕获足够大的视场以至有用,这意味着需要使用广角镜的解决方案。
但是,当我使用安装在209厘米处的170度FOV摄像机时,边框太小而无法检测到站在摄像机下方的人。使用106度FOV摄像机,问题仍然存在,尽管并没有那么明显。
这是安装在209厘米处的170度FOV摄像机的屏幕截图-红色和黑色方块分别是错误计算的最小和最大边界框:
我的想法是:
必须有一些数学运算来缩放边界框大小
使用FOV /给定的焦距可能足够或可能不足
如果FOV /给定的焦距不足,则计算相机的固有参数将有望
发现轮廓时,使用其到光学中心的径向距离(结合相机矩阵?)来动态计算cms /像素,而不是假设整个图像的比例恒定
< / li>我认为this link可能包含与我的需求有关的信息,但是我不确定...缩放边框(如果可能)以校正cm /像素失真需要哪些相机参数(如果有) ?如果可能的话,方程可以采用什么通用形式来实现?