Skip to content
Snippets Groups Projects
HistogramCalculator.m 1.78 KiB
Newer Older
Apple's avatar
Apple committed
/*
See LICENSE folder for this sample’s licensing information.

Abstract:
Class for performing histogram equalization efficiently
*/

#import <Foundation/Foundation.h>
#import "HistogramCalculator.h"

@implementation HistogramCalculator

+(void) calcHistogramForPixelBuffer:(CVPixelBufferRef)pixelBuffer
                           toBuffer:(float*)histogram
                           withSize:(int)size
                          forColors:(int)colors
                           minDepth:(float)minDepth
                           maxDepth:(float)maxDepth
                      binningFactor:(int)factor {
    memset(histogram, 0, size * sizeof(histogram[0]));

    size_t width = CVPixelBufferGetWidth(pixelBuffer);
    size_t height = CVPixelBufferGetHeight(pixelBuffer);
    size_t stride = CVPixelBufferGetBytesPerRow(pixelBuffer);
    
    CVPixelBufferLockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);
    const uint8_t* baseAddress = (const uint8_t*)CVPixelBufferGetBaseAddress(pixelBuffer);
    
    size_t numPoints = 0;
    
    for (size_t y = 0; y < height; ++y) {
        const __fp16* data = (const __fp16*)(baseAddress + y * stride);
        
        for (size_t x = 0; x < width; ++x, ++data) {
            __fp16 depth = *data;
            if (!isnan(depth) && depth > minDepth && depth < maxDepth) {
                ushort binIndex = depth * factor;
                ++histogram[binIndex];
                ++numPoints;
            }
        }
    }
    
    CVPixelBufferUnlockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);

    for (int i = 1; i < size; ++i)
        histogram[i] += histogram[i-1];

    for (int i = 1; i < size; ++i)
        histogram[i] = colors * histogram[i] / numPoints;
    
    for (int i = 1; i < size; ++i)
        histogram[i] = colors - histogram[i];
}

@end