как SDL и C - PullRequest
       32

как SDL и C

0 голосов
/ 23 мая 2011

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

* * 1002 Наконец, мне нужно отобразить этот «остаточный» кадр в серой шкале.Здесь вектор движения не вычисляется.

Как начать это делать?

Также мне нужно создать одно окно просмотра, в котором будут отображаться 4 изображения.

http://tinypic.com/r/2r46gkm/7

Есть решение?

1 Ответ

0 голосов
/ 23 мая 2011

Предполагая, что вы хотите сделать это с помощью 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. Вам придется умножить его накаким бы ни был ваш самый светлый цвет (постарайтесь не потерять точность при целочисленных преобразованиях здесь).

...