我有一个校准的相机,我确切地知道内在和外在的数据。相机的高度也是已知的。现在我想虚拟地旋转相机以获得鸟瞰视图,这样我就可以用三个旋转角度和平移来构建Homography矩阵。
我知道两个点可以通过同形变换从一个图像变换到另一个图像
x=K*(R-t*n/d)K^-1 * x'
现在有几件事我想知道:如果我想把图像的坐标用ccs表示,我必须用K^-1乘以它,对吧?作为图像坐标,我使用(x',y',1) ?
然后我需要建立一个旋转矩阵来旋转ccs…但是我应该使用哪种约定呢?我怎么知道如何设置我的WCS?
下一个是法线和距离。仅仅在地面上取三个点然后计算它们的法线对吗?那么距离是相机高度吗?
我还想知道如何改变虚拟鸟瞰相机的高度,这样我就可以说我想从3米的高度看到地平面。我如何使用单位"米"在翻译和单应性矩阵?
到目前为止,如果有人能启发和帮助我,那就太好了。请不要建议用"getperspective"生成鸟瞰图,我已经尝试过了,但这种方式不适合我。塞纳
这是我建议的代码(这是我的一个),在我看来,它回答了很多你的问题,如果你想要距离,我将精确地指出它在Z矩阵中,即(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);
}
这段代码适用于我,但我不知道为什么翻滚和俯仰角是交换的。当我改变"alpha"时,图像在俯仰上扭曲,当我改变"beta"时,图像在滚动上扭曲。所以,我改变了我的旋转矩阵,如下所示。
同时,RY有一个信号错误。您可以在:http://en.wikipedia.org/wiki/Rotation_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);
对