Probabilistic Occupancy Map是一款多摄像头人体检测程序,其 c ++ 实现可自由使用: http://cvlab.epfl.ch/software/pom
为了利用这个方便的软件,需要:
POM 附带一组示例视频帧和相关配置文件。
我的问题可以陈述如下: 给定一系列同步视频(例如来自http://cvlab.epfl.ch/data/pom)如何生成 POM 所需的配置文件?特别是我对配置的 RECTANGLE 标签感兴趣。自述文件指出:
RECTANGLE [摄像机编号] [位置编号]不可见| [xmin] [ymin] [xmax] [ymax]
定义某个矩形的参数,代表一个 从某个摄像机观看的某个位置的个人。所有 未指定的矩形是"不可见"默认情况下。
根据我的理解,它定义了一个人的边界矩形在从某个摄像机看到的某个位置的样子。必须为每个摄像机的每个(网格)位置定义(假设位置在摄像机的视野范围内 - 如果没有,则使用不可见或矩形可能未定)。
手工完成这一点并非不可能,但肯定是不切实际的。总结一下:如果我有一组来自多个摄像头的视频,如何生成 POM 配置文件?
答案 0 :(得分:5)
在相关的出版物中,作者提到他们使用相机校准来生成网格中每个位置的人体轮廓的矩形。似乎完成此操作的代码不包含在源文件中,在这种情况下,您必须自己编写它。
在他们的数据集的校准数据中,您可以看到他们使用每个摄像头的两个单应性,头部平面单应性和地平面单应性。您可以使用它快速获取所需的矩形。
头部平面单应性是一个3x3矩阵,描述了从一个平面到另一个平面的映射。在这种情况下,它描述了从2D房间坐标(头部水平)到2D图像坐标的映射。您可以使用opencv中的函数findHomography为您自己的相机确定此单应性。您需要做的就是测量房间地面上四个点的坐标,并在这些标记上竖立一根直立杆。杆子应该与您想要跟踪的普通人一样长。您现在可以编写一个小程序,允许您在每个摄像机视图中单击极点的顶部。您现在有四个世界点(在房间中测量的坐标)和每个摄像机四个图像点(您点击的点)。使用findHomography,您可以确定单应性。对没有杆子的地面上的标记也一样,每个摄像头都有两个单应性。
现在,您可以使用单应性将位于房间任何位置的矩形的8个角点投影到每个摄像机的图像坐标上。在所有8个点的边界框中,您可以获得该房间位置和相机的矩形。
使用人体轮廓提到的方法的作者,这表明他们的方法可能比使用长方体更准确。然而,没有移动人物的轮廓,所以具有长方体的解决方案可能是完全可行的。
答案 1 :(得分:3)
我最近一直在阅读这篇文章并挖掘代码,所以我从文章+代码中理解的内容几乎就是你们所讨论的内容。
总而言之,对于系统中的每个摄像头,您必须创建矩形,稍后POM将使用这些矩形作为与从背景减法算法获得的真实轮廓的比较(假设您已经获得了这些)。可能的网格位置。由于每个摄像机可能无法看到场景中的每个网格位置,因此在这些情况下会添加“不可见”标记。正如已经提到的那样,您需要使用校准文件根据透视图来绘制175厘米高和50厘米宽的尺寸。即,更接近的矩形应该比其他矩形更大。
RECTANGLE 0 414 150 0 159 119表示;假设看到的摄像机0是网格414上的黑色矩形,其大小为P1(x,y)=(150,0)-P2(x,y)=(159,119)。这些测量是通过从头部平面(2D摄像机平面)重新投影175厘米至50厘米到地平面(3D平面)而获得的。
更新:我尝试了我在这里发布的内容,是的,它有效。