GPUImage Различный предварительный просмотр для вывода

Впервые при использовании другого фильтра GPUImage я наблюдаю странную производительность, когда GPUImage показывает довольно большую разницу между предварительным просмотром в реальном времени и выводимой фотографией.

В настоящее время я испытываю это с помощью GPUImageSobelEdgeDetectionFilter следующим образом:

разница

Слева у меня есть скриншот экрана устройства, а справа — выведенная фотография. Кажется, значительно уменьшить толщину и резкость обнаруженных линий, выводя совсем другую картинку.

Я пробовал включать и выключать SmoothlyScaleOutput, но, поскольку в настоящее время я не масштабирую изображение, это не должно влиять на него.

Фильтр настроен так;

        filterforphoto = [[GPUImageSobelEdgeDetectionFilter alloc] init];
        [(GPUImageSobelEdgeDetectionFilter *)filterforphoto setShouldSmoothlyScaleOutput:NO];
        [stillCamera addTarget:filterforphoto];

        [filterforphoto addTarget:primaryView];
        [stillCamera startCameraCapture];

        [(GPUImageSobelEdgeDetectionFilter *)filterforphoto setEdgeStrength:1.0];

И фото сделано так;

        [stillCamera capturePhotoAsImageProcessedUpToFilter:filterforphoto withCompletionHandler:^(UIImage *processedImage, NSError *error){

Кто-нибудь знает, почему GPUImage интерпретирует живую камеру так иначе, чем выводимую фотографию? Это просто потому, что предварительный просмотр имеет гораздо более низкое качество, чем окончательное изображение, и поэтому выглядит иначе на изображении с полным разрешением?

Спасибо,

(p.s. Пожалуйста, не обращайте внимания на немного разные размеры на левом и правом изображениях, я не совсем осветил их так, как мог бы)


person Ralpharoo    schedule 29.11.2013    source источник


Ответы (1)


Причина действительно в разном разрешении между предварительным просмотром в реальном времени и фотографией.

Работа фильтров обнаружения краев (и им подобных) заключается в том, что они производят выборку пикселей сразу по обе стороны от обрабатываемого в данный момент пикселя. Когда вы предоставляете входные данные с гораздо более высоким разрешением в виде фотографии, это означает, что обнаружение краев происходит на гораздо меньшей относительной площади изображения. По этой же причине размытие по Гауссу определенного радиуса в пикселях выглядит намного слабее при применении к неподвижным фотографиям по сравнению с предварительным просмотром в реальном времени.

Чтобы заблокировать обнаружение краев на определенном относительном размере, вы можете вручную установить свойства texelWidth и texelHeight в фильтре. Эти значения равны 1/ширине и 1/высоте целевого изображения соответственно. Если вы установите эти значения на основе размера предварительного просмотра в реальном времени, вы должны увидеть постоянный размер края на окончательной фотографии. Некоторые детали могут немного отличаться из-за более высокого разрешения, но в основном они должны быть одинаковыми.

person Brad Larson    schedule 02.12.2013
comment
Спасибо Брэд - как всегда спаситель. Поработав с этим вечером, он делает все, что мне нужно, и имеет смысл. Спасибо еще раз. - person Ralpharoo; 05.12.2013
comment
как получить размер предварительного просмотра в реальном времени? Я не могу найти ничего в Интернете для получения этого значения. - person Maccle415; 23.07.2016