在 Android 上使用 OpenCV 超快速位图 180 度旋转
Super fast Bitmap 180 degrees rotation using OpenCV on Android
我正在寻找一种使用 OpenCV 在 Android 上快速旋转 Bitmap
180 度的方法。此外,Bitmap
可以原地轮换,即不分配额外的内存。
这里riwnodennyk described different methods of rotating Bitmap
s and compared their performances: . Here is GitHub repository for this study: https://github.com/riwnodennyk/ImageRotation.
这项研究不包括 OpenCV 实施。因此,我尝试了自己的 OpenCV 旋转器实现(仅 180 度)。
我测试图片的最佳旋转方式如下:
- OpenCV:13 毫秒
- NDK:15 毫秒
- 通常:29 毫秒
因为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 倍。
我正在寻找一种使用 OpenCV 在 Android 上快速旋转 Bitmap
180 度的方法。此外,Bitmap
可以原地轮换,即不分配额外的内存。
这里riwnodennyk described different methods of rotating Bitmap
s and compared their performances: . Here is GitHub repository for this study: https://github.com/riwnodennyk/ImageRotation.
这项研究不包括 OpenCV 实施。因此,我尝试了自己的 OpenCV 旋转器实现(仅 180 度)。
我测试图片的最佳旋转方式如下:
- OpenCV:13 毫秒
- NDK:15 毫秒
- 通常:29 毫秒
因为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 倍。