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