2012-11-11 43 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 - 如果两个图像具有相同的尺寸,为什么不能只是你一个批量比较? –