iOS ARKit AVDepthData возвращает огромные числа - PullRequest
0 голосов
/ 27 июня 2019

Не уверен, что я делаю не так, но AVDepthData, который должен быть в метрах для данных, не имеющих диспаратности, возвращает ОГРОМНЫЕ числа. У меня есть код ...

-(bool)getCurrentFrameDepthBufferIntoBuffer:(ARSession*)session buffer:(BytePtr)buffer width:(int)width height:(int)height bytesPerPixel:(int)bytesPerPixel
{
    // do we have a current frame
    if (session.currentFrame != nil)
    {
        // do we have a captured image?
        if (session.currentFrame.capturedDepthData != nil)
        {
            // get depth data parameters
            int ciImageWidth = (int)CVPixelBufferGetWidth(session.currentFrame.capturedDepthData.depthDataMap);
            int ciImageHeight = (int)CVPixelBufferGetHeight(session.currentFrame.capturedDepthData.depthDataMap);
            // how many bytes per pixel
            int bytesPerPixel;
            if (session.currentFrame.capturedDepthData.depthDataType == kCVPixelFormatType_DisparityFloat16 ||
                session.currentFrame.capturedDepthData.depthDataType == kCVPixelFormatType_DepthFloat16)
                bytesPerPixel = 2;
            else
                bytesPerPixel = 4;

            // copy to passed buffer
            CVPixelBufferLockBaseAddress(session.currentFrame.capturedDepthData.depthDataMap, kCVPixelBufferLock_ReadOnly);
            memcpy(buffer, session.currentFrame.capturedDepthData.depthDataMap, ciImageWidth*ciImageHeight*bytesPerPixel);

            float *floatBuffer = (float*)buffer;
            float maxDepth = 0.0f;
            float minDepth = 0.0f;
            for (int i=0; i < ciImageWidth*ciImageHeight; i++)
            {
                if (floatBuffer[i] > maxDepth)
                    maxDepth = floatBuffer[i];
                if (floatBuffer[i] < minDepth)
                    minDepth = floatBuffer[i];
            }

            NSLog(@"In iOS, max depth is %f min depth is %f", maxDepth, minDepth);
            CVPixelBufferUnlockBaseAddress(session.currentFrame.capturedDepthData.depthDataMap, kCVPixelBufferLock_ReadOnly);
        }
    }

    return true;
}

Но он возвращает минимальное и максимальное значения, такие как ...

2019-06-27 12: 32: 32.167868 + 0900 AvatarBuilder [13577: 2650159] В iOS максимальная глубина составляет 3531476501829561451725831270301696000.000000 мин. Глубина составляет -109677129931746407817494761329131520.000000

Что не похоже на метры.

1 Ответ

0 голосов
/ 27 июня 2019

Тьфу, это был мой memcpy.Я должен был сделать ...

            float *bufferAddress = (float*)CVPixelBufferGetBaseAddress(session.currentFrame.capturedDepthData.depthDataMap);
        memcpy(buffer, bufferAddress, ciImageWidth*ciImageHeight*bytesPerPixel);
...