Android imageview的透视校正

Android imageview的透视校正,android,image-processing,Android,Image Processing,我正在开发一款应用程序,需要对手机摄像头拍摄的照片进行透视失真校正。 拍摄完照片后,想法是将其显示在imageview上,让用户标记文档的四个角(一张卡片、一张纸等),然后根据这些点进行校正。 这是我试图实现的一个例子: 关于如何在android上实现这一点,你有什么想法吗 你想做的事有各种各样的艺术名称,“角针”是视觉效果行业常用的一种。您需要分两步进行: 计算从所需矫正图像到原始扭曲图像的映射 实际上,根据(1)中计算的贴图扭曲原始图像 原始图像的4个角点(非共线、透视畸变)和目标图像的4

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


关于如何在android上实现这一点,你有什么想法吗

你想做的事有各种各样的艺术名称,“角针”是视觉效果行业常用的一种。您需要分两步进行:

  • 计算从所需矫正图像到原始扭曲图像的映射
  • 实际上,根据(1)中计算的贴图扭曲原始图像
  • 原始图像的4个角点(非共线、透视畸变)和目标图像的4个角点(未畸变)定义了贴图。此映射称为“”-有关详细信息,请阅读指向的wikipedia页面。一旦知道映射,就可以通过插值计算步骤(2)中的扭曲:对于目标图像中的每个像素,找到原始图像中对应的像素。由于这通常不在整数坐标处,因此可以从相邻点对其颜色进行插值。使用了各种插值方案,常见的是最近邻、双线性和双三次插值(在结果中以平滑度递增的顺序)


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

    您不必为此使用库。 您也可以使用
    Canvas
    类的
    drawBitmap
    函数之一和使用
    matrix
    类的
    setpolytoply
    函数初始化的矩阵

    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, // 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
    是目标点的坐标。结果:


    非常感谢您的解释!我将尝试使用OpenCV。@Attila Tanyi,根据您的示例,左边缘是固定的,右边缘是移动的,我希望右边缘应该固定和移动左边缘,同样地,顶部和底部也是如此。我该怎么办?有什么建议吗?@GyanSwaroopAwasthi-我编辑了我的答案,现在这些数字应该更有意义了。您应该更改示例中的
    dst
    float数组。如果它与
    src
    数组的数字完全相同,则位图保持不变。除此之外,您只需要更改需要移动的点的坐标。坐标是(x,y)对,其中x是列(从左到右),y是行(从上到下)。