2016-04-25 1 views
3

Я использую камеру iPhone для захвата видео в реальном времени и подачи пиксельного буфера в сеть, которая выполняет некоторое распознавание объектов. Вот соответствующий код: (я не буду размещать код для настройки AVCaptureSession и т.д., так как это является довольно стандартным.)Замените часть пиксельного буфера на белые пиксели в iOS

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 
    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    OSType sourcePixelFormat = CVPixelBufferGetPixelFormatType(pixelBuffer); 
    int doReverseChannels; 
    if (kCVPixelFormatType_32ARGB == sourcePixelFormat) { 
     doReverseChannels = 1; 
    } else if (kCVPixelFormatType_32BGRA == sourcePixelFormat) { 
     doReverseChannels = 0; 
    } else { 
     assert(false); 
    } 

    const int sourceRowBytes = (int)CVPixelBufferGetBytesPerRow(pixelBuffer); 
    const int width = (int)CVPixelBufferGetWidth(pixelBuffer); 
    const int fullHeight = (int)CVPixelBufferGetHeight(pixelBuffer); 
    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
    unsigned char* sourceBaseAddr = CVPixelBufferGetBaseAddress(pixelBuffer); 
    int height; 
    unsigned char* sourceStartAddr; 
    if (fullHeight <= width) { 
     height = fullHeight; 
     sourceStartAddr = sourceBaseAddr; 
    } else { 
     height = width; 
     const int marginY = ((fullHeight - width)/2); 
     sourceStartAddr = (sourceBaseAddr + (marginY * sourceRowBytes)); 
    } 
} 

Сеть затем принимает sourceStartAddr, width, height, sourceRowBytes & doReverseChannels, как входы.

Мой вопрос следующий: Какой был бы самый простой и/или наиболее эффективный способ заменить или удалить часть данных изображения со всеми белыми «пикселями»? Возможно ли напрямую переписать часть данных пиксельных буферов, и если да, то как?

У меня только очень рудиментарное понимание того, как работает этот буфер пикселей, поэтому я приношу свои извинения, если у меня отсутствует что-то очень основное. Вопрос, наиболее тесно связанный с моим, который я нашел в Stackoverflow, был this one, где EAGLContext используется для добавления текста в видеокадр. Хотя это действительно будет работать для моей цели, которая нуждается только в этой замене для одиночных изображений, я предполагаю, что этот шаг приведет к урон производительности при применении к каждому видеокадру, и я хотел бы узнать, есть ли другой метод. Любая помощь здесь будет оценена по достоинству.

ответ

5

Вот простой способ манипулировать CVPixelBufferRef без использования других библиотек, таких как Core Graphics или OpenGL:

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection { 
    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

    const int kBytesPerPixel = 4; 
    CVPixelBufferLockBaseAddress(pixelBuffer, 0); 
    int bufferWidth = (int)CVPixelBufferGetWidth(pixelBuffer); 
    int bufferHeight = (int)CVPixelBufferGetHeight(pixelBuffer); 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer); 
    uint8_t *baseAddress = CVPixelBufferGetBaseAddress(pixelBuffer); 

    for (int row = 0; row < bufferHeight; row++) 
    { 
     uint8_t *pixel = baseAddress + row * bytesPerRow; 
     for (int column = 0; column < bufferWidth; column++) 
     { 
      if ((row < 100) && (column < 100) { 
       pixel[0] = 255; // BGRA, Blue value 
       pixel[1] = 255; // Green value 
       pixel[2] = 255; // Red value 
      } 
      pixel += kBytesPerPixel; 
     } 
    } 

    CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 

    // Do whatever needs to be done with the pixel buffer 
} 

Это перезаписывает верхний левый участок 100 х 100 пикселей в изображении с белыми пикселями.

Я нашел это решение в этом примере Apple Developer RosyWriter.

Вид изумленного Я не получил никаких ответов здесь, рассматривая, как легко это оказалось. Надеюсь, это поможет кому-то.

 Смежные вопросы

  • Нет связанных вопросов^_^