将梯形中的点位置转换为矩形位置

时间:2013-02-12 10:46:27

标签: matrix computer-vision transformation homography

我试图找出如何将下面绿色梯形内的坐标Pxy转换为真实地平面上的等效坐标。

我有房间的确切尺寸,这意味着我可以准确地说出A,B,C和D在下面所示的房间里有多长。 我也知道A,B,C和D在绿色三角形中的长度(坐标方式)。

我已经阅读过有关单应性和矩阵变换的内容,但无法真正理解它。任何指引我进入正确方向的输入都将受到赞赏。

谢谢!

enter image description here

3 个答案:

答案 0 :(得分:2)

有代码使用库Opencv计算仿射变换矩阵(它显示了如何将梯形变换为矩形以及如何找到变换矩阵以进行进一步计算):

//example from book
//   Learning OpenCV: Computer Vision with the OpenCV Library
//     by Gary Bradski and Adrian Kaehler
//     Published by O'Reilly Media, October 3, 2008

#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    IplImage *src=0, *dst=0;

    // absolute or relative path to image should be in argv[1]
    char* filename = argc == 2 ? argv[1] : "Image0.jpg";
    // get the picture
    src = cvLoadImage(filename,1);

    printf("[i] image: %s\n", filename);
    assert( src != 0 );


    // points (corners of )
    CvPoint2D32f srcQuad[4], dstQuad[4];
    // transformation matrix
    CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);

    // clone image
    dst = cvCloneImage(src);

    // define all the points
    //here the coordinates of corners of your trapezoid 
    srcQuad[0].x = ??;   //src Top left
    srcQuad[0].y = ??;
    srcQuad[1].x = ??;   //src Top right
    srcQuad[1].y = ??;
    srcQuad[2].x = ??;   //src Bottom left
    srcQuad[2].y = ??;
    srcQuad[3].x = ??;   //src Bot right
    srcQuad[3].y = ??;
    //- - - - - - - - - - - - - -//
    //coordinates of rectangle in src image 
    dstQuad[0].x = 0;       //dst Top left
    dstQuad[0].y = 0;
    dstQuad[1].x = src->width-1;  //dst Top right
    dstQuad[1].y = 0;
    dstQuad[2].x = 0;     //dst Bottom left
    dstQuad[2].y = src->height-1;      
    dstQuad[3].x = src->width-1;  //dst Bot right
    dstQuad[3].y = src->height-1;

    // get transformation matrix that you can use to calculate 
    //coordinates of point Pxy  
    cvGetPerspectiveTransform(srcQuad,dstQuad,warp_matrix);
    // perspective transformation
    cvWarpPerspective(src,dst,warp_matrix);


    cvNamedWindow( "cvWarpPerspective", 1 );
    cvShowImage( "cvWarpPerspective", dst );

    cvWaitKey(0);

    cvReleaseMat(&warp_matrix);

    cvReleaseImage(&src);
    cvReleaseImage(&dst);

    cvDestroyAllWindows();
    return 0;

希望它会有所帮助!

答案 1 :(得分:2)


如果我理解你的问题,你正在寻找表达相机与世界相关的位置和方向(也就是“姿势”)的变换矩阵。如果你有这个矩阵 - 我们称之为 M - 你可以将你的相机坐标系中的任何点映射到世界坐标系,反之亦然。在您的情况下,您需要将一个矩形变换为世界坐标中的平面(0,1,0)^ T + 0。

有几种方法可以推导出这种姿势矩阵。首先,您需要知道另一个矩阵 - K - 它描述了将摄像机坐标系中的位置转换为实际像素位置的内部摄像机参数。这涉及标准的针孔投影以及径向变形和其他一些事情。

要确定 K M ,您必须校准相机。这通常通过采用棋盘场的位置已知的校准图案(例如棋盘图案)来完成。然后,您可以在模式上的已知位置和观察到的像素位置之间建立所谓的点对应。一旦你有足够的这些点对,你就可以解决矩阵 H = KM 。这是你已经提到过的Homography矩阵。完成后,您可以重建 K M

这个理论太多了。对于实际部分,我建议您查看OpenCV-Documentations(例如,您可以从这里开始:OpenCV Camera calibration和此处:OpenCV Pose estimation)。

我希望这会指出你正确的方向;)

答案 2 :(得分:1)

只是为了完成。我最后查看了@mmgp建议的线程并实现了一个与Christopher R. Wren提供的解决方案相同的解决方案:

Perspective Transform Estimation

虽然相机有一些失真,但事实证明这对我的情况非常有效。