Я работаю с Kinect, используя OpenNI 2.x, C ++, OpenCV.
Я могу получить потоковую глубину kinect и получить шкалу серого cv :: Mat. просто чтобы показать, как это определяется:
cv::Mat m_depthImage;
m_depthImage= cvCreateImage(cvSize(640, 480), 8, 1);
Я предполагаю, что самое близкое значение представлено «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 для чего они нужны?
Если у вас есть OpenCV, созданный с поддержкой OpenNI, вы сможете сделать что-то вроде:
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++;
}
}
}