how to SDL and C
I need to write a function that takes two frames as input and computing the difference between them. The output would be a frame where each pixel's value开发者_如何学Python represents the absolute difference between the corresponding pixels in the target frame and reference frame
Finally, i need to display this "residual" frame in gray scale. No motion vector is computed here.
How do i start going about this?
Also i need to create single viewing window that will display 4 images.
http://tinypic.com/r/2r46gkm/7
Any solution?
Assuming you wish to do this using SDL (which your tag indicates) you would want to access the pixels of the frames and iterate over them manually. You can do this with code similar to this (assuming your images are 32-bit surfaces):
Uint32 *pixelBuffer = (Uint32 *)surface->pixels;
Uint32 pixel pixelBuffer[ ( y * surface->w ) + x ];
Where x and y is the position you want to access. You can set pixels in a similar manner:
Uint32 pixel = SDL_MapRGB(surface->format, r, g, b);
Uint32 *pixelBuffer = (Uint32 *)surface->pixels;
pixelBuffer[ ( y * surface->w ) + x ] = pixel;
You would have to implement the "difference" for each pixel yourself, as well as the normalization.
If you don't have to do this in SDL there are other image libraries better suited for this, such as OpenCV or OpenIL.
Part two of your question is really very simple in SDL, just make a window (SDL_SetVideoMode) that is twice the width and height of you frame, and render the different screens at an offset. If you are a newcomer to SDL, I recommend that you look trough this tutorial. It is good for reference if nothing else.
EDIT: Difference... is just the difference between images I would assume? Some pseudocode:
for each pixel at coordinate (x,y) in surface residual:
residual(x,y) = abs(target(x,y) - reference(x,y))
For normalization, simply find the darkest value and lightest value in the residual surface (by brute force iteration for example). We shall call these minVal
and maxVal
, and the entire light range scale = maxVal - minVal
:
residual(x,y) = (diff(x,y) - minVal) / scale
This will normalize each pixel to a range between 0 and 1. You will have to multiply it by whatever you want your lightest color to be (make sure not to lose precision through integer conversions here).
精彩评论