在 Android 上使用 OpenCV 超快速位图 180 度旋转

Super fast Bitmap 180 degrees rotation using OpenCV on Android

我正在寻找一种使用 OpenCV 在 Android 上快速旋转 Bitmap 180 度的方法。此外,Bitmap 可以原地轮换,即不分配额外的内存。

这里riwnodennyk described different methods of rotating Bitmaps and compared their performances: . Here is GitHub repository for this study: https://github.com/riwnodennyk/ImageRotation.

这项研究不包括 OpenCV 实施。因此,我尝试了自己的 OpenCV 旋转器实现(仅 180 度)。

我测试图片的最佳旋转方式如下:

因为OpenCV的性能看起来很有前途,而我的实现好像没有优化,所以我决定问问你如何更好地实现它。

我的实施与评论:

@Override
public Bitmap rotate(Bitmap srcBitmap, int angleCcw) {
    Mat srcMat = new Mat();
    Utils.bitmapToMat(srcBitmap, srcMat); // Possible memory allocation and copying
    
    Mat rotatedMat = new Mat();
    Core.flip(srcMat, rotatedMat, -1); // Possible memory allocation
    
    Bitmap dstBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.ARGB_8888); // Unneeded memory allocation
    Utils.matToBitmap(rotatedMat, dstBitmap); // Unneeded copying

    return dstBitmap;
}

我想有 3 个地方可能会发生不必要的分配和复制。

是否可以摆脱这些不必要的操作?

我实现了快速位图旋转库。

性能(大约):

  • 比矩阵旋转法快 5 倍。
  • 比Ndk旋转法快3.8倍
  • 比 OpenCV 旋转方法快 3.3 倍。

https://github.com/ivankrylatskoe/fast-bitmap-rotation-lib