#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;
}
Документация АСУ БТА