我正在使用OpenNI 1.5.4.0和OpenCV 2.4.5,加上用于可视化目的(仅RGB图像)的Qt。 基本上,我是从一个超高动力学检索深度和RGB帧,并将它们存储在硬盘驱动器上,利用转换:cv :: Mat和XnDepthPixel之间的转换*
/* 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包含以毫米为现实世界的数据
确定sorry..i我还是新来的平台 – madduci 2013-05-13 14:52:09