2014-04-29 2 views
0

저는 OpenNI 2.x, C++, OpenCV를 사용하여 kinect를 연구하고 있습니다.Kinect 심도 이미지를 실제 좌표로 변환

kinect 깊이 스트리밍을 얻을 수 있고 회색조 cv :: Mat를 얻을 수 있습니다. 어떻게 정의되는지를 보여주기 위해 :

가장 가까운 값을 "0"으로 가장 멀리 "255"라고 가정합니다.

그런 다음 깊이 좌표와 세계 좌표 사이의 변환을 수행합니다. 저는 cv :: Mat 그레이 스케일 행렬의 원소로 요소를 만들고, PointsWorld [640 * 480]에서 데이터를 수집합니다. 이러한 데이터를 표시하기 위해 2000x2000x2000 매트릭스에서 값을 수집하기 위해 눈금을 조정합니다.

cv::Point3f depthPoint; 
cv::Point3f PointsWorld[640*480]; 
for (int j=0;j<m_depthImage.rows;j++) 
    { 
     for(int i=0;i<m_depthImage.cols; i++) 
     { 
      depthPoint.x = (float) i; 
      depthPoint.y = (float) j; 
      depthPoint.z = (float) m_depthImage.at<unsigned char>(j, i); 

      if (depthPoint.z!=255) 
      { 
        openni::CoordinateConverter::convertDepthToWorld(*m_depth,depthPoint.x,depthPoint.y,depthPoint.z, &wx,&wy,&wz); 
       wx = wx*7,2464; //138->1000 
       if (wx<-999) wx = -999; 
       if (wx>999)  wx = 999; 

       wy = wy*7,2464; //111->1000 with 9,009 
       if (wy<-999) wy = -999; 
       if (wy>999)  wy = 999; 

       wz=wz*7,8431; //255->2000 
       if (wz>1999)  wy = 1999; 

       Xsp = P-floor(wx); 
       Ysp = P+floor(wy); 
       Zsp = 2*P-floor(wz); 

       PointsWorld[k].x = Xsp; 
       PointsWorld[k].y = Ysp; 
       PointsWorld[k].z = Zsp; 

       k++; 
      } 
     } 
    } 

하지만 그렇게하면 포인트 사이의 실제 거리를 이해할 수 없습니다. x, y, z 좌표는 무엇을 의미할까요? 점 사이의 실제 거리를 알 수있는 방법이 있습니다. 예를 들어, 행렬 "255"의 회색 값과 같이 멀리 있는지 알 수 있습니까? 그리고 wx, wy, wz 그들이 무엇을 위해서입니까?

+0

을? 깊이를 표시하려면이 작업을 수행하고 있습니까? 또는 점 사이의 거리를 구해야합니까? 두 번째 경우 double/float 값을 사용하거나 PCL과 같은 다른 라이브러리를 사용하는 것이 좋습니다. 이미지를 저장할 수 있도록 저울을 만든 경우 yml/xml (opencv filestorage) 또는 .pcd 파일 (PCL)과 같은 다른 방법으로 저장해야합니다. – api55

답변

1

당신이 OpenCV의이 OpenNI 지원으로 구축 한 경우 같은 것을 할 수 있어야한다 : 왜 당신은 0에서 255 사이의 깊이를 대표하는

int ptcnt; 
cv::Mat real; 
cv::Point3f PointsWorld[640*480]; 
if(capture.retrieve(real, CV_CAP_OPENNI_POINT_CLOUD_MAP)){ 
    for (int j=0;j<m_depthImage.rows;j++) 
    { 
     for(int i=0;i<m_depthImage.cols; i++){ 
      PointsWorld[ptcnt] = real.at<cv::Vec3f>(i,j); 
      ptcnt++; 
     } 
    } 
} 
관련 문제