Я использую библиотеку GPUImage и пытаюсь смешать два изображения в реальном времени и отобразить их на GPUImageView. Я пытаюсь альфа-смешивать обычный ввод камеры с его отфильтрованной версией. Вот что я пытаюсь сделать:

          ----------------->----v
--camera--|                     alpha blend ----> image view
          -----> color filter --^

Я нашел несколько сообщений об использовании фильтров наложения, но они не похожи на методы обработки в реальном времени. Я нашел https://github.com/BradLarson/GPUImage/issues/319, GPUImage: смешивание двух изображений и https://github.com/BradLarson/GPUImage/issues/751 (но они либо не для обработки в реальном времени (во-первых, и второй), либо не работает (третий).

Я пробовал почти все, но получаю только белое изображение в GPUImageView. Если я не использую фильтр альфа-наложения, скажем, просто использую фильтр ложных цветов или что-то подобное, он отлично работает. Вот мой код:

blendFilter = [[GPUImageAlphaBlendFilter alloc] init];
blendFilter.mix = 0.5;
[blendFilter prepareForImageCapture];
[blendFilter addTarget:imageView];

passThrough = [[GPUImageFilter alloc] init];
[passThrough prepareForImageCapture];
[passThrough addTarget:blendFilter];

selectedFilter = [[GPUImageFalseColorFilter alloc] init];
[selectedFilter prepareForImageCapture];
[selectedFilter addTarget:blendFilter];

stillCamera = [[GPUImageStillCamera alloc] init];
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;

[stillCamera addTarget:passThrough];
[stillCamera addTarget:selectedFilter];
[stillCamera startCameraCapture];

Все, что я получаю, это белый пустой экран. Если я изменю [selectedFilter addTarget:blendFilter]; на [selectedFilter addTarget:imageView];, тогда на изображении будет отображаться фильтр ложных цветов.

Кажется, что-то не так с фильтром альфа-наложения. Я читал об этом в некоторых сообщениях, что мне нужно вызывать processImage для ввода, но все эти сообщения предназначены для ввода не в реальном времени, насколько я понимаю. Как я могу заставить GPUImageAlphaBlendFilter работать в реальном времени?

2
Can Poyrazoğlu 5 Май 2013 в 17:04

1 ответ

Лучший ответ

Хорошо, после дальнейшего изучения проблемы в Интернете и в списке проблем проекта (https://github.com/BradLarson / GPUImage / issues) и нашел обходной путь. При установке фильтра наложения в качестве цели мне нужно было конкретно указать индекс текстуры. По какой-то причине (вероятно, из-за ошибки) добавление целевого фильтра смешивания два раза не позволяет правильно добавить вторую текстуру по следующему индексу. Таким образом, явная установка индексов текстуры как 0 и 1 действительно сработала:

[passThrough addTarget:blendFilter atTextureLocation:0];
[selectedFilter addTarget:blendFilter atTextureLocation:1];

Для фильтров, которые являются целями отдельных источников, достаточно addTarget:, например [stillCamera addTarget:selectedFilter];.

2
Can Poyrazoğlu 13 Май 2013 в 17:05