【问题标题】:how to apply perspective transformation to ImageProxy or Bitmap in android如何在android中将透视变换应用于ImageProxy或Bitmap
【发布时间】:2020-07-31 05:51:29
【问题描述】:

我的目标是从头开始创建一个扫描仪应用程序。为此,我在 java 中使用 android 中的 CameraX 库。假设我已经检测到页面的角落。拍摄图像后,如何对图像进行变换矩阵乘法? (我遵循here 提到的算法,除了尝试在 java 中执行)我需要矩阵中的图像,以便我可以将每个像素位置(例如 [i, j, 1])乘以我的 3x3 变换矩阵以获得新的位置。然后,我将有另一个矩阵,如果它在我想要显示的区域内,我将记录转换的像素的颜色。最后,我会将最终的矩阵转换为图像。

所以基本上,我的问题是:

  1. 如何在 java 中对 camerax 中捕获的图像执行操作
  2. 如何将图像转换为矩阵(执行上述操作),然后将矩阵转换回图像

我希望当用户单击捕获按钮时,记录文档角的最新坐标,并使用转换矩阵对捕获的图像进行转换。

【问题讨论】:

    标签: java android-studio math android-camerax


    【解决方案1】:

    android.graphics.Matrix是Android中的3x3透视变换矩阵。示例:

    val matrix = Matrix()
    matrix.setPolyToPoly(docVertexes, 0, bitmapVertexes, 0, 4)
    Bitmap transformedBitmap = Bitmap.createBitmap(
                sourceBitmap,
                0,
                0,
                sourceBitmap.getWidth(),
                sourceBitmap.getHeight(),
                quadToRect,
                true);
    

    【讨论】:

    • 但根据this 的帖子,setPolyToPoly 在某些情况下不起作用。另外,我想实现视角扭曲和变换自己,我已经知道如何做到这一点。我需要的是在 Matrix 之间转换图像,并专门使用 camerax 图像捕获来做到这一点
    • 该错误不在 Matrix.setPolyToPoly() 中,而是在 Canvas 中。根本原因 IIRC,与 Android 使用的 Skia 图形库中的 CPU 光栅化器有关。我以不会触发错误的方式更新了我的示例。你介意解释一下为什么你更喜欢DIY吗?有效且正确地执行此操作通常涉及本机 C++ 和/或 GPU。即使你知道所有的数学,这也是很多工作。
    • 我只是想DIY,有几个原因。一是我了解了该过程背后的数学和代码。其次,如果我自己做,它会大大减少 apk 的大小。当我第一次开始这个时,我研究了其他人是如何做到这一点的,他们都使用了 OpenCV 和其他 Img。过程。减少代码但通过添加冗余代码使应用程序变得非常大的库。我将尝试使用您提到的方法来实现它,但是您知道如何将它与 camerax 一起使用吗?我对 android dev 还很陌生,因为 camerax 的大部分代码都在 kotlin 中,所以我找不到如何使用它
    • 请看一下 ImageCapture#takePicture(Executor, OnImageCapturedCallback)。在 OnImageCapturedCallback 中,您可以获得一个可以转换为位图的 ImageProxy。请参阅:stackoverflow.com/questions/41775968/… 然后您可以从那里应用上面的示例。
    猜你喜欢
    • 2010-09-25
    • 2023-04-06
    • 2011-01-25
    • 2022-08-22
    • 2019-10-27
    • 1970-01-01
    • 2013-10-08
    相关资源
    最近更新 更多