Я использую библиотеку 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 работать в реальном времени?
1 ответ
Хорошо, после дальнейшего изучения проблемы в Интернете и в списке проблем проекта (https://github.com/BradLarson / GPUImage / issues) и нашел обходной путь. При установке фильтра наложения в качестве цели мне нужно было конкретно указать индекс текстуры. По какой-то причине (вероятно, из-за ошибки) добавление целевого фильтра смешивания два раза не позволяет правильно добавить вторую текстуру по следующему индексу. Таким образом, явная установка индексов текстуры как 0 и 1 действительно сработала:
[passThrough addTarget:blendFilter atTextureLocation:0];
[selectedFilter addTarget:blendFilter atTextureLocation:1];
Для фильтров, которые являются целями отдельных источников, достаточно addTarget:
, например [stillCamera addTarget:selectedFilter];
.
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.