2012-06-05 39 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