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