apps/ccam/lasercalc.c

Go to the documentation of this file.
00001 /*
00002  * lasercalc.c
00003  *
00004  */
00005 #include <fcntl.h>  /*open*/
00006 #include <unistd.h> /* close */
00007 #include <string.h> /* memset */
00008 
00009 #include <stdio.h>
00010 #include <stdlib.h>
00011 #include <sys/mman.h>           /* mmap */
00012 #include <math.h>
00013 
00014 #include "lasercalc.h"
00015 #define D(x)
00016 
00017 
00018 //   MD(fprintf(stderr,"width- %d, height %d, quality - %d, contrast - %d, color - %d, orient - %d, depth - %d\r\n", ImageWidth,ImageHeight, Quality, Contrast, Color, bayerOrient, Depth));
00019 
00020 /*
00021 struct beam_params {
00022 // primary sums
00023   MYPRECISION                   SQ;             // Sum of all pixels values
00024   MYPRECISION                   SxQ;    // Sum of (pixels values multiplied by x)
00025   MYPRECISION                   SyQ;    // Sum of (pixels values multiplied by y)
00026   MYPRECISION                   SxxQ;   // Sum of (pixels values multiplied by x*x)
00027   MYPRECISION                   SyyQ;   // Sum of (pixels values multiplied by y*x)
00028   MYPRECISION                   SxyQ;   // Sum of (pixels values multiplied by x*y)
00029 //momentums
00030   MYPRECISION                   xc;             // center x
00031   MYPRECISION                   yc;             // center y
00032   MYPRECISION                   s2x;    // (sigma_x)^2
00033   MYPRECISION                   s2y;    // (sigma_y)^2
00034   MYPRECISION                   sxy;    //  (sigma_xy)^2
00035 //results
00036   MYPRECISION                   dx;             // diamerter_x
00037   MYPRECISION                   dy;             // diamerter_y
00038   MYPRECISION                   d;              // diamerter
00039   MYPRECISION                   az;             // ellipse azimuth
00040   MYPRECISION                   dxe;    // ellipse width x
00041   MYPRECISION                   dye;    // ellipse width y
00042   MYPRECISION                   ar;             // aspect ratio
00043 };
00044 
00045 */
00046 int calculateBeamParams(const char * dmaFileName,
00047                                         int     width,
00048                                         int height,
00049                                         struct beam_params * beam
00050                                         ) {
00051    int  i,j,k,l,y;
00052    int  d,q;
00053    int  DMALongsPerRow;
00054    int  data_fd;
00055    long long iSQ=0;
00056    long long iSxQ=0;
00057    long long iSyQ=0;
00058    long long iSxxQ=0;
00059    long long iSyyQ=0;
00060    long long iSxyQ=0;
00061    long long d2;
00062    int   eps;
00063 
00064    unsigned long        * DMAData;  // opened through mmap
00065    unsigned long        scols [MAX_IMAGE_WIDTH];        // sum of each column
00066    unsigned long        scolsy[MAX_IMAGE_WIDTH];        // sum of each column: (pixel value*y)
00067    unsigned long        srows [MAX_IMAGE_HEIGHT];       // sum of each row
00068 
00069    MD(fprintf(stderr,"dmaFileName- %s,width - %d, height %d\r\n",dmaFileName,width,height));
00070    if ( (width>MAX_IMAGE_WIDTH) ||
00071         (width<=0) ||
00072             (height>MAX_IMAGE_HEIGHT) ||
00073         (height<=0) ) return -1;
00074    i=width/3;
00075    DMALongsPerRow = (3*i == width)? i: i+1;      
00076 //try open dmaFileName
00077    if ((data_fd = open(dmaFileName, O_RDONLY))==-1) return -2; // file open error
00078  MD(fprintf(stderr,"\r\n"));
00079         DMAData = (unsigned long *) mmap(0, (DMALongsPerRow*height)<<2, PROT_READ, MAP_OPTIONS, data_fd, 0);
00080  MD(fprintf(stderr,"\r\n"));
00081 
00082         if((int)(DMAData) == -1) { // Error in mmap
00083                 close(data_fd);
00084                 return -3;
00085         }
00086  MD(fprintf(stderr,"\r\n"));
00087  // prepare arrays for integration
00088     memset (scols, 0,sizeof(scols ));
00089     memset (scolsy,0,sizeof(scolsy));
00090     memset (srows, 0,sizeof(srows));
00091         for (i=0;i<height;i++) {
00092           l=DMALongsPerRow*i;
00093           d=DMAData[l++];
00094           k=0;
00095           y=height-i;
00096           for (j=0;j<width;j++) {
00097              q=(d>>k)&0x3ff;
00098                  scols [j]+=q;
00099                  scolsy[j]+=q*y;
00100                  srows [y]+=q;
00101              if ((k+=10)>20) {
00102                    k=0;
00103                    d=DMAData[l++];
00104                  }
00105 
00106           }
00107         }
00108 // calculate long long (64-bit) integer sums
00109         for (j=0;j<width;j++) {
00110                 iSQ+= scols[j];
00111                 d2=((long long) j) * scols[j];
00112                 iSxQ+=d2;
00113                 iSxxQ+=d2 * j;
00114                 iSxyQ+=((long long) j) * scolsy[j];
00115         }
00116         for (i=0;i<height;i++) {
00117                 d2=((long long) i) * srows[i];
00118                 iSyQ+=d2;
00119                 iSyyQ+=d2 * i;
00120         }
00121 // convert them to floating point format (see if single or double precision)
00122         beam->SQ=       iSQ;
00123         beam->SxQ=      iSxQ;
00124         beam->SyQ=      iSyQ;
00125         beam->SxxQ=     iSxxQ;
00126         beam->SyyQ=     iSyyQ;
00127         beam->SxyQ=     iSxyQ;
00128 // now - center and second order moments
00129         beam->xc=       beam->SxQ/beam->SQ;
00130         beam->yc=       beam->SyQ/beam->SQ;
00131         beam->s2x=      beam->SxxQ/beam->SQ - (beam->xc*beam->xc);
00132         beam->s2y=      beam->SyyQ/beam->SQ - (beam->yc*beam->yc);
00133         beam->sxy=      beam->SxyQ/beam->SQ - (beam->xc*beam->yc);
00134 // results
00135         beam->dx=       4*sqrt(beam->s2x);
00136         beam->dy=       4*sqrt(beam->s2y);
00137         beam->d=                4*sqrt((beam->s2x+beam->s2y)/2);
00138         beam->az=       0.5*atan2(2*beam->sxy,beam->s2x-beam->s2y);
00139         
00140         eps= (beam->s2x > beam->s2y) ? 1: -1;
00141         beam->dxe=      2.0*sqrt(2.0)*sqrt(beam->s2x+beam->s2y+\
00142                 eps*sqrt((beam->s2x-beam->s2y)*(beam->s2x-beam->s2y) +4*(beam->sxy*beam->sxy)));
00143         beam->dye=      2.0*sqrt(2.0)*sqrt(beam->s2x+beam->s2y-\
00144                 eps*sqrt((beam->s2x-beam->s2y)*(beam->s2x-beam->s2y) +4*(beam->sxy*beam->sxy)));
00145         beam->ar=       beam->dye/beam->dxe;
00146     return 0; // all OK
00147 }
00148 
00149 

Generated on Thu Aug 7 16:18:59 2008 for elphel by  doxygen 1.5.1