Я использую камеру 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
используется для добавления текста в видеокадр. Хотя это действительно будет работать для моей цели, которая нуждается только в этой замене для одиночных изображений, я предполагаю, что этот шаг приведет к урон производительности при применении к каждому видеокадру, и я хотел бы узнать, есть ли другой метод. Любая помощь здесь будет оценена по достоинству.