我需要编写一个函数,它接受两个帧作为输入,并计算它们之间的差异。输出将是一个帧,其中每个像素的值表示目标帧和参考帧中相应像素之间的绝对差
最后,我需要以灰度显示这个“残差”帧。此处不计算任何运动矢量。
我该如何开始做这件事?
此外,我需要创建一个单一的观察窗口,将显示4个图像。
http://tinypic.com/r/2r46gkm/7
有什么解决方案吗?
发布于 2011-05-23 08:45:03
假设您希望使用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的新手,我建议您使用this tutorial。如果没有其他东西,这是一个很好的参考。
编辑:差异...只是图像之间的区别吗?一些伪代码:
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的范围内。你必须将它乘以你想要的最亮的颜色(确保不会因为这里的整数转换而失去精度)。
https://stackoverflow.com/questions/6094518
复制