1

私は 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にはミリメートル単位の実世界のデータが含まれているため、うまくいきません

4

2 に答える 2

0

ここに問題がある可能性があると思います:

depth = depth_image.at<int>(j,i);  //depth_image is stored as 16bit

深度画像が本当に 16 ビットである場合、実際には次のようになります。

depth = depth_image.at<short>(j,i);  //depth_image is stored as 16bit

int16ビットではなく32ビットだからです。

于 2013-05-11T16:19:11.000 に答える