Видеосэмплинг с C / C ++ - PullRequest
       4

Видеосэмплинг с C / C ++

0 голосов
/ 10 августа 2010

Я хочу увеличить выборку массива захваченных (с веб-камеры) изображений OpenCV или соответствующих плавающих массивов (значения пикселей не обязательно должны быть дискретным целым числом) К сожалению, коэффициент повышения дискретизации не всегда целочисленный, поэтому я не могу понять, как это сделать с помощью простой линейной интерполяции. Есть ли более простой способ или библиотека, чтобы сделать это?

Ответы [ 4 ]

1 голос
/ 10 августа 2010

Ну, я не знаю библиотеку для масштабирования частоты кадров.

Но я могу вам сказать, что наиболее подходящий способ сделать это самому - просто уронить или удвоить кадры.

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

Для правильной интерполяции частоты кадров необходимы гораздо более сложные алгоритмы. Современные телевизоры имеют встроенное аппаратное обеспечение для этого и программное обеспечение для редактирования видео, например, В After-Effects есть функции, которые это делают.

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

Так что либо продолжайте поиск существующей библиотеки, которую вы можете использовать, либо делайте это, просто удаляя / удваивая фреймы.

0 голосов
/ 10 августа 2010

Используйте libswscale из проекта ffmpeg.Он наиболее оптимизирован и поддерживает ряд различных алгоритмов передискретизации.

0 голосов
/ 10 августа 2010

Библиотека ImageMagick MagickWand изменяет размеры изображений, используя надлежащие алгоритмы фильтрации - см. Функцию MagickResizeImage() (и использует фильтр Sinc).

0 голосов
/ 10 августа 2010

Я не на 100% знаком с захватом видео, поэтому я не уверен, что вы подразумеваете под "значениями пикселей не обязательно должны быть дискретные целые числа".Означает ли это, что информация о цвете на пиксель может не быть целыми числами?

Я предполагаю, что "коэффициент повышения дискретизации не всегда целочисленный", вы имеете в виду, что вы будете повышать частоту с одного разрешения на другое, но вы не можетебыть вдвое или втрое.Например, вместо 640x480 -> 1280x960, вы можете делать, 640x480 -> 800x600.

Простой алгоритм может быть:

Для каждого пикселя в большей сетке

  • Масштабировать значения x / y, чтобы они лежали между 0,1 (разделить x по ширине, y по высоте)
  • Масштабировать значения x / y по ширине / высоте меньшей сетки -> xSmaller, ySmaller
  • Определите четыре пикселя, которые содержат вашу точку, с помощью функций пола / потолка с плавающей запятой
  • Получите значения x / y, где точка находится в этом прямоугольнике,между 0,1 (вычесть значения пола / потолка xSmaller, ySmaller) -> xInterp, yInterp
  • Начните с черного и добавьте четыре цвета, масштабированные с помощью коэффициентов xInterp / yInterp для каждого

Вы можете сделать это быстрее для нескольких кадров, создав таблицу поиска для отображения пикселей -> значения xInterp / yInterp

Я уверен, что есть намного лучшие алгоритмы, чем линейная интерполяция (билинейная и многиеБольше).Это похоже на то, что вы хотели бы оптимизировать на уровне процессора.

...