Opencv虚拟相机旋转/平移鸟瞰图 [英] Opencv virtually camera rotating/translating for bird's eye view

查看:30
本文介绍了Opencv虚拟相机旋转/平移鸟瞰图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一台经过校准的相机,我可以准确了解内在和外在数据.相机的高度也是已知的.现在我想虚拟旋转相机以获得鸟瞰图,这样我就可以构建具有三个旋转角度和平移的单应矩阵.

I've a calibrated camera where I exactly know the intrinsic and extrinsic data. Also the height of the camera is known. Now I want to virtually rotate the camera for getting a Bird's eye view, such that I can build the Homography matrix with the three rotation angles and the translation.

我知道可以通过 Homography 将 2 个点从一个图像转换为另一个图像

I know that 2 points can be transformed from one image to another via Homography as

x=K*(R-t*n/d)K^-1 * x'

x=K*(R-t*n/d)K^-1 * x'

我现在想知道一些事情:如果我想恢复ccs中的图像坐标,我必须将它与K^-1相乘,对吗?作为图像坐标我使用 (x',y',1) ?

there are a few things I'd like to know now: if I want to bring back the image coordinate in ccs, I have to multiply it with K^-1, right? As Image coordinate I use (x',y',1) ?

然后我需要构建一个旋转矩阵来旋转 ccs...但是我应该使用哪种约定?我怎么知道如何设置我的 WCS?

Then I need to built a rotation matrix for rotating the ccs...but which convention should I use? And how do I know how to set up my WCS?

接下来是法线和距离.取三个躺在地上的点并从中计算法线是否正确?距离是相机高度吗?

The next thing is the normal and the distance. Is it right just to take three points lying on the ground and compute the normal out of them? and is the distance then the camera height?

我还想知道如何更改虚拟鸟瞰摄像机的高度,以便我可以说我想从 3 米高的地方看到地平面.如何在翻译和单应矩阵中使用单位米"?

Also I'd like to know how I can change the height of the virtually looking bird view camera, such that I can say I want to see the ground plane from 3 meters height. How can I use the unit "meter" in the translation and homography Matrix?

到目前为止,如果有人能启发和帮助我就太好了.并且请不要建议使用getperspective"生成鸟瞰图,我已经尝试过,但这种方式不适合我.

So far for now, it would be great if someone could enlighten and help me. And please don't suggest generating the bird view with "getperspective", I ve already tried that but this way is not suitable for me.

塞纳

推荐答案

这是我建议的代码(这是我的一个),在我看来它回答了你的很多问题,如果你想要距离,我会精确地说它在 Z 矩阵中,即 (4,3) 系数.

That is the code i would advise (it's one of mine), to my mind it answers a lot of your questions, If you want the distance, i would precise that it is in the Z matrix, the (4,3) coefficient.

希望能帮到你...

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);
}

这篇关于Opencv虚拟相机旋转/平移鸟瞰图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆