int main(int argc, char** argv) { IplImage* src = cvLoadImage( argv[1], 1 ); IplImage* dst = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); IplImage* dst2 = cvCreateImage(cvGetSize(src),src->depth,src->nChannels); float K=atof(argv[3]); float centerX=atoi(argv[4]); float centerY=atoi(argv[5]); int width = cvGetSize(src).width; int height = cvGetSize(src).height; xshift = calc_shift(0,centerX-1,centerX,K); float newcenterX = width-centerX; float xshift_2 = calc_shift(0,newcenterX-1,newcenterX,K); yshift = calc_shift(0,centerY-1,centerY,K); float newcenterY = height-centerY; float yshift_2 = calc_shift(0,newcenterY-1,newcenterY,K); // scale = (centerX-xshift)/centerX; xscale = (width-xshift-xshift_2)/width; yscale = (height-yshift-yshift_2)/height; std::cerr<<xshift<<" "<<yshift<<" "<<xscale<<" "<<yscale<<std::endl; std::cerr<<cvGetSize(src).height<<std::endl; std::cerr<<cvGetSize(src).width<<std::endl; for(int j=0;j<cvGetSize(dst).height;j++){ for(int i=0;i<cvGetSize(dst).width;i++){ CvScalar s; float x = getRadialX((float)i,(float)j,centerX,centerY,K); float y = getRadialY((float)i,(float)j,centerX,centerY,K); sampleImage(src,y,x,s); cvSet2D(dst,j,i,s); } } #if 0 cvNamedWindow( "Source1", 1 ); cvShowImage( "Source1", dst); cvWaitKey(0); #endif cvSaveImage(argv[2],dst,0); #if 0 for(int j=0;j<cvGetSize(src).height;j++){ for(int i=0;i<cvGetSize(src).width;i++){ CvScalar s; sampleImage(src,j+0.25,i+0.25,s); cvSet2D(dst,j,i,s); } } cvNamedWindow( "Source1", 1 ); cvShowImage( "Source1", src); cvWaitKey(0); #endif }
float calc_shift(float x1,float x2,float cx,float k){ float x3 = x1+(x2-x1)*0.5; float res1 = x1+((x1-cx)*k*((x1-cx)*(x1-cx))); float res3 = x3+((x3-cx)*k*((x3-cx)*(x3-cx))); // std::cerr<<"x1: "<<x1<<" - "<<res1<<" x3: "<<x3<<" - "<<res3<<std::endl; if(res1>-thresh and res1 < thresh) return x1; if(res3<0){ return calc_shift(x3,x2,cx,k); } else{ return calc_shift(x1,x3,cx,k); } }
PORT void SetRXAShiftFreq (int channel, double fshift) { EnterCriticalSection (&ch[channel].csDSP); rxa[channel].shift.p->shift = fshift; calc_shift (rxa[channel].shift.p); LeaveCriticalSection (&ch[channel].csDSP); }
SHIFT create_shift (int run, int size, double* in, double* out, int rate, double fshift) { SHIFT a = (SHIFT) malloc0 (sizeof (shift)); a->run = run; a->size = size; a->in = in; a->out = out; a->rate = (double)rate; a->shift = fshift; calc_shift (a); return a; }
void setSamplerate_shift (SHIFT a, int rate) { a->rate = rate; a->phase = 0.0; calc_shift(a); }
void deskew(const char *infile, const char *outfile) { meta_parameters *meta = meta_read(infile); int nl = meta->general->line_count; int np = meta->general->sample_count; int nb = meta->general->band_count; char **band_name = extract_band_names(meta->general->bands, nb); int band, line, samp, deskewed = meta->sar->deskewed != 0; if (!meta->sar) asfPrintError("Cannot deskew data without a sar block!\n"); char *tmp_outfile; int do_rename = FALSE; if (strcmp(infile, outfile) == 0 && nb>1) { // user wants to deskew in-place // we can't actually do that on multi-band data, too much to keep in memory // use a temporary file, then clobber input file tmp_outfile = appendToBasename(outfile, "_tmp"); do_rename = TRUE; } else { // normal case: either // 1) single-band in-place deskew // 2) not in-place deskew (single or multi) tmp_outfile = STRDUP(outfile); } // calculate the amount of shift necessary double fac = calc_shift(meta, 0, 0); // Not sure if we need this or not... //fac *= meta->general->x_pixel_size / meta->general->y_pixel_size; // the "lower" array stores the required shifts, indexed by column // (the amount of shift is row-independent) int *lower = MALLOC(np * sizeof(int)); for (samp=0; samp<np; ++samp) lower[samp] = (int) floor(fac*(double)samp); if (meta->sar->deskewed) { asfPrintStatus("Data is already deskewed.\n"); } else { asfPrintStatus("Far-range shift amount: "); if (lower[np-1] > 0) asfPrintStatus("%d pixels down.\n", lower[np-1]); else asfPrintStatus("%d pixels up.\n", -lower[np-1]); } float *ibuf = MALLOC(np * sizeof(float)); float *obuf = CALLOC(np*nl, sizeof(float)); FILE *fpi = fopenImage(infile, "rb"); for (band=0; band<nb; ++band) { if (nb>1) asfPrintStatus("Deskewing band: %s\n", band_name[band]); // apply deskewing to this band for (line=0; line<nl; ++line) { get_float_line(fpi, meta, line + nl*band, ibuf); for (samp=0; samp<np; ++samp) { int out_line = deskewed ? line : line + lower[samp]; if (out_line >= 0 && out_line < nl) obuf[out_line*np+samp] = ibuf[samp]; } asfLineMeter(line,nl); } // write out this band FILE *fpo = fopenImage(tmp_outfile, band>0 ? "ab" : "wb"); put_float_lines(fpo, meta, band*nl, nl, obuf); FCLOSE(fpo); } FCLOSE(fpi); FREE(obuf); FREE(ibuf); FREE(lower); // if we output to a temporary file, clobber the input if (do_rename) { char *tmp_outfile_img = appendExt(tmp_outfile, ".img"); char *outfile_img = appendExt(outfile, ".img"); //printf("Renaming: %s -> %s\n", tmp_outfile_img, outfile_img); rename(tmp_outfile_img, outfile_img); FREE(tmp_outfile_img); FREE(outfile_img); } FREE(tmp_outfile); // only need to update the deskewed flag in the metadata meta->sar->deskewed = 1; meta_write(meta, outfile); meta_free(meta); }
void setSamplerate_shift (SHIFT a, int rate) { a->rate = rate; calc_shift(a); }