NV21 字节数组到 array2d<rgb_pixel>



嗨,我正在尝试在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);

这个问题对我有很大帮助,并使我理解了NV21结构。在问题中使用代码我能够从nv21 byte[] to array2d<rgb>开发转换器。

现在剩下的未完成的是调整大小。

在Java中执行任何调整大小的大小可能是不好的,因为编译器优化差。您最性能的选项CPU可能是在C 中编写一个专门的NV12,然后转换为RGB。交换订单可能只会稍慢一些,并且编写更容易。

您的其他选择是使用着色器在GPU上完成所有选择。GPU在这种事情上的速度更快,但是它们很柔软。无论如何,您可能需要CPU后备(如果出于gpu出于何种原因,不熟悉Android)。

最新更新