Я хочу увеличить размер захваченных (с веб-камеры) изображений OpenCV или соответствующих массивов с плавающей точкой (значения пикселей не обязательно должны быть дискретными целыми числами). К сожалению, соотношение upsampling не всегда целое, поэтому я не могу понять, как это сделать с простой линейной интерполяцией. Есть ли более простой способ или библиотека для этого?Воспроизведение видео с использованием C/C++
ответ
Ну, я не знаю библиотеки, чтобы делать масштабирование кадров.
Но я могу сказать вам, что наиболее подходящий способ сделать это сам - это просто сбросить или удвоить кадры.
Смешивание изображений простой интерполяцией по пиксельным пикселям не улучшит качество, воспроизведение по-прежнему будет выглядеть отрывистым и даже размытым.
Для правильной интерполяции частоты кадров необходимы более сложные алгоритмы. Современные телевизоры имеют встроенные аппаратные средства для этого и программное обеспечение для редактирования видео, например, У After Effects есть функции, которые это делают.
Эти алгоритмы могут быть созданы между изображениями путем анализа движения. Но это выходит за рамки небольшого решения проблемы.
Так что или продолжайте поиск существующей библиотеки, которую вы можете использовать или сделать, просто снижая/удваивая кадры.
Кадры сбрасывания/удвоения выглядят крайне уродливо (я видел много неправильно кодированного аниме, которое было конвертировано из VFR в CFR таким образом ...), но на самом деле это единственное решение, которое допускает простую реализацию. Все остальное требует расширенного анализа движения и будет очень медленным. –
Я не на 100% знаком с захватом видео, поэтому я не уверен, что вы подразумеваете под «значениями пикселей не нужно быть дискретным целым числом». Означает ли это, что информация о цвете на пиксель может не быть целыми?
Я предполагаю, что «соотношение повышающей дискретизации не всегда является целым», вы имеете в виду, что вы будете повышать уровень от одного разрешения до другого, но вы не можете удваивать или утроить. Например, вместо 640x480 -> 1280x960, вы можете делать, 640x480 -> 800x600.
Простой алгоритм может быть:
Для каждого пикселя в большей сетке
- Scale X/Y значение лежит между 0,1 (Разделить й по ширине, у по высоте)
- Scale X/Y значения по ширине/высоте меньшей сеток -> xSmaller, ySmaller
- Определить четыре пикселя, которые содержат вашу точку, с помощью плавающих функций пола/потолка точечных
- Get значения x/y, где точка лежит внутри этого прямоугольника,
между 0,1 (вычесть значения пола/потолка xSmaller, ySmaller) -> xInterp, yInterp - Начните с черного цвета и добавьте четыре цвета, масштабированные в xInterp/yInterp факторы для каждого
Вы можете сделать это быстрее для нескольких кадров путем создания таблицы поиска для отображения пикселов -> xInterp/yInterp значения
Я уверен, что есть намного лучшие алгоритмы там, чем линейная интерполяция (билинейная и многие другие). Это похоже на то, что вы хотели бы оптимизировать на уровне процессора.
Библиотека ImageMagick MagickWand изменит размеры изображений с использованием правильных алгоритмов фильтрации - см. Функцию MagickResizeImage()
(и используйте фильтр Sinc).
Используйте libswscale
из проекта ffmpeg. Он наиболее оптимизирован и поддерживает множество различных алгоритмов повторной дискретизации.
Вы уверены, что делает повторную выборку частоты кадров? если да, можете ли вы предоставить ссылку на небольшой пример? Мне было трудно найти учебник или документ. –
О, реформация частоты кадров? Я неправильно понял и думал, что вы подразумеваете пространственную передискретизацию. Резервная выборка кадров - очень сложная проблема, потому что видео всегда сильно подчеркивается во временном направлении и, таким образом, псевдонимом, исключая использование любых наивных линейных фильтров. В основном вам нужно что-то, что работает на оценку движения и интерполяцию векторов движения. Я помню, что там была одна достойная реализация где-то в сети, но, к сожалению, я не помню, где и что она называется. :(Надеюсь, мое описание того, что нужно, поможет вам это найти. –
Вы хотите изменить пространственное разрешение (т. Е. Ширину и высоту каждого кадра в пикселях) или разрешение цвета, то есть количество бит, используемых для представления цвета каждого пикселя? – unwind
Нет, я не имею в виду изменение размера/передискретизации, я имею в виду частоту кадров. Представьте, что в конце 10-секундного захвата у меня 160 кадров, и мне нужно иметь 200 кадров (по какой-то причине). Скорость захвата не всегда одинакова, поэтому мне нужно построить некоторый динамический алгоритм. –