2013-07-24 70 views
3

我發現了一個程序,它改變的角度來看,像如何撤消cvWarpPerspective

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

UPDATE

@mrgloom的建議後,我可以回到第一個觀點。

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

感謝您的幫助!

+1

你甚至不需要顯式的逆。您可以將'CV_WARP_INVERSE_MAP'標誌傳遞給'cvWarpPerspective()' –

回答

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) - >(x,y)。

我不知道,但我覺得落後的變換,也可以通過顛倒單應矩陣(warp_matrix你的情況)

+0

感謝您的回答,但我只能使用opencv – Engine

+0

使用反向http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html #反轉以反轉warp_matrix,然後使用cvWarpPerspective(dst,src,invert_warp_matrix);爲了向後轉換 – mrgloom

+0

我已經試過了,它不能解決問題 – Engine

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

退房this question.是不是你在找什麼獲得的?

+0

問題的鏈接不工作,你在哪裏得到RedDotDistorted和RedRectified? – Engine

+0

這是一個3D畸變的紅點座標(這是一個輸入權?),它的原始座標是你想要的。 Z = 0。實際上,3D矢量包含在稱爲RedDotDistorted的稀疏矩陣中。閱讀如何創建/讀取/寫入稀疏矩陣可能是一件好事。 –

+0

以及紅點不是3D它只是2D,在這兩種觀點中,我假設逆矩陣很好地是warpMatrix的逆矩陣,並且談論SparseMatrix我alreasy試圖使用但它不工作我假設我不明白它的真正作用!如果你不介意的話,請你寫下代碼的一部分,以便我能理解它!提前致謝 – Engine