Calcule el histogtwig de una image utilizando vImageHistogramCalculation

Estoy intentando calcular el histogtwig de una image usando vImageHistogramCalculation_ARGBFFFF de vImageHistogramCalculation_ARGBFFFF , pero vImage_Error un vImage_Error del tipo kvImageNullPointerArgument (código de error a -21772).

Aquí está mi código:

 - (void)histogramForImage:(UIImage *)image { //setup inBuffer vImage_Buffer inBuffer; //Get CGImage from UIImage CGImageRef img = image.CGImage; //create vImage_Buffer with data from CGImageRef CGDataProviderRef inProvider = CGImageGetDataProvider(img); CFDataRef inBitmapData = CGDataProviderCopyData(inProvider); //The next three lines set up the inBuffer object inBuffer.width = CGImageGetWidth(img); inBuffer.height = CGImageGetHeight(img); inBuffer.rowBytes = CGImageGetBytesPerRow(img); //This sets the pointer to the data for the inBuffer object inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData); //Prepare the parameters to pass to vImageHistogramCalculation_ARGBFFFF vImagePixelCount *histogram[4] = {0}; unsigned int histogram_entries = 4; Pixel_F minVal = 0; Pixel_F maxVal = 255; vImage_Flags flags = kvImageNoFlags; vImage_Error error = vImageHistogramCalculation_ARGBFFFF(&inBuffer, histogram, histogram_entries, minVal, maxVal, flags); if (error) { NSLog(@"error %ld", error); } //clean up CGDataProviderRelease(inProvider); } 

Sospecho que tiene algo que ver con mi parámetro de histogram , que, según los documentos, se supone que es "un puntero a una matriz de cuatro histogtwigs". ¿Lo estoy declarando correctamente?

Gracias.

El problema es que no estás asignando espacio para sostener los histogtwigs calculados. Si solo usa los histogtwigs localmente, puede colocarlos en la stack como tal [tenga en count que estoy usando ocho contenedores en lugar de cuatro, para dejar el ejemplo más claro]:

 // create an array of four histograms with eight entries each. vImagePixelCount histogram[4][8] = {{0}}; // vImageHistogramCalculation requires an array of pointers to the histograms. vImagePixelCount *histogramPointers[4] = { &histogram[0][0], &histogram[1][0], &histogram[2][0], &histogram[3][0] }; vImage_Error error = vImageHistogramCalculation_ARGBFFFF(&inBuffer, histogramPointers, 8, 0, 255, kvImageNoFlags); // You can now access bin j of the histogram for channel i as histogram[i][j]. // The storage for the histogram will be cleaned up when execution leaves the // current lexical block. 

Si necesita que los histogtwigs se mantengan fuera del scope de su function, deberá asignarles espacio en el montón:

 vImagePixelCount *histogram[4]; unsigned int histogramEntries = 8; histogram[0] = malloc(4*histogramEntries*sizeof histogram[0][0]); if (!histogram[0]) { // handle error however is appropriate } for (int i=1; i<4; ++i) { histogram[i] = &histogram[0][i*histogramEntries]; } vImage_Error error = vImageHistogramCalculation_ARGBFFFF(&inBuffer, histogram, 8, 0, 255, kvImageNoFlags); // You can now access bin j of the histogram for channel i as histogram[i][j]. // Eventually you will need to free(histogram[0]) to release the storage. 

Espero que esto ayude.