Opencv几乎相机旋转/翻译为鸟瞰图
我有一个校准的相机,我完全知道内在和外在的数据。 摄像机的高度也是已知的。 现在我想旋转摄像头获取鸟瞰图,这样我就可以build立具有三个旋转angular度和平移的Homographymatrix。
我知道2点可以通过Homography作为一个图像转换为另一个图像
x = K *(Rt * n / d)K ^ -1 * x'
我现在想知道一些事情:如果我想把ccs中的图像坐标带回来,我必须把它乘以K ^ -1,对吧? 作为图像坐标我使用(x',y',1)?
然后,我需要build立一个旋转matrix旋转ccs …但我应该使用哪种约定? 我怎么知道如何设置我的WCS?
接下来就是正常和距离。 是不是只要把三点落在地面上并计算出正常值? 距离那么相机的高度?
另外我想知道如何改变虚拟鸟瞰摄像头的高度,这样我可以说我想看到3米高的地平面。 如何在翻译和单应matrix中使用单位“米”?
到目前为止,如果有人能够启发和帮助我,那将是非常好的。 请不要build议用“getperspective”生成鸟瞰图,我已经试过了,但这种方式不适合我。
塞纳
这是我build议的代码(这是我的一个代码),在我看来,它回答了很多你的问题,如果你想要的距离,我会精确地说,它在Zmatrix,(4,3)系数。
希望它能帮助你…
Mat source=imread("Whatyouwant.jpg"); int alpha_=90., beta_=90., gamma_=90.; int f_ = 500, dist_ = 500; Mat destination; string wndname1 = getFormatWindowName("Source: "); string wndname2 = getFormatWindowName("WarpPerspective: "); string tbarname1 = "Alpha"; string tbarname2 = "Beta"; string tbarname3 = "Gamma"; string tbarname4 = "f"; string tbarname5 = "Distance"; namedWindow(wndname1, 1); namedWindow(wndname2, 1); createTrackbar(tbarname1, wndname2, &alpha_, 180); createTrackbar(tbarname2, wndname2, &beta_, 180); createTrackbar(tbarname3, wndname2, &gamma_, 180); createTrackbar(tbarname4, wndname2, &f_, 2000); createTrackbar(tbarname5, wndname2, &dist_, 2000); imshow(wndname1, source); while(true) { double f, dist; double alpha, beta, gamma; alpha = ((double)alpha_ - 90.)*PI/180; beta = ((double)beta_ - 90.)*PI/180; gamma = ((double)gamma_ - 90.)*PI/180; f = (double) f_; dist = (double) dist_; Size taille = source.size(); double w = (double)taille.width, h = (double)taille.height; // Projection 2D -> 3D matrix Mat A1 = (Mat_<double>(4,3) << 1, 0, -w/2, 0, 1, -h/2, 0, 0, 0, 0, 0, 1); // Rotation matrices around the X,Y,Z axis Mat RX = (Mat_<double>(4, 4) << 1, 0, 0, 0, 0, cos(alpha), -sin(alpha), 0, 0, sin(alpha), cos(alpha), 0, 0, 0, 0, 1); Mat RY = (Mat_<double>(4, 4) << cos(beta), 0, -sin(beta), 0, 0, 1, 0, 0, sin(beta), 0, cos(beta), 0, 0, 0, 0, 1); Mat RZ = (Mat_<double>(4, 4) << cos(gamma), -sin(gamma), 0, 0, sin(gamma), cos(gamma), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); // Composed rotation matrix with (RX,RY,RZ) Mat R = RX * RY * RZ; // Translation matrix on the Z axis change dist will change the height Mat T = (Mat_<double>(4, 4) << 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, dist, 0, 0, 0, 1); // Camera Intrisecs matrix 3D -> 2D Mat A2 = (Mat_<double>(3,4) << f, 0, w/2, 0, 0, f, h/2, 0, 0, 0, 1, 0); // Final and overall transformation matrix Mat transfo = A2 * (T * (R * A1)); // Apply matrix transformation warpPerspective(source, destination, transfo, taille, INTER_CUBIC | WARP_INVERSE_MAP); imshow(wndname2, destination); waitKey(30); }
这个代码适用于我,但我不知道为什么交换滚动和俯仰angular度。 当我改变“阿尔法”,图像被扭曲的音调,当我改变“testing”的图像翘曲滚动。 所以,我改变了我的旋转matrix,如下所示。
另外,RY有信号错误。 你可以在http://en.wikipedia.org/wiki/Rotation_matrix检查Ry。;
我使用的旋转matrix:
Mat RX = (Mat_<double>(4, 4) << 1, 0, 0, 0, 0, cos(beta), -sin(beta), 0, 0, sin(beta), cos(beta), 0, 0, 0, 0, 1); Mat RY = (Mat_<double>(4, 4) << cos(alpha), 0, sin(alpha), 0, 0, 1, 0, 0, -sin(alpha), 0, cos(alpha), 0, 0, 0, 0, 1); Mat RZ = (Mat_<double>(4, 4) << cos(gamma), -sin(gamma), 0, 0, sin(gamma), cos(gamma), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
问候