Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv虚拟摄像机旋转/平移用于bird';海景_Opencv_Rotation_Translation_Homography - Fatal编程技术网

Opencv虚拟摄像机旋转/平移用于bird';海景

Opencv虚拟摄像机旋转/平移用于bird';海景,opencv,rotation,translation,homography,Opencv,Rotation,Translation,Homography,我有一个经过校准的相机,在那里我可以准确地知道内在和外在的数据。摄像机的高度也是已知的。现在我想虚拟地旋转相机以获得鸟瞰图,这样我就可以用三个旋转角度和平移来构建单应矩阵 我知道两个点可以通过单应变换从一个图像转换到另一个图像 x=K*(R-t*n/d)K^-1*x' 现在有几件事我想知道: 如果我想恢复ccs中的图像坐标,我必须将它乘以K^-1,对吗?作为图像坐标,我使用(x',y',1) 然后我需要建立一个旋转矩阵来旋转ccs…但我应该使用哪种约定?我如何知道如何设置WCS 接下来就是正常的

我有一个经过校准的相机,在那里我可以准确地知道内在和外在的数据。摄像机的高度也是已知的。现在我想虚拟地旋转相机以获得鸟瞰图,这样我就可以用三个旋转角度和平移来构建单应矩阵

我知道两个点可以通过单应变换从一个图像转换到另一个图像

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

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

然后我需要建立一个旋转矩阵来旋转ccs…但我应该使用哪种约定?我如何知道如何设置WCS

接下来就是正常的距离。只取地面上的三个点,然后计算出它们的法线,对吗?距离就是相机的高度吗

另外,我想知道如何改变虚拟鸟瞰相机的高度,这样我就可以说我想从3米的高度看到地平面。如何在平移和单应矩阵中使用单位“米”

到目前为止,如果有人能启发和帮助我,那将是非常棒的。请不要建议使用“getperspective”生成鸟瞰图,我已经尝试过了,但这种方式不适合我


Senna这是我建议的代码(这是我的代码之一),在我看来它回答了你的很多问题, 如果你想知道距离,我会精确地说它在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);
}
matsource=imread(“Whatyouwant.jpg”);
内部α=90,β=90,γ=90。;
int f=500,dist=500;
目的地;
字符串wndname1=getFormatWindowName(“源:”);
字符串wndname2=getFormatWindowName(“WarpPerspective:”);
字符串tbarname1=“Alpha”;
字符串tbarname2=“Beta”;
字符串tbarname3=“Gamma”;
字符串tbarname4=“f”;
字符串tbarname5=“距离”;
namedWindow(wndname1,1);
namedWindow(wndname2,1);
createTrackbar(tbarname1、wndname2和alpha_389;180);
createTrackbar(tbarname2、wndname2和beta_389;180);
createTrackbar(tbarname3、wndname2和伽马,180);
createTrackbar(tbarname4、wndname2和f_2;,2000年);
createTrackbar(tbarname5、wndname2和distè,2000);
imshow(wndname1,来源);
while(true){
双f区;
双α,β,γ;
α=((双)α-90.)*PI/180;
β=((双)β-90。)*PI/180;
伽马=((双)伽马-90.)*PI/180;
f=(双)f_2;;
距离=(双)距离;
Size taille=source.Size();
双宽=(双)尾宽,高=(双)尾高;
//投影2D->3D矩阵

Mat A1=(Mat_u4,3)这段代码对我很有用,但我不知道为什么要交换横摇和俯仰角。当我更改“alpha”时,图像在俯仰中扭曲,当我更改“beta”时,图像在横摇中扭曲。因此,我更改了旋转矩阵,如下所示

此外,RY存在信号错误。您可以在以下位置检查RY:

我使用的旋转矩阵:

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

Mat RX=(Mat_u4,4)代码对你有帮助吗?如果没有,你能在这里发布你的新问题吗?首先,非常感谢,代码对我帮助很大。但是现在我想了解更多:-为什么我不能用逆相机矩阵A2^-1重新投影2d->3d投影?-关于高度:我现在如何将虚拟相机设置为高度?直到现在我有一个值500,但不知道它有多高。我知道我的相机在拍摄图像时离地0.5米,我怎么能用它来移动Z,这样我就有一个离地2米的相机?thx非常多。我刚刚发现,它也适用于单应H=k(R+nt/dist)*k^-1,但我仍然有高度的问题。对于正常计算,我取了两个位于地面上的图像点,这应该可以,对吗?还是取n=(0,0,1)更好?无论如何,需要找出办法改变摄像机在离地面2米处的位置对不起,Johannes,但是你能不能在你所有的公式中更精确一些,如果我猜是比例因子/点/平移向量/旋转垫,那么k,n,t,R是多少,即使我想在你的脑海中帮助你,不幸的是,我不是!你能指定一点吗更多你的问题…而且如果你喜欢这个答案,你可以接受它和/或投赞成票。这就是stackoverflow的哲学,我想,非常感谢!Julien,所以你的回答如此不精确。所以K是我的相机内在矩阵:(f,0,cx;0,f,cy;0,0,1)n是平面的法线,距离相机中心(我假设是0.54米),t是我的平移向量,R是旋转矩阵。根据Faugeras,一个点可以通过单应映射到一个点,单应定义为:H=K*(R+t*n/dist)*K^-1@jmartel你有没有任何参考资料详细描述了你上面列出的变换?我查阅了所有关于相机模型、3d变换、透视等的维基文章,但还没有得到启发。