【发布时间】:2017-09-11 09:25:15
【问题描述】:
您好,我正在尝试在 android 中实现 dlib 面部地标检测。我知道,但我需要尽可能多的 fps。我面临两个问题,
- 转化链
- 调整大小
目前,我从preview callback 设置为camera 获取数据。它输出 NV21 图像的byte[]。由于 dlib 不知道 image 并且只知道 array2d<dlib::rgb_pixel>,因此我需要将数据与它一致。我得到的实现使用位图,当我尝试使用那里的代码时,我有一个转换链byte[]->bmp->array2d,我想实现一个byte[]->array2d 转换。
现在,我需要通过操纵输入图像的大小来利用 dlib 的性能。我的用例虽然不涉及小脸,所以我可以缩小输入图像以提高性能,但是可以说我成功地进行了byte[]->array2d 转换,我该如何调整图像的大小?在位图中调整大小虽然有许多快速实现,但我需要减少位图参与以提取更多 fps。我可以选择调整byte[] 或转换后的array2d 的大小,但同样......如何?我猜想在转换后调整大小是件好事,因为它现在将在本机而不是 java 上运行。
编辑
缩小应该以byte[](而不是dlib::arrray2d)形式作为输入,因为我需要在缩小的byte[]上做一些事情。
所以我的最后一个问题是在 jni 上实现这个
byte[] resize(ByteArray img, Size targetSize);
和
dlib::array2d<rgb_pixel> convert(ByteArray img);
【问题讨论】:
-
您可以看到如何使用 renderscript(基于 GPU 的 Android 数字运算器)将相机 YUV 转换为 RGB:stackoverflow.com/a/20788170/192373。关于调整大小,如果可以只使用简单的比例(例如 1280×720 ➡ 640×360),您可以在同一步骤中进行管理。
-
我不确定 dlib 是否会在较小的图像上产生好的答案,您需要仔细的基准测试。
-
嗨@AlexCohn,我已经做了这两种方法。转换器运行良好,但还没有看到图像,我只是从 dlib 获取输出地标,它给了我结果。调整大小,我刚写完,希望你能帮我复习一下。是的,它只是一个保持比例的简单调整大小。 gist.github.com/novodimaporo/a13ab0ef03a61c0f47d518f0c82aee26
-
dlib 处理不同图像尺寸需要多长时间?
-
我在 1024x768 @AlexCohn 上得到约 110 毫秒
标签: android c++ bitmap java-native-interface dlib