2011-08-22 91 views
2

我試圖創建一種能夠以不同的視角平滑地生成圖像的方法。我能夠描述的最佳方式是,如果我通過角度循環來獲得平滑的旋轉圖像,但是,我在這裏要做的是獲得平滑的傾斜圖像,類似於從不同角度觀看廣告牌的人。我已經包含了一些正確的透視轉換的示例圖像以及一些似乎已經返回的無效轉換。此外,如果任何人都可以解釋這些圖像爲什麼或如何看起來像碎玻璃將幫助我瞭解功能在後臺執行的功能。如何在OpenCV中獲得平滑的透視變形

編輯

以下附上一些額外的代碼來描述我目前在做得到這些圖片。我目前正試圖獲得任何價值,並與所描述的有效範圍進行比較。

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*theRNG().uniform(0.1, 1.);//dst Top left 
dstQuad[0].y = src->height*theRNG().uniform(0.1, 1.); 
dstQuad[1].x = src->width*theRNG().uniform(0.1, 1.);//dst Top right 
dstQuad[1].y = src->height*theRNG().uniform(0.1, 1.); 
dstQuad[2].x = src->width*theRNG().uniform(0.1, 1.);//dst Bottom left 
dstQuad[2].y = src->height*theRNG().uniform(0.1, 1.); 
dstQuad[3].x = src->width*theRNG().uniform(0.1, 1.);//dst Bot right 
dstQuad[3].y = src->height*theRNG().uniform(0.1, 1.); 
cvGetPerspectiveTransform(
    srcQuad, 
    dstQuad, 
    warp_matrix 
    ); 

cvWarpPerspective(src, dst, warp_matrix); 

適當變換:

enter image description here enter image description here

無效,玻璃碎片,轉換:

enter image description here enter image description here

任何意見將不勝感激。

+0

你能告訴我們你傳遞的參數來獲得這四個圖像嗎? – SSteve

回答

1

發生這種情況是因爲左邊的點在右邊的點和/或您的頂點低於您的底點,所以您基本上將圖像從內部轉出。

這是一個不會這樣做的版本。我爲左和頂座標產生一個0到0.5之間的隨機乘數,右和底座標產生一個0.5和1.0之間的乘數。

using namespace cv; 

RNG rng; 

int main(int argc, const char * argv[]) { 

    Mat target(Size(601,601), CV_8UC3); 
    for (int i=4; i>=0; i-=1) { 
     circle(target, Point(300,300), i * 50, Scalar((i & 1) * 255, (i & 1) * 255, 255), 100, 8); 
    } 

    Point2f srcQuad[4], dstQuad[4]; 

    srcQuad[0] = Point2f(0,0); //src Top left 
    srcQuad[1] = Point2f(0, target.cols-1); //src Top right 
    srcQuad[2] = Point2f(target.rows-1, 0); //src Bottom left 
    srcQuad[3] = Point2f(target.rows-1, target.cols-1); //src Bottom Right 

    Mat warpTarget; 

    int keystroke = 0; 

    do { 
     dstQuad[0] = Point2f(target.rows * rng.uniform(0.0f, 0.5f), target.cols * rng.uniform(0.0f, 0.5f)); //src Top left 
     dstQuad[1] = Point2f(target.rows * rng.uniform(0.0f, 0.5f), target.cols * rng.uniform(0.5f, 1.0f)); //src Top right 
     dstQuad[2] = Point2f(target.rows * rng.uniform(0.5f, 1.0f), target.cols * rng.uniform(0.0f, 0.5f)); //src Bottom left 
     dstQuad[3] = Point2f(target.rows * rng.uniform(0.5f, 1.0f), target.cols * rng.uniform(0.5f, 1.0f)); //src Bottom Right 

     Mat warpMatrix = getPerspectiveTransform(srcQuad, dstQuad); 

     warpPerspective(target, warpTarget, warpMatrix, Size(600,600)); 

     // create image window named "so7149300" 
     namedWindow("so7149300"); 
     // show the image on window 
     imshow("so7149300", warpTarget); 
     // wait for key 
     keystroke = waitKey(0); 
    } while (keystroke != 27); 

    return 0; 
} 
+0

這適用於我所需要的。由於'getPerspectiveTransform'引發了轉換錯誤,因此必須將Point2f的Matrix更改爲數組。 – Seb

+0

我編輯了代碼示例並進行了更改。 – SSteve