如何撤消cv WarpPerspective

时间:2013-07-24 07:23:17

标签: c opencv

我发现了一个改变视角的程序,比如

source

result

我的问题是如何回到源图像,并在第二张图像中得到红点的坐标? 这是代码:

#include <opencv\cv.h>
#include <opencv\highgui.h>
int main(int argc, char** argv) {
    CvPoint2D32f srcQuad[4], dstQuad[4];
    CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);
    IplImage *src, *dst;
    src=cvLoadImage("b.jpg",1) ;
    dst = cvCloneImage(src);
    dst->origin = src->origin;
    cvZero(dst);
        srcQuad[0].x = 0; //src Top left
    srcQuad[0].y = 0;
    srcQuad[1].x = src->width - 1; //src Top right
    srcQuad[1].y = 0;
    srcQuad[2].x = 0; //src Bottom left
    srcQuad[2].y = src->height - 1;
    srcQuad[3].x = src->width -1; //src Bot right
    srcQuad[3].y = src->height - 1;
    dstQuad[0].x = src->width*0.05; //dst Top left
    dstQuad[0].y = src->height*0.33;
    dstQuad[1].x = src->width*0.9; //dst Top right
    dstQuad[1].y = src->height*0.25;
    dstQuad[2].x = src->width*0.2; //dst Bottom left
    dstQuad[2].y = src->height*0.7;
    dstQuad[3].x = src->width*0.8; //dst Bot right
    dstQuad[3].y = src->height*0.9;
    cvGetPerspectiveTransform(
    srcQuad,
    dstQuad,
    warp_matrix
    );
    cvWarpPerspective( src, dst, warp_matrix );
    cvNamedWindow( "Perspective_Warp", 1 );
    cvShowImage( "Perspective_Warp", dst );
    cvSaveImage("bbb.jpg",dst);
    cvWaitKey();

     cvReleaseImage(&dst);
    cvReleaseMat(&warp_matrix);
    return 0;
}

更新

在@mrgloom的建议之后我可以回到第一个视角。

cvInvert(warp_matrix,inversematrix);
cvWarpPerspective( dst, src2, inversematrix );
cvNamedWindow( "2", 2 );
cvShowImage( "2", src2 ); 

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

透视变换的公式,其中m_ {i,j}是单应矩阵元素

   u= (m11*x + m12*y + m13)/(m31*x + m32*y + m33); 
   v= (m21*x + m22*y + m23)/(m31*x + m32*y + m33);

所以向后转换将是

x = (-V * m33 * m12 + V * m32 * m13 + m23 * m12 - m22 * m13 + m22 * U * m33 - m23 * U * m32) / (m11 * m22 - m11 * V * m32 - m12 * m21 + m12 * V * m31 - U * m31 * m22 + U * m32 * m21);
t2 = m11 * V;
t7 = U * m31;
y = -(m11 * m23 - t2 * m33 - m13 * m21 + m13 * V * m31 - t7 * m23 + U * m33 * m21) / (m11 * m22 - t2 * m32 - m12 * m21 + m12 * V * m31 - t7 * m22 + U * m32 * m21); 

因此,您可以使用单应矩阵计算任何点对应关系(x,y) - >(u,v)和(u,v) - &gt;(x,y)。

我不确定,但我认为通过反转单应矩阵(在你的情况下是warp_matrix)也可以获得反向变换

答案 1 :(得分:1)

cvGetPerspectiveTransform(
    dstQuad,
    srcQuad,
    inverse_matrix
    );
cvPerspectiveTransform(RedDotDistorted, RedDotRectified, inverse_matrix);

查看this question.这是您要找的内容吗?