最近在研究全景图像的拼接,阅读了OpenCV中图像拼接的部分代码,阅读到waveCorrect函数时看的一头雾水。函数的功能是传入每个相机的旋转矩阵,计算一个矫正的旋转矩阵,对旋转矩阵进行矫正,使得拼接后的图像近似为直线(矫正拼接后图像的波浪形式)。示例见lowe的论文中相关部分:
该部分在 Lowe[2] 的论文中叫做Automatic Panorama Straightening,在 Szeliski[3,4] 的综述文章中叫做Up vector selection,OpenCV的代码是对Lowe算法的实现。
straightening约束的OpenCV代码如下
void waveCorrect(std::vector<Mat> &rmats, WaveCorrectKind kind)
{
LOGLN("Wave correcting...");
#if ENABLE_LOG
int64 t = getTickCount();
#endif
Mat moment = Mat::zeros(3, 3, CV_32F);
for (size_t i = 0; i < rmats.size(); ++i)
{
Mat col = rmats[i].col(0);
moment += col * col.t();
}
Mat eigen_vals, eigen_vecs;
eigen(moment, eigen_vals, eigen_vecs);
Mat rg1;