Project Tango Point Cloud 奇怪的崩溃,以及密集的深度图
Project Tango Point Cloud strange crash, and dense depth map
我正在尝试使用 Project Tango C API,但是如果使用以下代码
int width = mImageSource->getDepthImageSize().x;
int height = mImageSource->getDepthImageSize().y;
double fx = mImageSource->calib.intrinsics_d.projectionParamsSimple.fx;
double fy = mImageSource->calib.intrinsics_d.projectionParamsSimple.fy;
double cx = mImageSource->calib.intrinsics_d.projectionParamsSimple.px;
double cy = mImageSource->calib.intrinsics_d.projectionParamsSimple.py;
memset(inputRawDepthImage->GetData(MEMORYDEVICE_CPU), -1, sizeof(short)*width*height);
for (int i = 0; i < XYZ_ij->xyz_count; i++) {
float X = XYZ_ij->xyz[i*3][0];
float Y = XYZ_ij->xyz[i*3][1];
float Z = XYZ_ij->xyz[i*3][2];
if (Z < EPSILON || (X < EPSILON && -X < EPSILON) || (Y < EPSILON && -Y < EPSILON) || X != X || Y != Y || Z != Z)
continue;
int x_2d = (int)(fx*X/Z+cx);
int y_2d = (int)(fy*Y/Z+cy);
if (x_2d >=0 && x_2d < width && y_2d >= 0 && y_2d < height && (x_2d != 0 || x_2d != 0)) {
inputRawDepthImage->GetData(MEMORYDEVICE_CPU)[x_2d + y_2d*width] = (short) (Z*1000);
} else {
continue;
}
}
但是,如果我使用 for (int i = 0; i < XYZ_ij->xyz_count && i < 6500; i++)
一切正常。我只是想知道 C API 是否存在接入点云的上限,或者我做错了什么?
(宽度为320,高度为180,其他内在函数从Tango加载API)
此外,Google提到在bottom of this page中使用最近邻过滤器来获得密集的深度图,Tango API中是否有用于此的接口?或者有人会建议它的开源实现吗?
我也想知道 onXYZijAvailable 中是否有 "pull" 彩色图像 (1280x720),因为我需要密集的同步彩色点云。我是否需要应用外部矩阵来对齐两个坐标系,或者我只需要对彩色图像进行子采样(假设它们的坐标系相同)?
感谢您的任何建议!
在查找深度样本坐标的代码中...
for (int i = 0; i < XYZ_ij->xyz_count; i++) {
float X = XYZ_ij->xyz[i*3][0];
float Y = XYZ_ij->xyz[i*3][1];
float Z = XYZ_ij->xyz[i*3][2];
...您应该使用 i
的索引,而不是 i*3
。它是一个二维数组,因此您不必自己管理更高维度的步幅。
SDK 不提供调用来填充没有深度样本的位置,这可能是因为有许多方法具有不同的权衡。 nearest neighbor search is a reasonable place to start. There is an interface to FLANN in OpenCV.
上的维基百科页面
SDK只会将最新的彩色图片传送给您。如果你想要一张先验图像(例如,时间戳接近你的深度样本),你将不得不自己管理它。因为您永远无法获得与深度样本具有完全相同时间戳的彩色图像(因为两者在不同模式下使用相同的相机),所以理论上您应该应用外部姿势来对齐它们。实际上,如果运动在时间戳之间的 0.5 帧时间或更短时间内很小,我认为大多数人都会忽略它。
我正在尝试使用 Project Tango C API,但是如果使用以下代码
int width = mImageSource->getDepthImageSize().x;
int height = mImageSource->getDepthImageSize().y;
double fx = mImageSource->calib.intrinsics_d.projectionParamsSimple.fx;
double fy = mImageSource->calib.intrinsics_d.projectionParamsSimple.fy;
double cx = mImageSource->calib.intrinsics_d.projectionParamsSimple.px;
double cy = mImageSource->calib.intrinsics_d.projectionParamsSimple.py;
memset(inputRawDepthImage->GetData(MEMORYDEVICE_CPU), -1, sizeof(short)*width*height);
for (int i = 0; i < XYZ_ij->xyz_count; i++) {
float X = XYZ_ij->xyz[i*3][0];
float Y = XYZ_ij->xyz[i*3][1];
float Z = XYZ_ij->xyz[i*3][2];
if (Z < EPSILON || (X < EPSILON && -X < EPSILON) || (Y < EPSILON && -Y < EPSILON) || X != X || Y != Y || Z != Z)
continue;
int x_2d = (int)(fx*X/Z+cx);
int y_2d = (int)(fy*Y/Z+cy);
if (x_2d >=0 && x_2d < width && y_2d >= 0 && y_2d < height && (x_2d != 0 || x_2d != 0)) {
inputRawDepthImage->GetData(MEMORYDEVICE_CPU)[x_2d + y_2d*width] = (short) (Z*1000);
} else {
continue;
}
}
但是,如果我使用 for (int i = 0; i < XYZ_ij->xyz_count && i < 6500; i++)
一切正常。我只是想知道 C API 是否存在接入点云的上限,或者我做错了什么?
(宽度为320,高度为180,其他内在函数从Tango加载API)
此外,Google提到在bottom of this page中使用最近邻过滤器来获得密集的深度图,Tango API中是否有用于此的接口?或者有人会建议它的开源实现吗?
我也想知道 onXYZijAvailable 中是否有 "pull" 彩色图像 (1280x720),因为我需要密集的同步彩色点云。我是否需要应用外部矩阵来对齐两个坐标系,或者我只需要对彩色图像进行子采样(假设它们的坐标系相同)?
感谢您的任何建议!
在查找深度样本坐标的代码中...
for (int i = 0; i < XYZ_ij->xyz_count; i++) {
float X = XYZ_ij->xyz[i*3][0];
float Y = XYZ_ij->xyz[i*3][1];
float Z = XYZ_ij->xyz[i*3][2];
...您应该使用 i
的索引,而不是 i*3
。它是一个二维数组,因此您不必自己管理更高维度的步幅。
SDK 不提供调用来填充没有深度样本的位置,这可能是因为有许多方法具有不同的权衡。 nearest neighbor search is a reasonable place to start. There is an interface to FLANN in OpenCV.
上的维基百科页面SDK只会将最新的彩色图片传送给您。如果你想要一张先验图像(例如,时间戳接近你的深度样本),你将不得不自己管理它。因为您永远无法获得与深度样本具有完全相同时间戳的彩色图像(因为两者在不同模式下使用相同的相机),所以理论上您应该应用外部姿势来对齐它们。实际上,如果运动在时间戳之间的 0.5 帧时间或更短时间内很小,我认为大多数人都会忽略它。