奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题

相机:Gemini 3D双目结构光深度相机
环境:Android7.1
软件:SDK中的java demo下的depthforopenni2
问题:
在Android样例depthforopenni2的OpenGLView中,读取深度数据后,转为点云并保存为文件,用点云工具查看点云效果,总是有很多噪点,而且这些噪点都是从相机向外延伸状;但用SDK的PC样例运行同样的过程,点云效果就很干净;手动编译c++样例到linux环境下,点云效果也很干净;
噪点效果类似下图:
奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题_第1张图片
“锥型”图底部是正确的点云效果,其他都是噪点。

深度转点云的过程如下:
ByteBuffer byteBuffer = frame.getData();//深度数据

NativeUtil.test(byteBuffer);//JNI方法,把深度数据转为点云,并保存为文件

JNI方法代码如下:

extern “C”
JNIEXPORT void JNICALL Java_PclNativeUtils_test(JNIEnv env,jclass clazz,jobject depBuff)
{
pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
int error_count = 0;
char buff = (char)malloc(500 1024 1024);
short srcBuf = (short )env->GetDirectBufferAddress(depBuff);
unsigned int depth;
int cum=0;
int filteredCnt = 0;
for (int v = 0; v < height; ++v)//240
{
for (int u = 0; u < width; ++u)//320
{
depth = srcBuf[vwidth+u];
if (depth <= 0 || depth < min_depth || depth > max_depth)
{continue;}
   //分辨率缩放,这里假设标定时的分辨率分RESOULTION_X,RESOULTION_Y
        float fdx = f_x * ((float)(width) / RESOULTION_X);
        float fdy = f_y * ((float)(height) / RESOULTION_Y);
        float u0 = c_x * ((float)(width) / RESOULTION_X);
        float v0 = c_y * ((float)(height) / RESOULTION_Y);
        float tx = (u - u0) / fdx;
        float ty = (v - v0) / fdy;
        cloud->points[cum].x = depth * tx;
        cloud->points[cum].y = depth * ty;
        cloud->points[cum].z = depth;
        cum+=1;
    }
}
cloud->resize(cum+1);
char oriName[64]  = "";
sprintf(oriName,"storage/emulated/0/pcd/yuanshi.pcd");
pcl::io::savePCDFile(oriName, *cloud);

}

也就是把深度数据转为点云后,保存为文件。

同样的JNI代码,移植到AstraSDKJavaDemo样例中,效果一样,深度数据转点云后,非常多噪点。但用windows样例获取深度数据,调用同样的方法转换为点云,则没有任何噪点。

想请教:这种情况是相机的AndroidSDK驱动不兼容有问题?还是我们使用方法有问题?因为我们一定要在Android平台上使用深度相机,但现在噪点问题无法解决,已经无法往前推进了。希望能得到及时的技术帮助。谢谢

备注:
点击下面链接,进入奥比中光开发者社区,了解更多3D视觉技术信息:https://developer.orbbec.com.cn/
或扫描下方二维码,进入奥比中光开发者社区:
奥比中光Gemini 3D双目结构光深度相机在Android平台上深度数据噪点非常多的问题_第2张图片

你可能感兴趣的:(开发者,结构光,3D视觉,人工智能,深度学习)