#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <math.h> #include <time.h> #include <sys/time.h> #include <sys/types.h> #include <sys/times.h> #include "tv_image_lib.h" int get_fits(char *fitsname, int col0, int lin0, int frmw, int frmh, short *array, int *tv_lev0, int *tv_elref, int *nadd); void main(int argc, char *argv[]) { short *img; /* image memory */ int imgw, imgh; /* image size */ int nchan = 0; /* TV-chan. number */ short *frm1=NULL,*frm2=NULL; /* frames memory */ int col0, lin0, frmw, frmh; /* frame1 - ref.bgd */ int bg_lev0,bg_nadd; int col20, lin20; /* frame2 - curr.image */ int width, height; /* FFT frame size*/ int nseq; int i,j,k,l,x,y,pix,pix1,pix2; int n,nx,ny,kx,ky; char tmp[100],fname[100]; char *bgdfile=NULL; if (argc>1) nchan = atoi(argv[1]); if (argc>2) bgdfile = argv[2]; get_vs56_sh_mem(); img = tv_chan_image (nchan); imgw = tv_chan_img_width(); imgh = tv_chan_img_height(); nseq = tv_chan_seq_num(); /* перезагрузка образца фона */ reload_bgd: if(isatty(0)) { /* для ручной */ fputs("Define the 1-st frame ...",stdout); /* интерактивной */ fgets(tmp,10,stdin); /* отладки */ } tv_chan_get_frame(&col0, &lin0, &frmw, &frmh); width=frmw; height=frmh; if(col0==0 && lin0==0 && frmw==imgw && frmh==imgh ) { fprintf(stderr,"WARNING! No Frame defined for chan.%d\n",nchan); } if(frm1!=NULL) free(frm1); frm1 = (short *)malloc(frmw*frmh*sizeof(short)); if(bgdfile!=NULL) { /* считывание фрейма из FIST-файла в frm1 */ if(!get_fits(bgdfile, col0,lin0,frmw,frmh, frm1, &bg_lev0, &i, &bg_nadd)) { fputs("quit\n",stdout); fflush(stdout); exit(1); } } else { for (j=0; j<frmh; j++) { /* копирование TV-фрейма в frm1 */ y=lin0+j; for (i=0; i<frmw; i++) { x=col0+i; frm1[frmw*j+i] = img[imgw*y+x]; } } fprintf(stderr, "Load BGD-frame from TV-image: %d,%d %d x %d\n", col0,lin0,frmw,frmh); } get_command: if(isatty(0)) fputs("Point to the 2-nd one ... (or type 'q' to quit) ",stdout); fgets(tmp,99,stdin); /* ввод строки команды */ /* и разбор её: */ if(tmp[0]=='q') exit(0); /* quit */ else if(tmp[0]=='r') goto reload_bgd; /* reload */ else if(tmp[0]=='f') { /* file .... */ char *p; p=strtok(tmp," =\t\n"); p=strtok(NULL," =\t\n"); if(p!=NULL) { if(strcmp(p,"no")) { strncpy(fname,p,90); /* file fname.mt */ bgdfile=fname; } else bgdfile=NULL; /* file no */ } else bgdfile=NULL; /* file */ goto get_command; } else if(tmp[0]=='n' || tmp[0]=='\n') /* next */ goto next_frame; else if(tmp[0]=='s') /* subtract */ goto subtruct_frm; else if(tmp[0]=='z') { /* zero ...*/ if(strchr(tmp,'x')) xmx = 0.; /* zero x */ if(strchr(tmp,'y')) ymx = 0.; /* zero y */ if(strchr(tmp,'x')==NULL && strchr(tmp,'y')==NULL) xmx = ymx = 0.; /* zero */ goto get_command; } else goto get_command; ........................... next_frame: /* вообще говоря другое положение фрейма (полезно при отладке...) */ tv_chan_get_frame(&col20, &lin20, &i, &j); if(frm2!=NULL) free(frm2); frm2 = (short *)malloc(frmw*frmh*sizeof(short)); for (j=0; j<frmh; j++) { /* копирование тек.фрейма в frm2 */ y=lin20+j; for (i=0; i<frmw; i++) { x=col20+i; frm2[frmw*j+i] = img[imgw*y+x]; } } ........................... Алгоритм вычисления сдвига фона в frm2 относительно запомненного в frm1 образца. Например - максимум FFT кореляции по краю фрейма (т.е. исключая центральную часть) xmx = максимум кореляции по X ymx = максимум кореляции по Y ........................... printf("dX=%.2f\ndY=%.2f\n",xmx,ymx); fflush(stdout); goto get_command; subtruct_frm: ........................... Алгоритм вычитания фона в frm1 из текущего TV-изображения Например: 1. копирование frm1 в frm2 со сдвигом на xmx,ymx 2. определение коэффициентов линейной регрессии A и B между frm2 и текущим TV-изображением по краю фрейма (т.е. масштаб и уровень приведения фона к тек.изображению) 3. собственно вычитание frm2*A+B из TV-изображения ........................... tv_chan_set_seq_num(tv_chan_seq_num()+1); goto get_command; }