|
楼主 |
发表于 2012-10-16 16:31:05
|
显示全部楼层
两帧相减就一个函数,无处可折腾,郁闷。
uint16_t IMA_FrameDelta(uint16 width, uint16 height, uint8 offset)
{
int32 x, y;
int16 tmp1;
uint16 tmp2, prev_frame, near_frame;
volatile uint16_t *img_ptr;
uint16 *buf;
uint32 ticks;
ticks = SysTickTime; //for debug
near_frame = PLD_LockImageFrame(1);
prev_frame = Pld_SweepPage(near_frame);
buf = (uint16 *)g_IMG_RowBuffer;
for(y=0; y<height; y++)
{
//从最新帧读取1行放在Buffer中
Pld_SetFsmcPage(near_frame);
Pld_SelectImgRow(y);
img_ptr = (uint16 *)Pld_PixelPtr(0);
for(x=0; x<width; x++)
{
buf[x] = (uint16)(*img_ptr++);
}
//行Buffer与次新帧的对应行相减,Update到次新帧
Pld_SetFsmcPage(prev_frame);
Pld_SelectImgRow(y);
img_ptr = (uint16 *)Pld_PixelPtr(0);
for(x=0; x<width; x++)
{
//逐点亮度相减,色度丢弃或从单帧中取
tmp2 = (*img_ptr);
tmp1 = abs((tmp2 & 0x00ff) - (buf[x] & 0x00ff)) + offset;
if (tmp1<0) tmp1 = 0;
if (tmp1>255) tmp1 = 255; //规范化
// tmp2 = tmp1 | 0x8000; //只取亮度
// tmp2 = (tmp2 & 0xff00)|tmp1; //色度从次新帧取
tmp2 = (buf[x] & 0xff00)|tmp1; //色度从最新帧取
(*img_ptr++) = tmp2;
}
}
Pld_SetFsmcPage(prev_frame);
ticks = SysTickTime - ticks;
printf("\r\nFrame SUB run times:%dms", ticks*5);
return(prev_frame);
}
两幅1280x1024的图这样相减,时间居然要2s! 逐点运算很可怕。
|
|