- Код: Выделить всё
//(c)The Diablo, HELL Unlimited. All Rights Reserved. Distributed under the GNU General Public License.
#define uchar unsigned
#define chkPixel(x,y,w,h)
#ifdef BMP
void setPixel(char *raw,int w,int h,int x,int y,uchar r,uchar g,uchar b)
{chkPixel(x,y,w,h){int i=(w*(h-y-1)+1+x)*3;raw[i-1]=r;raw[i-2]=g;raw[i-3]=b;}}
#else
void setPixel(char *raw,int w,int h,int x,int y,uchar r,uchar g,uchar b)
{chkPixel(x,y,w,h){int i=(w*y+x)*3;raw[i]=r;raw[i+1]=g;raw[i+2]=b;}}
#endif
void getPixel(char *raw,int w,int h,int x,int y,uchar *r,uchar *g,uchar *b)
{chkPixel(x,y,w,h){int i=(w*y+x)*3;*r=raw[i];*g=raw[i+1];*b=raw[i+2];}}
void RedEyeVec(char *raw,int w,int h,int *v,int s){int i,x,y;unsigned r,g,b,R,G,B;
for(y=0;y<h;y++)for(getPixel(raw,w,h,0,y,&R,&G,&B),x=1;x<w;x++){getPixel(raw,w,h,x,y,&r,&g,&b);i=x+y*w-1;
if(abs(r+g+b-R-G-B)>s)v[i>>3]|=0x00000001<<(i&7);R=r;G=g;B=b;}//x
for(x=0;x<w;x++)for(getPixel(raw,w,h,x,0,&R,&G,&B),y=1;y<h;y++){getPixel(raw,w,h,x,y,&r,&g,&b);i=x+y*w-1;
if(abs(r+g+b-R-G-B)>s)v[i>>3]|=0x00000100<<(i&7);R=r;G=g;B=b;}//y
}
int i=w*h/2,vs=i,*vec=(int*)malloc(i);memset(vec,0,i);
RedEyeVec(pnm,w,h,vec,3*10);
fsize=w*h*3;char *raw=(char*)malloc(fsize);memset(raw,255,fsize);
int x,y;
for(y=0;y<h;y++)for(x=1;x<w;x++){i=x+y*w-1;if(vec[i>>3]&(0x00000001<<(i&7)))setPixel(raw,w,h,x,y,0,0,0);}//x
for(x=0;x<w;x++)for(y=1;y<h;y++){i=x+y*w-1;if(vec[i>>3]&(0x00000100<<(i&7)))setPixel(raw,w,h,x,y,0,0,0);}//y
Суть кода - преобразование растровой картинки в контуры - там где есть резкая смена яркости получаем черную точку, иначе белый фон (255).
Суть проблемы - медленно - функция RedEyeVec обрабатывает примерно 20 кадров 640*480 в секунду на PentiumD 820 (2.8GHz)
Какие будут предложения? Склоняюсь к тому, чтобы переписать ф-цию на асме...
ЗЫ Все права защищены. Распостраняется по лицензии GNU GPL.