NV21 ByteArray到array2d <rgb_pixel>

时间:2017-09-11 09:25:15

标签: android c++ bitmap java-native-interface dlib

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

  • 转换链
  • 调整大小

目前,我正在将preview callback设置的数据转换为camera。它输出byte[] NV21 图像。由于dlib不知道image并且只知道array2d<dlib::rgb_pixel>,我需要将数据符合它。我得到的实现使用位图,当我尝试使用代码时,我有一个转换链byte[]->bmp->array2d,我想实现byte[]->array2d转换。

现在,我需要通过操纵输入到它的图像的大小来利用dlib的性能。我的用例虽然不涉及小面孔,所以我可以缩小输入图像以提高性能,但是假设我成功进行byte[]->array2d转换,我该如何调整图像大小?虽然在位图中调整大小有很多快速实现但我需要减少位图参与以提取更多fps。我可以选择调整byte[]或转换后的array2d的大小,但是再次......怎么样?我猜测转换后调整大小很好,因为它现在将在本机上运行,​​而不是在java上运行。

修改

缩小应该以{{1​​}}(而不是byte[])形式作为输入,因为我需要在缩小的dlib::arrray2d上执行某些操作。

所以我最后的问题是在jni

上实现这个
byte[]

byte[] resize(ByteArray img, Size targetSize);

2 个答案:

答案 0 :(得分:0)

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

您的另一个选择是使用着色器在GPU上执行所有这些操作。在这种情况下,GPU的速度要快得多,但它们很有吸引力。无论如何,您可能需要CPU回退(如果GPU由于某种原因不可用,不熟悉Android)。

答案 1 :(得分:0)

This问题给了我很多帮助,让我了解了nv21的结构。使用问题中的代码,我能够从nv21 byte[] to array2d<rgb>开发转换器。

现在没有爱的是调整大小。