CVPR: A Two-point Method for PTZ Camera Calibration in Sports的C++程序分析(1)
目前在做相机标定,有关于CVPR的一篇论文A Two-point Method for PTZ Camera Calibration in Sports。
源代码可以在点击打开链接这里下载。
我关心的是用随机森林进行预测后,怎样估计Pan角和Tilt角的过程,而不是随机森林本身。于是就直接分析文件 btdtr_ptz_test_soccer.cpp。
在具体分析之前,先来说一下实验过程。首先有100张(举个例子不一定是这个数字)标定好的图片,即相机在拍摄这100张图片时相机的Pan角,Tilt角以及focal是已知的,或者说是事先标定好的,具体过程可以参见该论文的3.1节Two-point Algorithm for Data Annotation。然后我们把这100张照片分为两份,一份有80张(记为训练集),另一份有20张(测试集)。对于训练集,经过学习得到随机森林(具体过程自己可以查看随机森林的原理)。对于测试集,就用训练集得到的随机森林进行预测(这是一个回归的过程)
现在具体说一下预测的过程。测试集有20张图片。先读取第一张图片,用FAST或者SURF检测到图片中的特征点(假设第一张选出m个特征点),记为a_11,a_12,...,a_1m。如果我读取第k张图片,并且检测到n个特征点,那么就标记为a_k1,a_k2,...,a_kn.
对于a_11来说,用随机森林进行回归预测,我们得到了Num个预测值(不是仅仅一个预测值啊),记为(Pan_11_1,Tilt_11_1),...,(Pan_11_Num,Tilt_11_Num).
同样,对于第k张图片的第n个特征点,用随机森林进行预测,假设也得到了Num个预测值,那么记为(Pan_kn_1,Tilt_kn_1),...,(Pan_kn_Num,Tilt_kn_Num).
有点绕....
再来看第一张图片,第一张图片有m个特征点,而且每个特征点都有Num个预测值,那么对第一张图片而言,一共就有 m*Num 个预测值。
然而,在 m*Num 个预测值之中,只有一个预测值是正确的。怎样去寻找呢?答案是用RANSAC。
具体过程是这样的,首先在m*Num个预测值中取第一个预测值。然后根据这个预测值计算相机的投影矩阵。假设第一帧图像的特征点对应世界坐标系下的控制点坐标是已知的。可以依据刚才计算的投影矩阵去估计第一帧图像这些特征点的像素坐标,进而得到它们的重投影误差。把重投影误差累加起来,作为第一个预测值的误差。
第一帧图像有m*Num个预测值,那么就有m*Num个误差。于是就把误差最小的预测值当作这一帧图像的最佳估计值。
这个示例程序的流程就是这样的,在接下来的一篇开始分析代码。