#c #sdl
#c #sdl
Вопрос:
Мне нужно написать функцию, которая принимает два кадра в качестве входных данных и вычисляет разницу между ними. Результатом будет кадр, где значение каждого пикселя представляет собой абсолютную разницу между соответствующими пикселями в целевом кадре и опорном кадре
Наконец, мне нужно отобразить этот «остаточный» кадр в серой шкале. Здесь не вычисляется вектор движения.
Как мне начать с этого?
Также мне нужно создать единое окно просмотра, в котором будут отображаться 4 изображения.
http://tinypic.com/r/2r46gkm/7
Есть решение?
Ответ №1:
Предполагая, что вы хотите сделать это с помощью SDL (что указывает ваш тег), вы хотели бы получить доступ к пикселям фреймов и выполнить итерацию по ним вручную. Вы можете сделать это с помощью кода, подобного этому (при условии, что ваши изображения являются 32-разрядными поверхностями):
Uint32 *pixelBuffer = (Uint32 *)surface->pixels;
Uint32 pixel pixelBuffer[ ( y * surface->w ) x ];
Где x и y — это позиция, к которой вы хотите получить доступ. Вы можете устанавливать пиксели аналогичным образом:
Uint32 pixel = SDL_MapRGB(surface->format, r, g, b);
Uint32 *pixelBuffer = (Uint32 *)surface->pixels;
pixelBuffer[ ( y * surface->w ) x ] = pixel;
Вам пришлось бы самостоятельно определять «разницу» для каждого пикселя, а также выполнять нормализацию.
Если вам не нужно делать это в SDL, есть другие библиотеки изображений, которые лучше подходят для этого, такие как OpenCV или OpenIL.
Вторая часть вашего вопроса действительно очень проста в SDL, просто создайте окно (SDL_SetVideoMode), ширина и высота которого в два раза больше вашего фрейма, и отобразите разные экраны со смещением. Если вы новичок в SDL, я рекомендую вам ознакомиться с этим руководством. Это хорошо для справки, если ничего другого.
РЕДАКТИРОВАТЬ: Разница … это просто разница между изображениями, которые я бы предположил? Какой-то псевдокод:
for each pixel at coordinate (x,y) in surface residual:
residual(x,y) = abs(target(x,y) - reference(x,y))
Для нормализации просто найдите самое темное значение и самое светлое значение в остаточной поверхности (например, методом перебора). Мы будем называть их minVal
и maxVal
, а также весь диапазон light scale = maxVal - minVal
:
residual(x,y) = (diff(x,y) - minVal) / scale
Это приведет к нормализации каждого пикселя в диапазоне от 0 до 1. Вам нужно будет умножить это на то, каким вы хотите, чтобы у вас был самый светлый цвет (убедитесь, что не теряете точность при преобразовании целых чисел здесь).
Комментарии:
1. Спасибо. Итак, приведенный выше код — это в основном код для чтения каждого пикселя? мои изображения представляют собой 8-битные поверхности.
2. Это будет работать для 32-разрядных поверхностей (как в r8g8b8a8). Если у вас есть какой-либо формат в оттенках серого, вам придется его изменить. Самый простой способ — просто протестировать это и посмотреть, можете ли вы правильно считывать / записывать пиксели в каждую часть изображения.
3. @user Если ответ был полезным (и решил вашу проблему), вы можете поставить этот маленький флажок рядом с моим ответом 🙂
4. Как мне найти разницу? и что вы подразумеваете под нормализацией? Спасибо за фрейм, я понял: D
5. @user: Проверьте мою правку. Я надеюсь, что это поможет (хотя я написал это в псевдокоде, не должно быть слишком сложно преобразовать в C / SDL или любую другую конфигурацию библиотеки изображений / языка, которую вы хотели бы использовать).