2014-09-02 10 views
4

vImage의 vImageHistogramCalculation_ARGBFFFF을 사용하여 이미지의 막대 그래프를 계산하려고 시도했지만 kvImageNullPointerArgument (오류 코드 -21772) vImage_Error이 표시됩니다. 내가이 문서에 따르면, "네 개의 막대 그래프의 배열에 대한 포인터"있어야하는데, 내 histogram 매개 변수, 함께 할 수있는 뭔가가 의심vImageHistogramCalculation을 사용하여 이미지의 막대 그래프 계산

- (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); 
} 

:

여기 내 코드입니다. 나는 그것을 정확하게 선언하고 있는가?

감사합니다.

+0

문제는 다음과 같습니다.'vImagePixelCount * histogram [4] = {0};'히스토그램 결과를 포함하기 위해 4 개의 널 포인터 배열을 초기화하고 있습니다. 다른 사람이 먼저 도착하지 않으면 나중에 답변으로 더 자세하게 설명해 드리겠습니다. –

+0

안녕하세요. @StephenCanon, 당신과 별개로 생각한 것 같습니다. 위의 귀하의 의견에 대한 자세한 내용은 훌륭합니다! – Eric

+0

@ 에릭 ... 나는 스티븐의 논리를 시험해 보았고 두 경우 모두 EXC_BAD_Access를 얻었습니다. 당신이 나에게 잘못했을 수있는 것을 제안 해 주시겠습니까? – Imran

답변

5

계산 된 히스토그램을 저장할 공간을 할당하지 않는 것이 문제입니다. 당신은 단지 로컬 히스토그램을 사용하는 경우, 당신은 너무 [내가 더 명확 예제를 만들기 위해 팔 개 쓰레기통 4 대신을 사용하고 노트]처럼 스택에 넣어 수 있습니다

// 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. 

당신이 필요한 경우 히스토그램은 함수의 범위를 벗어난다 곁에 대신 힙에 그들을위한 공간을 할당해야합니다 :이 도움이

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. 

희망을.

+0

안녕하세요, Stephen, 답변 해 주셔서 감사합니다. 그러나 첫 번째 코드에 몇 가지 문제가 발생합니다. vImagePixelCount (*) [8] 형식의 표현식으로 'vImagePixelCount *'(일명 'unsigned long *')를 초기화하는 호환되지 않는 포인터 유형을 말하는 'histogramPointers'를 선언하는 행에 경고가 표시됩니다. , 그리고 EXI_BAD_ACCESS와 함께'vImageHistogramCalculation_ARGBFFFF'에 대한 호출에서 앱이 충돌합니다. 이견있는 사람..? – Eric

+1

죄송합니다. 실수로 코드의 초기 버전을 게시 한 것으로 보입니다. 다시 시도하십시오. –

+0

고마워, 지금은 괜찮아. 나는 결과에 의해 약간 혼란 스럽다. 4 개의 채널은 모두 다음과 같습니다 :'([0] = 727040, [1] = 0, [2] = 0, [3] = 0, [4] = 0, [5] = 0, [6] = 0 , [7] = 0)'... 어떤 생각? – Eric