Перейти к содержимому
Compvision.ru
ter_nk

Оптимизация связанная с афинными преобразованиями

Recommended Posts

У меня была проблема когда надо было оптимизировать по времени алгоритм.

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

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

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

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

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

2) оптимизировать вручную функцию афинных преобразований (распарралелить, правда вопрос эффективности )

3) сделать как-то так чтобы "афинно" у меня поворачивалась только некая полигонная часть изображения, но собственно это как-то кардинально все переделывать надо, не сделаю наверное

 

Что посоветуете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лучше картинку покажите или хотя бы схематическую.

 

Чтобы убрать черные пиксели надо делать интерполяцию(а это доп. время), сама ф-ия cv::warpAffine внутри "делает тоже всё попиксельно" и делает интерполяцию за вас.

https://github.com/Itseez/opencv/blob/bad09e5f584d54ca1471cd9f01a040e1dd97fdfe/modules/imgproc/src/imgwarp.cpp

По ходу там еще используется IPP и parallel_for_ так что ф-ия оптимизированная.

 

Кстати есть cv::cuda::warpAffine

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а cv::cuda::warpAffine что даст? а как самому интерполяцию сделать, сгладить точки, что-то не понял, там это как параметр

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

cv::cuda::warpAffine может дать ускорении при наличие NVIDIA GPU, скорее всего ускорение не будет если карта старая или если область варпа очень маленькая.

 

Тут в этой теме есть обсуждение (хотя и несколько сумбурное)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно просто перелезть на OpenGL, и использовать его для отрисовки, поворачивает он очень быстро и качественно.

Что-то можно так-же в шейдеры перенести, чтобы не гонять туда-сюда

Mat <-> OpenGL не самые быстрые операции но, тут надо искать компромиссы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я тогда делал на MFC + старый IPL (как изображение конвертилось и выводилось не помню) и как раз надо было сделать поворот большого изображения без заметных лагов.

Вроде как для скорости я использовал самую простую интерполяцию nearest neighbour interpolation.

Еще я сделал 2 уровня, когда видна вся картинка, то я крутил уменьшенное изображение, а когда увеличиваешь, то уже только часть оригинальной.

 

На самом деле например в GIMP тоже можно увидеть лаги если картинка большая.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×