【发布时间】:2013-05-04 22:47:45
【问题描述】:
我正在使用 OpenNI 1.5.4.0 和 OpenCV 2.4.5,以及用于可视化目的的 Qt(仅限 RGB 图像)。 基本上,我从 Kinect 中检索深度和 rgb 帧并将它们存储在硬盘上,使用转换:
/* Depth conversion */
cv::Mat depth = cv::Mat(2, sizes, CV_16UC1, (void*) pDepthMap); //XnDepthPixel *pDepthMap
/* RGB conversion */
///image is a QImage* , pImageMap is a XnUInt8*
for(int i = 0; i < height; ++i)
{
for (unsigned y = 0; y < height; ++y)
{
uchar *imagePtr = (*image).scanLine(y);
for (unsigned x=0; x < width; ++x)
{
imagePtr[0] = pImageMap[2];
imagePtr[1] = pImageMap[1];
imagePtr[2] = pImageMap[0];
imagePtr[3] = 0xff;
imagePtr+=4;
pImageMap+=3;
}
}
}
现在,我想从硬盘加载这些图像,以便将 3D 点云计算为后处理计算。 我将深度图加载为:
depth_image = cv::imread(m_rgb_files.at(w).toStdString(), CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
但应用公式:
depth = depth_image.at<int>(j,i); //depth_image is stored as 16bit
p.z = (float)depth * 0.001f; //converting from millimeters to meters
p.x = (float)(i - m_params.center_x) * depth * m_params.focal_length; //focal_length read using OpenNI function
p.y = (float)(j - m_params.center_y) * depth * m_params.focal_length;
得到的点云一团糟。
如果我直接使用本机 XnDepthPixel* 数据进行“在线”处理,结果是完美的,使用之前编写的公式。 谁能给我一个关于我的错的“提示”?
提前致谢
编辑:我也在关注这个resource,但它对我不起作用,因为 XnDepthPixel 包含以毫米为单位的真实世界数据
【问题讨论】:
-
好吧对不起..我还是这个平台的新手
标签: c++ qt opencv image-processing openni