【问题标题】:NV21 ByteArray to array2d<rgb_pixel>NV21 ByteArray 到 array2d<rgb_pixel>
【发布时间】:2017-09-11 09:25:15
【问题描述】:

您好,我正在尝试在 android 中实现 dlib 面部地标检测。我知道,但我需要尽可能多的 fps。我面临两个问题,

  • 转化链
  • 调整大小

目前,我从preview callback 设置为camera 获取数据。它输出 NV21 图像的byte[]。由于 dlib 不知道 image 并且只知道 array2d&lt;dlib::rgb_pixel&gt;,因此我需要将数据与它一致。我得到的实现使用位图,当我尝试使用那里的代码时,我有一个转换链byte[]-&gt;bmp-&gt;array2d,我想实现一个byte[]-&gt;array2d 转换。

现在,我需要通过操纵输入图像的大小来利用 dlib 的性能。我的用例虽然不涉及小脸,所以我可以缩小输入图像以提高性能,但是可以说我成功地进行了byte[]-&gt;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


【解决方案1】:

This的问题对我帮助很大,让我了解了nv21的结构。使用问题中的代码,我能够从nv21 byte[] to array2d&lt;rgb&gt; 开发一个转换器。

现在剩下的就是调整大小。

【讨论】:

    【解决方案2】:

    由于编译器优化不佳,在 Java 中执行任何调整大小都可能很糟糕。在 CPU 方面,您最高效的选择可能是在 C++ 中编写专门的 NV12 调整大小,然后转换为 RGB。不过,交换顺序可能只会稍微慢一些,而且更容易编写。

    您的另一个选择是使用着色器在 GPU 上完成所有这些操作。 GPU 在这种事情上要快得多,但它们很笨拙。无论如何,您可能都需要 CPU 后备(如果 GPU 因任何原因不可用,不熟悉 Android)。

    【讨论】:

    • 嗯,是的,我想我需要使用着色器语言崩溃,它速度很快,但与 c++ dlib 相去甚远(至少对于我知道的方法),并导出数据 @987654321 @ 我猜太复杂了,对着色器语言不太熟悉。
    猜你喜欢
    • 2015-05-21
    • 2015-05-22
    • 2019-12-26
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多