Предполагая, что вы хотите сделать это с помощью 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
, и весь диапазон освещения scale = maxVal - minVal
:
residual(x,y) = (diff(x,y) - minVal) / scale
Это нормализует каждый пиксель в диапазоне от 0 до 1. Вам придется умножить его накаким бы ни был ваш самый светлый цвет (постарайтесь не потерять точность при целочисленных преобразованиях здесь).