我正在研究一個應用程序,需要對通過手機攝像頭拍攝的照片應用透視畸變校正。 拍攝照片後,想法是將其顯示在圖像視圖上,並讓用戶標記文檔的四個角(卡,一張紙等),然後根據這些點應用更正。 這是什麼即時試圖達到一個例子:imageview的透視校正
http://1.bp.blogspot.com/-ro9hniPj52E/TkoM0kTlEnI/AAAAAAAAAbQ/c2R5VrgmC_w/s640/s4.jpg
如何做到這一點的的Android任何想法?
我正在研究一個應用程序,需要對通過手機攝像頭拍攝的照片應用透視畸變校正。 拍攝照片後,想法是將其顯示在圖像視圖上,並讓用戶標記文檔的四個角(卡,一張紙等),然後根據這些點應用更正。 這是什麼即時試圖達到一個例子:imageview的透視校正
http://1.bp.blogspot.com/-ro9hniPj52E/TkoM0kTlEnI/AAAAAAAAAbQ/c2R5VrgmC_w/s640/s4.jpg
如何做到這一點的的Android任何想法?
你想要做的是在各種藝術名稱下進行,「角釘」是視覺效果行業常用的一種。需要在兩個步驟中進行:
原始圖像的4個(非共線,透視失真)角和目標(未失真)圖像的4個角定義了映射。這種映射稱爲「homography」 - 閱讀指向維基百科頁面的細節。一旦映射已知,就可以通過插值計算步驟(2)的變形:對於目標圖像中的每個像素,找到原始圖像中的對應像素。由於這通常不是整數座標,所以可以從鄰居中插入其顏色。使用各種插值方案,常見的是最近鄰,雙線性和雙三次(結果中順序增加順序)。
對於Android,我建議安裝OpenCV SDK,然後使用geometry transformation routines(getPerspectiveTransform和warpPerspective進行上述兩個步驟)。
您不必使用庫爲此。 您還可以使用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
是座標的目的地點。結果:
非常感謝您的解釋!我會嘗試OpenCV。 –