MultiviewX

Introduction

Refer to MultiviewX_FYP for README.

需要指出的是,从原项目hou-yz/MultiviewX(644b90a)上直接clone的项目中的Image_subsets文件夹中的图片有误导性,依据其给出的matchings文件夹中的参数以及calibrate()中的相关代码,正确的图片应该是完整数据集(7.91GB)中的0000.png-0009.png。

下图为使用0000.png-0009.png的结果

967bb58d8c686d90dae7c67d726614b6.png

a784db0dc5b1c8691bbe2cce49ddd273.png

File Structure & Flow Overview

介绍这个项目文件结构与基础运行逻辑

run_all.py

作为程序的入口,运行即可产生结果,其顺序为:

1
2
3
4
5
6
7
8
from calibrateCamera import calibrate
from generatePOM import generate_POM
from generateAnnotation import annotate

if __name__ == '__main__':
calibrate()
generate_POM()
annotate()

首先会运行calibrate()方法,也是本文着重讨论的方法。

datasetParameters.py

记录了数据集的一些参数,包括相机数量,地图宽高等等,其内容为:

1
2
3
4
5
6
7
8
NUM_CAM = 6
MAP_HEIGHT = 16
MAP_WIDTH = 25
MAP_EXPAND = 40
IMAGE_HEIGHT = 1080
IMAGE_WIDTH = 1920
MAN_RADIUS = 0.16
MAN_HEIGHT = 1.8

CX folder

存放了相机X摄取的帧,

matchings folder

matchings 文件夹中给出本程序接受的主要变量,以相机为单位(CameraX.txt,CameraX_3d.txt)进行管理,理解其中各个参数的含义尤为重要。

Refer to Regarding the ground truths for MultiviewX · Issue #7 · hou-yz/MultiviewX · GitHub 可以看到一些对于参数含义的讨论,其内容如下:

the camera~.txt files provide 3d bounding boxes in both 3d coordinates and their 2d correspondences, both generated from unity.

Just in case anyone needs this for future reference, each row seems to consist of the following.

  • first column: frame number (0~399)
  • second column: person ID (PID)
  • third column onward: 3 (or in case of 2D bounding boxes, 2) coordinates for each vertex of the cuboid 3D bounding box and the feet of a person.

CameraX.txt

其中数据如下(为了更为直观的展示,将包围立方盒的16栏参数放在了一栏中,并使用括号包标出点,原数据中均使用空格隔开,并没有括号或者逗号

此数据的坐标系为屏幕空间。

Frame Number Person ID(PID) Cuboid 3D Bounding Box(8 points to define, 16 columns occupied) 脚底点的X坐标 脚底点的Y坐标
0 -190200 (1506.871,740.1227),
(1437.122 ,740.1227),
(1475.729,775.8286),
(1551.121 ,775.8286),
(1567.83,388.0219),
(1490.307,388.0219),
(1538.434, 396.1149),
(1622.993,396.1149)
1491.906 757.2814

367f286364486d2b01c1432d8f50df79.png

CameraX_3d.txt

其中数据如下,可以参照上述CameraX.txt 知晓含义

此数据的坐标系为世界坐标系。

Frame Number Person ID(PID) Cuboid 3D Bounding Box(8 points to define, 16 columns occupied) 脚底点坐标
0 -190200 (9.492622 11.4601144790649 0)
(9.132622 11.4601144790649 0)
(9.132622 11.8201150894165 0)
(9.492622 11.8201150894165 0)
(9.492622 11.4601144790649 1.8)
(9.132622 11.4601144790649 1.8)
(9.132622 11.8201150894165 1.8)
(9.492622 11.8201150894165 1.8)
(9.312622,11.6401147842407,0)

Unity3D(Any CG Tools)

在得到上述变量的相关含义后,就可以在对应的计算机图形学工具中准备数据(给出CameraX.txt,CameraX_3d.txt)了。

任何工具,只要能得出合理的空间坐标,图像上坐标,都是可以接受的。

工具将产出帧,以及此帧中对应的信息。

Introduction

本文中使用的是 Unity3D 2021.3.5f1c1,随后会给出相关的C#代码。思路比较简单,首先是在场景搭建中使用利于观察的方砖,其次是对每一个物体,生成一个3D的包围盒。

综合原GitHub中的项目文件来看,其产生的数据的精度是过高的,导致CameraX.txt,CameraX_3d.txt 略显臃肿。在Python代码中,其砍去了数据中小数部分,并且在标定阶段(calibrateCamera())给予了相应的补偿。

Code Practice

为了更为直观地展现流程,本文随后将关注单帧的信息生成,一些相关的代码可见于FYP_HDRP_Scripts

Bounding Box

首先为模型动态生成BoxCollider,随后获取此BoxCollider的顶点坐标

动态生成BoxCollider

见FYP_HDRP_Scripts

获取顶点坐标

参考# Unity 获取BoxCollider八个点的世界坐标

Author

TsingLoo

Posted on

2022-11-13

Updated on

2022-11-14

Licensed under

Comments