我正在尝试使用NDK进行一些图像处理。我不使用opencv。
我对Android很新,所以我是在逐步完成这项工作。我开始写一个简单的应用程序,让我从相机捕获视频并将其显示在屏幕上。我完成了这件事。
然后我尝试以原生方式操纵相机数据。但是,onPreviewFrame使用字节数组来捕获帧信息。这是我的代码 -
public void onPreviewFrame(byte[] arg0, Camera arg1)
{
if (imageFormat == ImageFormat.NV21)
{
if ( !bProcessing )
{
FrameData = arg0;
mHandler.post(callnative);
}
}
}
而callnative runnable就是这样 -
private Runnable callnative = new Runnable()
{
public void run()
{
bProcessing = true;
String returnNative = callTorch(MainActivity.assetManager, PreviewSizeWidth, PreviewSizeHeight, FrameData, pixels);
bitmap.setPixels(pixels, 0, PreviewSizeWidth, 0, 0, PreviewSizeWidth, PreviewSizeHeight);
MycameraClass.setImageBitmap(bitmap);
bProcessing = false;
}
};
问题是,我需要在native中使用FrameData作为float数据类型。但是,它采用bytearray的形式。我想知道帧数据是如何存储的。这是一个2维的字节数组吗?那么相机会返回一个8位图像并将其存储为640x480字节?如果是这样,C以什么形式解释这个字节数据类型?我可以简单地将其转换为浮动吗?我有这个本地 -
jbyte *nativeData;
nativeData = (env)->GetByteArrayElements(NV21FrameData,NULL);
__android_log_print(ANDROID_LOG_INFO, "Nativeprint", "nativedata is: %d",(int)nativeData[0]);
然而,这打印-22让我相信我正在尝试打印指针。我不知道为什么会这样。
我将不胜感激。
答案 0 :(得分:0)
您将无法从像素缓冲区获取任何浮点数据类型。数据为字节, C 中的数据为 char 数据类型。
所以这个: jbyte * nativeData =(env) - > GetByteArrayElements(NV21FrameData,NULL);
与此相同: char * nativeData =(char *)((env) - > GetByteArrayElements(NV21FrameData,NULL));
数据存储为1维数组,因此您将检索按宽度,高度和x和y计算运算的每个像素。
还要记住样本中的预览相机帧在YUV420sp中,这意味着您需要先将数据从YUV转换为RGB,然后才能在位图中进行设置。