imageview的透视校正

时间:2012-06-05 20:40:22

标签: android image-processing

我正在开发一款需要对手机相机拍摄的照片进行透视失真校正的应用。 拍摄照片后,想法是在图像视图上显示它并让用户标记文档的四个角(卡片,纸张等),然后根据这些点应用校正。 这是我想要实现的一个例子:

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

关于如何在 android 上执行此操作的任何想法?

2 个答案:

答案 0 :(得分:10)

不必使用。 您也可以使用drawBitmap类的Canvas函数之一,并使用setPolyToPoly类的Matrix函数初始化的矩阵。

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

仅需要Paint对象来启用消除锯齿。

用法:

int w = bitmap.getWidth(), h = bitmap.getHeight();
float[] src = {
    0, 0, // Coordinate of top left point
    0, h, // Coordinate of bottom left point 
    w, h, // Coordinate of bottom right point
    w, 0  // Coordinate of top right point
};
float[] dst = {
    0, 0,        // Desired coordinate of top left point 
    0, h,        // Desired coordinate of bottom left point  
    w, 0.8f * h, // Desired coordinate of bottom right point
    w, 0.2f * h  // Desired coordinate of top right point
};
Bitmap transformed = cornerPin(bitmap, src, dst);

其中src是源点的坐标,dst是目标点的坐标。结果:

enter image description here

enter image description here

答案 1 :(得分:3)

你想要做的事情是在各种艺术品的名称下,“corner-pin”是视觉效果行业中常用的。您需要分两步进行:

  1. 计算从所需的校正图像到原始的扭曲图像的映射
  2. 实际上根据(1)中计算的映射扭曲原始图像。
  3. 原始图像的4个(非共线,透视失真)角和目标(未失真)图像的4个角定义了映射。此映射称为“homography” - 阅读指向的维基百科页面以获取详细信息。一旦映射已知,步骤(2)的变形可以通过插值计算:对于目标图像中的每个像素,找到原始图像中的对应像素。由于这通常不在整数坐标处,因此您可以从邻居中插入其颜色。使用各种插值方案,常见的是最近邻,双线性和双三次(在结果中以平滑度的递增顺序)。

    对于Android,我建议安装OpenCV SDK,然后使用geometry transformation routines(上述两个步骤的getPerspectiveTransform和warpPerspective)。