next up previous contents
Up: Программы спец. обработки фона. Previous: Интерфейс программы обработки.

Пример написания интерфейса программы обработки.

#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;
}