私は 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* データを直接使用して「オンライン」処理を行うと、前に記述した式を使用して結果は完璧になります。私の過ちについて「ヒント」をくれる人はいますか?
前もって感謝します
編集:私はこのリソースもフォローしていましたが、XnDepthPixelにはミリメートル単位の実世界のデータが含まれているため、うまくいきません