Jak zastosować "filtry" do AVCaptureVideoPreviewLayer

Moja aplikacja korzysta obecnie z AVFoundation, aby pobrać surowe dane z Tylnej Kamery iPhone ' a i wyświetlić je na AVCaptureVideoPreviewLayer w czasie rzeczywistym.

Moim celem jest warunkowe zastosowanie prostych filtrów obrazu do warstwy podglądu. Obrazy nie są zapisywane, więc nie muszę przechwytywać danych wyjściowych. Na przykład chciałbym przełączyć ustawienie, które konwertuje wideo wchodzące w warstwie podglądu na czarno-biały.

Znalazłem tutaj Pytanie które wydaje się, że osiąga coś podobnego, przechwytując poszczególne klatki wideo w buforze, stosując pożądane przekształcenia, a następnie wyświetlając każdą klatkę jako interfejs. Z kilku powodów wydaje się to przesadą dla mojego projektu i chciałbym uniknąć problemów z wydajnością, które mogą to spowodować.

Czy to jedyny sposób, aby osiągnąć mój cel?

Jak już wspomniałem, nie chcę przechwytywać żadnego z filmów AVCaptureSession, tylko go podglądać.

Author: Community, 2011-03-01

2 answers

Prawdopodobnie najbardziej wydajnym sposobem radzenia sobie z tym byłoby użycie OpenGL ES do filtrowania i wyświetlania tych klatek wideo. Nie będziesz w stanie zrobić wiele bezpośrednio z AVCaptureVideoPreviewLayer, poza dostosowaniem jej krycia po nałożeniu na inny widok lub warstwę.

Mam przykładową aplikację tutaj gdzie pobieram klatki z kamery i stosuję shadery OpenGL ES 2.0, aby przetwarzać wideo w czasie rzeczywistym do wyświetlania. W tej aplikacji (szczegółowo wyjaśnione TUTAJ ), używałem filtrowania opartego na kolorze do śledzenia obiektów w widoku kamery, ale inni zmodyfikowali ten kod, aby wykonać kilka fajnych efektów przetwarzania wideo. Wszystkie filtry oparte na GPU w tej aplikacji, które wyświetlają się na ekranie, działają z prędkością 60 kl. / s na moim iPhonie 4.

Jedynym urządzeniem z systemem iOS, które obsługuje wideo, ale nie ma GPU obsługującego OpenGL ES 2.0, jest iPhone 3g. generowanie tekstur OpenGL ES, a następnie użycie kodu filtra z przykładowej aplikacji Glimageprocessing firmy Apple. Ta aplikacja jest zbudowana wokół OpenGL ES 1.1, wsparcie dla którego jest obecny na wszystkich urządzeniach z systemem iOS.

Jednak gorąco zachęcam do korzystania z OpenGL ES 2.0 do tego, ponieważ można wyciągnąć wiele więcej rodzajów efektów za pomocą shaderów niż można z stałej funkcji OpenGL ES 1.1 pipeline.

(Edit: 2/13/2012) jako update na powyzszym, mam teraz stworzył framework open source o nazwie GPUImage , który zawiera tego rodzaju niestandardowe filtrowanie obrazów. Obsługuje również przechwytywanie wideo i wyświetlanie go na ekranie po przefiltrowaniu, wymagając aż sześciu linii kodu, aby ustawić to wszystko. Aby dowiedzieć się więcej na temat frameworku, możesz przeczytać moje bardziej szczegółowe ogłoszenie .

 66
Author: Brad Larson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 19:12:04

Polecam spojrzeć na przykład Rosy Writer z biblioteki programistycznej ios. Biblioteka GPUImage Brada Larsona jest całkiem niesamowita, ale wydaje się trochę przesadna dla tego pytania.

Jeśli jesteś po prostu zainteresowany dodaniem shaderów OpenGL (Aka filtrów) do AVCaptureVideoPreviewLayer przepływ pracy polega na wysłaniu wyjścia z sesji przechwytywania do widoku OpenGL w celu renderowania.

AVCaptureVideoDataOutput *videoOut = [[AVCaptureVideoDataOutput alloc] init];
videoOut.videoSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(_renderer.inputPixelFormat) };
[videoOut setSampleBufferDelegate:self queue:_videoDataOutputQueue];

Następnie w delegacie captureOutput: wyślij bufor próbki do OpenGL Renderer

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
    CVPixelBufferRef sourcePixelBuffer = CMSampleBufferGetImageBuffer( sampleBuffer );
    _renderer copyRenderedPixelBuffer:sourcePixelBuffer];
}

W OpenGL Renderer załącz sourcePixelBuffer do tekstury i możesz filtrować ją wewnątrz shaderów OpenGL. Shader to program uruchamiany na bazie perpiksela. Przykład Rosy Writer pokazuje również przykłady użycia różnych technik filtrowania innych niż OpenGL.

 3
Author: izzy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 19:06:31