2012-11-11 64 views
0

我有兩個CVImageBufferRef緩衝區,對應於由AVCaptureSession按順序抓取的兩個圖像。我想比較兩者是否所有像素都相同。爲了循環通過幀緩衝區的所有像素,並比較它們,我有這個:比較兩個無符號字符緩衝區

unsigned char *pixelA = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBufferA); 
unsigned char *pixelB = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBufferB); 


- (BOOL) isBuffer:(unsigned char *)pixelA equalToBuffer:(unsigned char *)pixelB { 
    for(int row = 0; row < bufferHeight; row++) { 
     for(int column = 0; column < bufferWidth; column++) { 

      if ((pixelA[0] != pixelB[0]) || 
       (pixelA[1] != pixelB[1]) || 
       (pixelA[2] != pixelB[2])){ 
       return NO; 
       // means at some point pixelA is not equal to pixelB, so 
       // pixelBufferA is not equal to pixelBufferB 
      } 

      pixelA += BYTES_PER_PIXEL; 
      pixelB += BYTES_PER_PIXEL; 

     } 
    } 

     // if the method reached here, pixelBufferA is equal to pixelBufferB, so 
     return YES; // are equal 
} 

顯然它在比較崩潰。如何比較pixelA中的所有值與pixelB?感謝

+0

你有沒有想過在摺疊之前得到了多少? –

+0

第一個循環............ – SpaceDog

+0

您是否驗證過您收到的地址甚至有效?使用調試器來顯示它們是什麼以及它們指向什麼? –

回答

1

我從來沒有實際進行,你在做什麼,但有一個原因,你不能只比較緩衝,一氣呵成,比方說,與memcmp

- (BOOL) isBuffer:(unsigned char*)pixelA equalToBuffer:(unsigned char*)pixelB 
{ 
    size_t bufferSize = bufferWidth * bufferHeight * BYTES_PER_PIXEL; 

    return memcmp(pixelA, pixelB, bufferSize) == 0; 
} 
+0

+1正在撰寫相同的回覆。首先比較每個緩衝區的大小可能會更安全(也更快)。如果尺寸不匹配,則用NO保釋。也許像素緩衝區總是相同的大小?不確定。 – danh

+0

不能這樣做。這兩個圖像每像素相同的寬度,高度和字節... ** **ಠ_ಠ – SpaceDog

+0

@DesperateDeveloper - 如果兩個圖像具有相同的尺寸,爲什麼不能只是你一個批量比較? –