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