代码之家  ›  专栏  ›  技术社区  ›  James Alvarez

如何从cvPixelBuffer读取单个像素

  •  0
  • James Alvarez  · 技术社区  · 6 年前

    avdepthdata给了我一个cvPixelBuffer深度数据。但我找不到一种方法来轻松访问这个cvpixelbuffer中的深度信息。目标C中是否有一个简单的方法可以做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   James Alvarez    6 年前

    您必须使用cvPixelBuffer API来获得通过不安全的指针操作访问数据的正确格式。以下是基本方法:

    CVPixelBufferRef pixelBuffer = _lastDepthData.depthDataMap;
    
    CVPixelBufferLockBaseAddress(pixelBuffer, 0);
    
    size_t cols = CVPixelBufferGetWidth(pixelBuffer);
    size_t rows = CVPixelBufferGetHeight(pixelBuffer);
    Float32 *baseAddress = CVPixelBufferGetBaseAddress( pixelBuffer );
    
    // This next step is not necessary, but I include it here for illustration,
    // you can get the type of pixel format, and it is associated with a kCVPixelFormatType
    // this can tell you what type of data it is e.g. in this case Float32
    
    OSType type = CVPixelBufferGetPixelFormatType( pixelBuffer);
    
    if (type != kCVPixelFormatType_DepthFloat32) {
        NSLog(@"Wrong type");
    }
    
    // Arbitrary values of x and y to sample
    int x = 20; // must be lower that cols
    int y = 30; // must be lower than rows
    
    // Get the pixel.  You could iterate here of course to get multiple pixels!
    int baseAddressIndex = y  * (int)cols + x;
    const Float32 pixel = baseAddress[baseAddressIndex];
    
    CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );
    

    请注意,首先需要确定的是cvPixelBuffer中的数据类型-如果您不知道这一点,则可以使用cvPixelBufferGetPixelFormatType()查找。在本例中,我在float32处获取深度数据,如果您使用的是另一种类型,例如float16,那么您将需要用该类型替换所有出现的float32。

    请注意,使用cvPixelBufferLockBaseAddress和cvPixelBufferUnlockBaseAddress锁定和解锁基址很重要。