2012-06-05 69 views
1

我正在研究一個應用程序,需要對通過手機攝像頭拍攝的照片應用透視畸變校正。 拍攝照片後,想法是將其顯示在圖像視圖上,並讓用戶標記文檔的四個角(卡,一張紙等),然後根據這些點應用更正。 這是什麼即時試圖達到一個例子:imageview的透視校正

http://1.bp.blogspot.com/-ro9hniPj52E/TkoM0kTlEnI/AAAAAAAAAbQ/c2R5VrgmC_w/s640/s4.jpg

如何做到這一點的的Android任何想法?

回答

3

你想要做的是在各種藝術名稱下進行,「角釘」是視覺效果行業常用的一種。需要在兩個步驟中進行:

  1. 計算從所期望的,校正的圖像映射到原始的,扭曲的圖像
  2. 根據在計算出的映射實際上翹曲的原始圖像(1)。

原始圖像的4個(非共線,透視失真)角和目標(未失真)圖像的4個角定義了映射。這種映射稱爲「homography」 - 閱讀指向維基百科頁面的細節。一旦映射已知,就可以通過插值計算步驟(2)的變形:對於目標圖像中的每個像素,找到原始圖像中的對應像素。由於這通常不是整數座標,所以可以從鄰居中插入其顏色。使用各種插值方案,常見的是最近鄰,雙線性和雙三次(結果中順序增加順序)。

對於Android,我建議安裝OpenCV SDK,然後使用geometry transformation routines(getPerspectiveTransform和warpPerspective進行上述兩個步驟)。

+0

非常感謝您的解釋!我會嘗試OpenCV。 –

3

不必使用爲此。 您還可以使用Canvas類的drawBitmap函數之一,並使用Matrix類的setPolyToPoly函數初始化該矩陣。

public static Bitmap cornerPin(Bitmap b, float[] srcPoints, float[] dstPoints) { 
    int w = b.getWidth(), h = b.getHeight(); 
    Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
    Canvas c = new Canvas(result); 
    Matrix m = new Matrix(); 
    m.setPolyToPoly(srcPoints, 0, dstPoints, 0, 4); 
    c.drawBitmap(b, m, p); 
    return result; 
} 

的油漆對象只需要使抗混疊。)

用法:

int w = bitmap.getWidth(), h = bitmap.getHeight(); 
float[] src = {0, 0, 0, h, w, h, w, 0}; 
float[] dst = {0, 0, 0, h, w, 0.8f * h, w, 0.2f * h}; 
Bitmap transformed = cornerPin(bitmap, src, dst); 

src是源點的座標,dst是座標的目的地點。結果:

enter image description here

enter image description here