多目标多摄像机跟踪
1. 简介
- MTMCT:Multi-Target Multi-Camera Tracking (摄像头多目标跟踪)
1.1 MTMCT匹配方法
- 轨迹到轨迹(Tracklet-to-Tracklet)匹配
- 第一步:局部轨迹生成阶段,该阶段在单个摄像头内跟踪每个检测到的目标,并为其生成局部轨迹
- 第二步:跨摄像头轨迹匹配阶段,该阶段在所有摄像头中匹配局部轨迹来为整个跨摄像头网络中的每个目标生成其完整的轨迹,即使用轨迹到轨迹(Tracklet-to-Tracklet)匹配
- 局部轨迹与目标间的匹配(Tracklet-to-Target )
- 框架的输入是来自M个摄像头的M个视频剪辑
- (a):局部轨迹生成模块
- (b):轨迹相似度测量模块
- ©:跨摄像头轨迹匹配模块
- (d):全局轨迹生成模块
- 框架的输入是来自M个摄像头的M个视频剪辑
1.2 MTMCT数据集
- 具有重叠FOV的相机拍摄:PETS09S2L1,CAMPUS,EPFL
- 不具有重叠FOV的相机拍摄:MCT
1.3 基本变换
- 刚体变换:平移+旋转,只改变物体位置,不改变物体形状。旋转矩阵是正交矩阵( R R T = R T R = I RR^T = R^TR=I RRT=RTR=I)
- 仿射变换:改变物体位置和形状,但是保持“平直性”(原来平行的边依然平行)” (
A
2
×
2
A_{2 \times 2}
A2×2可以是任意2x2矩阵,与R一定是正交矩阵不同)
[ x ′ y ′ 1 ] = [ A 2 × 2 T 2 × 1 0 T 1 ] [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \\ \end{bmatrix} = \begin{bmatrix} A_{2 \times 2} & T_{2 \times 1} \\ 0^T & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} ⎣⎡x′y′1⎦⎤=[A2×20TT2×11]⎣⎡xy1⎦⎤ - 投影变换(单应性变换) :彻底改变物体位置和形状
[ x ′ y ′ 1 ] = [ A 2 × 2 T 2 × 1 V T s ] [ x y 1 ] = H 3 × 3 [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \\ \end{bmatrix} = \begin{bmatrix} A_{2 \times 2} & T_{2 \times 1} \\ V^T & s \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = H_{3 \times 3} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} ⎣⎡x′y′1⎦⎤=[A2×2VTT2×1s]⎣⎡xy1⎦⎤=H3×3⎣⎡xy1⎦⎤
H 3 × 3 = [ A 2 × 2 T 2 × 1 V T s ] = [ a 11 a 12 t x a 21 a 22 t y v 1 v 2 s ] H_{3 \times 3} = \begin{bmatrix} A_{2 \times 2} & T_{2 \times 1} \\ V^T & s \\ \end{bmatrix}= \begin{bmatrix} a_{11} & a_{12} & t_x \\ a_{21} & a_{22} & t_y \\ v_1 & v_2 & s \\ \end{bmatrix} H3×3=[A2×2VTT2×1s]=⎣⎡a11a21v1a12a22v2txtys⎦⎤ - A 2 × 2 A_{2 \times 2} A2×2:代表仿射变换参数
- T 2 × 1 T_{2 \times 1} T2×1:代表平移变换参数
- V T = [ v 1 , v 2 ] V^T = [v_1, v_2] VT=[v1,v2]:表示一种“变换后边缘交点“关系
-
s
s
s:表示一个与
V
T
V^T
VT相关的缩放因子
2. 单应性矩阵(Homography Matrix)
2.1 基本概念
-
Homography:“Homo”前缀就是same的意思,表示“同”,homography就是用同一个源产生的graphy,中文译过来大概就是“单应”。即用 [无镜头畸变] 的相机从不同位置拍摄 [同一平面物体] 的图像之间存在单应性,可以用 [投影变换] 表示
[ x l y l 1 ] = H 3 × 3 [ x r y r 1 ] \begin{bmatrix} x_l \\ y_l \\ 1 \\ \end{bmatrix} = H_{3 \times 3} \begin{bmatrix} x_r \\ y_r \\ 1 \\ \end{bmatrix} ⎣⎡xlyl1⎦⎤=H3×3⎣⎡xryr1⎦⎤- ( x l , y l ) (x_l, y_l) (xl,yl):是Left view图片上的点
- ( x r , y r ) (x_r, y_r) (xr,yr):是Right view图片上的点
-
单应性原理被广泛应用于图像配准,全景拼接,机器人定位SLAM,AR增强现实等领域
-
单应性矩阵功能(3x3矩阵):从一个像平面上的点映射得到另一个像平面上的对应点
-
单应性矩阵求解:由于有8个未知数,所以需要4个点对就可以进行求解了
2.2 应用实例
2.2.1图像拼接
- 通过图像特征点匹配+RANSAC可以获得图像之间的单应性矩阵,然后把其中一个图像通过这个矩阵投影到另一个图像上就完成了基本的拼接
- 如下图所示,通过单应矩阵H可以将image1和image2都变换到同一个平面
- 单应矩阵用于图像拼接的例子如下所示:
2.2.2 图像校正
- 用单应矩阵进行图像矫正的例子如下图所示,最少需要四个对应点对就可以实现
2.2.3 视角变换
- 单应矩阵用于视角变换的例子如下图所示,可以方便地将左边普通视图转换为右图的鸟瞰图
2.2.4 增强现实(AR)
- 平面二维标记图案(marker)经常用来做AR展示。根据marker不同视角下的图像可以方便的得到虚拟物体的位置姿态并进行显示,如下图所示
2.3 估计单应矩阵
2.3.1 四点对法
-
我们假设两张图像中的对应点对齐次坐标为(x’,y’,1)和(x,y,1),单应矩阵H定义为:
H = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] H = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \\ \end{bmatrix} H=⎣⎡h11h21h31h12h22h32h13h23h33⎦⎤ -
则有:
[ x ′ y ′ 1 ] = [ h 11 h 12 h 13 h 21 h 22 h 23 h 31 h 32 h 33 ] [ x y 1 ] \begin{bmatrix} x' \\ y' \\ 1 \\ \end{bmatrix} = \begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33} \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} ⎣⎡x′y′1⎦⎤=⎣⎡h11h21h31h12h22h32h13h23h33⎦⎤⎣⎡xy1⎦⎤ -
展开即可得:
x ′ = h 11 x + h 12 y + h 13 h 31 x + h 32 y + h 33 y ′ = h 21 x + h 22 y + h 23 h 31 x + h 32 y + h 33 x' = \frac {h_{11} x + h_{12}y + h_{13}}{h_{31} x + h_{32}y + h_{33}} \\ y' = \frac {h_{21} x + h_{22}y + h_{23}}{h_{31} x + h_{32}y + h_{33}} x′=h31x+h32y+h33h11x+h12y+h13y′=h31x+h32y+h33h21x+h22y+h23 -
如何根据标定图得到单应矩阵?
- 打印一张棋盘格标定图纸,将其贴在平面物体的表面。
- 拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现
- 对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点)。我们定义打印的棋盘图纸位于世界坐标系Zw=0的平面上,世界坐标系的原点位于棋盘图纸的固定一角(比如下图中黄色点)。像素坐标系原点位于图片左上角
- 因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到其单应矩阵H。
- OpenCV实现:只要输入匹配点对,指定具体计算方法即可输出结果单应矩阵
Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
- 示例代码:
import cv2
import numpy as np
im1 = cv2.imread('left.jpg')
im2 = cv2.imread('right.jpg')
src_points = np.array([[581, 297], [1053, 173], [1041, 895], [558, 827]])
dst_points = np.array([[571, 257], [963, 333], [965, 801], [557, 827]])
H, _ = cv2.findHomography(src_points, dst_points)
h, w = im2.shape[:2]
im2_warp = cv2.warpPerspective(im2, H, (w, h))
2.3.2 HomographyNet(深度学习end2end估计单应性变换矩阵)
- 参考论文《Deep Image Homography Estimation》
- HomographyNet是发表在CVPR 2016的一种用深度学习计算单应性变换的网络,即输入两张图,直接输出单应性矩阵
H
H
H