Даже с использованием векторных операций NEON через что-то вроде инфраструктуры Accelerate (которую OpenCV в настоящее время не использует, если я что-то не упускаю), будет сложно превзойти производительность шейдеров при запуске простых ядер свертки 3x3. Например, я могу запустить ядро обнаружения границ Sobel для кадра видео 640x480 за 2,5 мс на iPhone 4 с использованием шейдеров, чего более чем достаточно для обработки изображений в реальном времени. Кроме того, шейдеры OpenGL ES имеют значительные преимущества при обработке для отображения, поскольку вы можете полностью оставить все на стороне графического процессора и избежать дорогостоящей передачи данных для событий рисования.
Если вам нужен простой способ сделать это, мой фреймворк GPUImage с открытым исходным кодом имеет несколько очень быстрых встроенных сверток. , например обнаружение краев Sobel или ядро повышения резкости изображения, и позволяет довольно легко создавать собственные ядра свертки 3x3. Он включает в себя весь OpenGL ES, поэтому вам не нужно ничего об этом знать (если только вы не хотите писать свои собственные эффекты, но даже в этом случае вам просто нужно немного знать GLSL).
Например, чтобы выполнить только компонент X ядра обнаружения границ Sobel, вы можете настроить фильтр свертки с помощью следующего кода:
GPUImage3x3ConvolutionFilter *filter = [[GPUImage3x3ConvolutionFilter alloc] init];
[filter setConvolutionKernel:(GPUMatrix3x3){
{-1.0f, 0.0f, 1.0f},
{-2.0f, 0.0f, 2.0f},
{-1.0f, 0.0f, 1.0f}
}];
Затем вам просто нужно прикрепить это к входу и отображению камеры, изображения или фильма, необработанным данным или выходу видеомагнитофона, а платформа сделает все остальное. Для лучшей производительности вы можете написать свою собственную реализацию, оптимизированную для конкретного ядра, которое вы хотите запустить, как я сделал для GPUImageSobelEdgeDetectionFilter.
person
Brad Larson
schedule
07.05.2012