Что эквивалентно pmdGet3DCoordinates для 3D-камеры Intel RealSense (SR300)?

Сейчас я пытаюсь написать аналогичный код для камеры PMD для 3D-камеры Intel RealSense (SR300). Однако я не могу найти метод, который делает то же самое в RealSense SDK. Есть ли хак для этого или что вы предлагаете?

pmdGet3DCoordinates(PMDHandle hnd, float * data, size_t size);

пример использования:

float * cartesianDist = new float[nRows*nCols*3];
res = pmdGet3DCoordinates(hnd, cartesianDist, nCols*nRows*3*sizeOf(float));

Мне нужна эта функция для создания xyzmap, как в приведенном ниже коде:

int res = pmdGet3DCoordinates(hnd, dists, 3 * numPixels * sizeof(float)); 
xyzMap = cv::Mat(xyzMap.size(), xyzMap.type(), dists);

Я написал следующий код до сих пор, я не знаю, имеет ли это смысл с точки зрения Intel RealSense. Пожалуйста, не стесняйтесь комментировать.

void SR300Camera::fillInZCoords()
{
    //int res = pmdGet3DCoordinates(hnd, dists, 3 * numPixels * sizeof(float)); //store x,y,z coordinates dists (type: float*)
    ////float * zCoords = new float[1]; //store z-Coordinates of dists in zCoords
    //xyzMap = cv::Mat(xyzMap.size(), xyzMap.type(), dists);
    Projection *projection = pp->QueryCaptureManager()->QueryDevice()->CreateProjection();
    std::vector<Point3DF32> vertices;
    vertices.resize(bufferSize.width * bufferSize.height);
    projection->QueryVertices(sample->depth, &vertices[0]);
    xyzBuffer.clear();

    for (int i = 0; i < bufferSize.width*bufferSize.height; i++) {
        //cv::Point3f p;
        //p.x = vertices[i].x;
        //p.y = vertices[i].y;
        //p.z = vertices[i].z;
        //xyzBuffer.push_back(p);
        xyzBuffer.push_back(cv::Point3f(vertices[i].x, vertices[i].y, vertices[i].z));
    }



    xyzMap = cv::Mat(xyzBuffer);
    projection->Release();
}

person Mona Jalal    schedule 15.05.2017    source источник
comment
Вероятно, вы ищете mat.reshape()   -  person Rick M.    schedule 15.05.2017
comment
@РикМ. пожалуйста, проверьте обновление   -  person Mona Jalal    schedule 15.05.2017
comment
Из того, что вы добавили, я все еще не могу сказать, что вы хотите. Я бы еще раз написал первый комментарий, но это всего лишь предположение. Как вам это xyzmap? Матрица мудрая   -  person Rick M.    schedule 16.05.2017
comment
тот же формат, что и xyzMap (cv::Mat) /а>   -  person Mona Jalal    schedule 16.05.2017


Ответы (1)


sts = projection->QueryVertices(depthMap, &pos3D[0]); почти эквивалентен и выполняет работу по преобразованию UV-карты глубины в реальную карту xyz.

   Status sts = sm ->AcquireFrame(true);


        if (sts < STATUS_NO_ERROR) {
            if (sts == Status::STATUS_STREAM_CONFIG_CHANGED) {
                wprintf_s(L"Stream configuration was changed, re-initilizing\n");
                sm ->Close();
            }
        }

        sample = sm->QuerySample();
        PXCImage *depthMap = sample->depth;
        renderd.RenderFrame(sample->depth);
        PXCImage::ImageData depthImage;
        depthMap->AcquireAccess(PXCImage::ACCESS_READ, &depthImage);
        PXCImage::ImageInfo imgInfo = depthMap->QueryInfo();
        int depth_stride = depthImage.pitches[0] / sizeof(pxcU16);
        PXCProjection * projection = device->CreateProjection();
        pxcU16 *dpixels = (pxcU16*)depthImage.planes[0];
        unsigned int dpitch = depthImage.pitches[0] / sizeof(pxcU16);
        PXCPoint3DF32 *pos3D = new PXCPoint3DF32[num_pixels];
        sts = projection->QueryVertices(depthMap, &pos3D[0]);
        if (sts < Status::STATUS_NO_ERROR) {
            wprintf_s(L"Projection was unsuccessful! \n");
            sm->Close();
        }
person Mona Jalal    schedule 27.05.2017