From b9084907a3e004e522932f65668fa3ecd7b75b8f Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 12 Jun 2025 14:31:51 +0300 Subject: [PATCH] forgotten fixes --- LocCorr_new/CMakeLists.txt | 4 +- LocCorr_new/Changelog | 2 +- LocCorr_new/binmorph.c | 48 ++++++------- LocCorr_new/cameracapture.c | 50 ++++++-------- LocCorr_new/config.c | 13 ++-- LocCorr_new/config.h | 7 +- LocCorr_new/fits.c | 5 -- LocCorr_new/fits.h | 1 - LocCorr_new/hikrobot.c | 51 +++++++++----- LocCorr_new/hikrobot.h | 4 +- LocCorr_new/imagefile.c | 12 +++- LocCorr_new/imagefile.h | 1 + LocCorr_new/improc.c | 134 +++++++++++++++++++----------------- LocCorr_new/socket.c | 3 +- 14 files changed, 180 insertions(+), 155 deletions(-) diff --git a/LocCorr_new/CMakeLists.txt b/LocCorr_new/CMakeLists.txt index 9450ac8..f1e5509 100644 --- a/LocCorr_new/CMakeLists.txt +++ b/LocCorr_new/CMakeLists.txt @@ -21,7 +21,7 @@ option(GRASSHOPPER "Add GrassHopper cameras support" OFF) option(HIKROBOT "Add HikRobot cameras support" OFF) # default flags -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -Wextra") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -W -Wextra -std=c17") set(CMAKE_COLOR_MAKEFILE ON) # cmake -DDEBUG=yes -> debugging @@ -94,7 +94,7 @@ target_include_directories(${PROJ} PUBLIC ${MODULES_INCLUDE_DIRS} ${FLYCAP_INCLU target_link_directories(${PROJ} PUBLIC ${MODULES_LIBRARY_DIRS} ${FLYCAP_LIBRARY_DIRS} ${BASLER_LIBRARY_DIRS} ${MVS_LIBRARY_DIRS}) message("MOD: ${MODULES_LIBRARY_DIRS}, FC: ${FLYCAP_LIBRARY_DIRS}, MVS: ${MVS_LIBRARY_DIRS}") # -D -add_definitions(${CFLAGS} -DLOCALEDIR=\"${LOCALEDIR}\" +add_definitions(${CFLAGS} -D_XOPEN_SOURCE=666 -D_POSIX_C_SOURCE=600700 -D_DEFAULT_SOURCE -DLOCALEDIR=\"${LOCALEDIR}\" -DPACKAGE_VERSION=\"${VERSION}\" -DGETTEXT_PACKAGE=\"${PROJ}\" -DMINOR_VERSION=\"${MINOR_VERSION}\" -DMID_VERSION=\"${MID_VERSION}\" -DMAJOR_VERSION=\"${MAJOR_VERSION}\" -DTHREAD_NUMBER=${PROCESSOR_COUNT}) diff --git a/LocCorr_new/Changelog b/LocCorr_new/Changelog index 9dfcdcc..d05e7b2 100644 --- a/LocCorr_new/Changelog +++ b/LocCorr_new/Changelog @@ -1,3 +1,3 @@ Mon Apr 28 13:05:48 MSK 2025 Move to libusefull_macros v0.3.2. -Fixed some troubles with `inotifying` log files. \ No newline at end of file +Fixed some troubles with `inotifying` log files. diff --git a/LocCorr_new/binmorph.c b/LocCorr_new/binmorph.c index f322a23..fff4d5f 100644 --- a/LocCorr_new/binmorph.c +++ b/LocCorr_new/binmorph.c @@ -436,30 +436,30 @@ size_t *il_cclabel4(uint8_t *Img, int W, int H, il_ConnComps **CC){ l_boxes[i].ymin = H; } #pragma omp for nowait - for(int y = 0; y < H; ++y){ - size_t *lptr = &labels[y*W]; - for(int x = 0; x < W; ++x, ++lptr){ - if(!*lptr) continue; - register size_t mark = indexes[*lptr]; - *lptr = mark; - il_Box *b = &l_boxes[mark]; - ++b->area; - if(b->xmax < x) b->xmax = x; - if(b->xmin > x) b->xmin = x; - if(b->ymax < y) b->ymax = y; - if(b->ymin > y) b->ymin = y; - } - } - #pragma omp critical - for(size_t i = 1; i < cidx; ++i){ - il_Box *ob = &boxes[i], *ib = &l_boxes[i]; - if(ob->xmax < ib->xmax) ob->xmax = ib->xmax; - if(ob->xmin > ib->xmin) ob->xmin = ib->xmin; - if(ob->ymax < ib->ymax) ob->ymax = ib->ymax; - if(ob->ymin > ib->ymin) ob->ymin = ib->ymin; - ob->area += ib->area; - } - FREE(l_boxes); + for(int y = 0; y < H; ++y){ + size_t *lptr = &labels[y*W]; + for(int x = 0; x < W; ++x, ++lptr){ + if(!*lptr) continue; + register size_t mark = indexes[*lptr]; + *lptr = mark; + il_Box *b = &l_boxes[mark]; + ++b->area; + if(b->xmax < x) b->xmax = x; + if(b->xmin > x) b->xmin = x; + if(b->ymax < y) b->ymax = y; + if(b->ymin > y) b->ymin = y; + } + } + #pragma omp critical + for(size_t i = 1; i < cidx; ++i){ + il_Box *ob = &boxes[i], *ib = &l_boxes[i]; + if(ob->xmax < ib->xmax) ob->xmax = ib->xmax; + if(ob->xmin > ib->xmin) ob->xmin = ib->xmin; + if(ob->ymax < ib->ymax) ob->ymax = ib->ymax; + if(ob->ymin > ib->ymin) ob->ymin = ib->ymin; + ob->area += ib->area; + } + FREE(l_boxes); } FREE(assoc); FREE(indexes); diff --git a/LocCorr_new/cameracapture.c b/LocCorr_new/cameracapture.c index 67929d4..cdac4d4 100644 --- a/LocCorr_new/cameracapture.c +++ b/LocCorr_new/cameracapture.c @@ -35,7 +35,7 @@ static camera *theCam = NULL; static float gain = 0., gainmax = 0.; -static float exptime = 100.; +static float exptime = -1.; static float brightness = 0.; static int connected = FALSE; @@ -241,10 +241,10 @@ static void *procthread(void* v){ double t0 = sl_dtime(); #endif while(!stopwork){ - DBG("===== iCaptured=%d", iCaptured); pthread_mutex_lock(&capt_mutex); + //DBG("===== iCaptured=%d", iCaptured); if(Icap[iCaptured]){ - DBG("===== got image #%d @ %g", iCaptured, sl_dtime() - t0); + DBG("===== got image iCaptured=#%d @ %g", iCaptured, sl_dtime() - t0); Image *oIma = Icap[iCaptured]; // take image here and free buffer Icap[iCaptured] = NULL; pthread_mutex_unlock(&capt_mutex); @@ -252,14 +252,11 @@ static void *procthread(void* v){ if(theconf.medfilt){ Image *X = get_median(oIma, theconf.medseed); if(X){ - FREE(oIma->data); - FREE(oIma); + Image_free(&oIma); oIma = X; } } - DBG("===== process"); process(oIma); - DBG("===== done"); lastimdata.avg = oIma->avg_intensity; lastimdata.bkg = oIma->background; lastimdata.minval = oIma->minval; @@ -268,12 +265,10 @@ static void *procthread(void* v){ getcenter(&lastimdata.xc, &lastimdata.yc); } if(theconf.expmethod == EXPAUTO){ - DBG("test"); if(needs_exposure_adjustment(oIma, lastimdata.xc, lastimdata.yc)) recalcexp(oIma); - DBG("done"); }else{ - if(fabs(theconf.fixedexp - exptime) > FLT_EPSILON) - exptime = theconf.fixedexp; + if(fabs(theconf.exptime - exptime) > FLT_EPSILON) + exptime = theconf.exptime; if(fabs(theconf.gain - gain) > FLT_EPSILON) gain = theconf.gain; if(fabs(theconf.brightness - brightness) > FLT_EPSILON) @@ -281,14 +276,13 @@ static void *procthread(void* v){ } //Icap[iCaptured] = NULL; //pthread_mutex_unlock(&capt_mutex); - FREE(oIma->data); - FREE(oIma); - DBG("---- cleared image data @ %g", sl_dtime() - t0); + Image_free(&oIma); + DBG("===== cleared image data @ %g", sl_dtime() - t0); }else{ - DBG("NO image data"); + //DBG("===== NO image data"); pthread_mutex_unlock(&capt_mutex); } - DBG("NEXT!"); + //DBG("===== NEXT!"); usleep(1000); } return NULL; @@ -305,6 +299,7 @@ int camcapture(void (*process)(Image*)){ LOGERR("pthread_create() for image processing failed"); ERR("pthread_create()"); } + exptime = theconf.exptime; while(1){ double t0 = sl_dtime(); if(stopwork){ @@ -339,6 +334,7 @@ int camcapture(void (*process)(Image*)){ DBG("Change exptime to %.2fms\n", exptime); if(theCam->setexp(exptime)){ oldexptime = exptime; + theconf.exptime = exptime; }else{ WARNX("Can't change exposition time to %gms", exptime); } @@ -350,6 +346,7 @@ int camcapture(void (*process)(Image*)){ LOGDBG("Change gain to %g", gain); if(theCam->setgain(gain)){ oldgain = gain; + theconf.gain = gain; }else{ WARNX("Can't change gain to %g", gain); LOGWARN("Can't change gain to %g", gain); @@ -364,7 +361,7 @@ int camcapture(void (*process)(Image*)){ DBG("Try to grab (T=%g)", sl_dtime() - t0); static int errctr = 0; if(!(oIma = theCam->capture())){ - WARNX("Can't grab image"); + WARNX("---- Can't grab image"); if(++errctr > MAX_CAPT_ERRORS){ LOGERR("camcapture(): too much capture errors; reconnect camera"); camdisconnect(); @@ -372,12 +369,12 @@ int camcapture(void (*process)(Image*)){ } continue; }else errctr = 0; - DBG("Grabbed @ %g", sl_dtime() - t0); + DBG("---- Grabbed @ %g", sl_dtime() - t0); pthread_mutex_lock(&capt_mutex); if(iCaptured < 0) iCaptured = 0; else iCaptured = !iCaptured; if(Icap[iCaptured]){ // try current value if previous is still busy - DBG("iCap=%d busy!", iCaptured); + DBG("---- iCap=%d busy!", iCaptured); iCaptured = !iCaptured; } if(!Icap[iCaptured]){ // previous buffer is free @@ -386,22 +383,15 @@ int camcapture(void (*process)(Image*)){ oIma = NULL; }else{ // clear our image - there's no empty buffers DBG("---- no free buffers for iCap=%d", iCaptured); - FREE(oIma->data); - FREE(oIma); + Image_free(&oIma); } pthread_mutex_unlock(&capt_mutex); DBG("unlocked, T=%g", sl_dtime() - t0); } pthread_cancel(proc_thread); - if(oIma){ - FREE(oIma->data); - FREE(oIma); - } + if(oIma) Image_free(&oIma); for(int i = 0; i < 2; ++i){ - if(Icap[i]){ - FREE(Icap[i]->data); - FREE(Icap[i]); - } + if(Icap[i]) Image_free(&Icap[i]); } camdisconnect(); DBG("CAMCAPTURE: out"); @@ -430,7 +420,7 @@ char *camstatus(const char *messageid, char *buf, int buflen){ float xc, yc; getcenter(&xc, &yc); snprintf(buf, buflen, "{ \"%s\": \"%s\", \"camstatus\": \"%sconnected\", \"impath\": \"%s\", \"imctr\": %llu, " - "\"fps\": %.3f, \"expmethod\": \"%s\", \"exposition\": %g, \"gain\": %g, \"maxgain\": %g, \"brightness\": %g, " + "\"fps\": %.3f, \"expmethod\": \"%s\", \"exptime\": %g, \"gain\": %g, \"maxgain\": %g, \"brightness\": %g, " "\"xcenter\": %.1f, \"ycenter\": %.1f , \"minval\": %d, \"maxval\": %d, \"background\": %d, " "\"average\": %.1f, \"xc\": %.1f, \"yc\": %.1f, \"xsigma\": %.1f, \"ysigma\": %.1f, \"area\": %d }\n", MESSAGEID, messageid, connected ? "" : "dis", impath, ImNumber, getFramesPerS(), diff --git a/LocCorr_new/config.c b/LocCorr_new/config.c index 75ba0c8..1db2524 100644 --- a/LocCorr_new/config.c +++ b/LocCorr_new/config.c @@ -62,7 +62,7 @@ configuration theconf = { .throwpart=DEFAULT_THROWPART, .maxexp=EXPOS_MAX - 1., .minexp=EXPOS_MIN, - .fixedexp=EXPOS_MIN*2, + .exptime=EXPOS_MIN*2, .gain=20., .intensthres=DEFAULT_INTENSTHRES, .medseed=MIN_MEDIAN_SEED, @@ -74,6 +74,7 @@ static int compConfVals(const void *_1st, const void *_2nd){ return strcmp(a->name, b->name); } +// could be in unsorted order as whould be sorted at first help call // {"", PAR_DOUBLE, (void*)&theconf., 0}, static confparam parvals[] = { {"maxarea", PAR_INT, (void*)&theconf.maxarea, 0, MINAREA, MAXAREA, @@ -99,7 +100,7 @@ static confparam parvals[] = { {"equalize", PAR_INT, (void*)&theconf.equalize, 0, 0., 1., "make histogram equalization"}, {"expmethod", PAR_INT, (void*)&theconf.expmethod, 0, 0., 1., - "exposition method: 0 - auto, 1 - fixed"}, + "0 - automatic calculation of gain and exptime, 1 - use fixed values"}, {"naverage", PAR_INT, (void*)&theconf.naverage, 0, 1., NAVER_MAX, "calculate mean position by N images"}, {"umax", PAR_INT, (void*)&theconf.maxUpos, 0, -MAXSTEPS, MAXSTEPS, @@ -146,8 +147,8 @@ static confparam parvals[] = { "minimal exposition time"}, {"maxexp", PAR_DOUBLE, (void*)&theconf.maxexp, 0, 0., EXPOS_MAX, "maximal exposition time"}, - {"fixedexp", PAR_DOUBLE, (void*)&theconf.fixedexp, 0, EXPOS_MIN, EXPOS_MAX, - "fixed (in manual mode) exposition time"}, + {"exptime", PAR_DOUBLE, (void*)&theconf.exptime, 0, EXPOS_MIN, EXPOS_MAX, + "exposition time (you can change it only when expmethod==1)"}, {"intensthres", PAR_DOUBLE, (void*)&theconf.intensthres, 0, 0., 1., "threshold by total object intensity when sorting = |I1-I2|/(I1+I2)"}, {"gain", PAR_DOUBLE, (void*)&theconf.gain, 0, GAIN_MIN, GAIN_MAX, @@ -162,8 +163,10 @@ static confparam parvals[] = { "median filter radius"}, {"fixedbg", PAR_INT, (void*)&theconf.fixedbkg, 0, 0., 1., "don't calculate background, use fixed value instead"}, - {"fbglevel", PAR_INT, (void*)&theconf.fixedbkgval, 0, FIXED_BK_MIN, FIXED_BK_MAX, + {"background", PAR_INT, (void*)&theconf.background, 0, FIXED_BK_MIN, FIXED_BK_MAX, "fixed background level"}, + {"writedi", PAR_INT, (void*)&theconf.writedebugimgs, 0, 0., 1., + "write debug images (binary/erosion/opening)"}, {NULL, 0, NULL, 0, 0., 0., NULL} }; diff --git a/LocCorr_new/config.h b/LocCorr_new/config.h index 2a028aa..f53a820 100644 --- a/LocCorr_new/config.h +++ b/LocCorr_new/config.h @@ -34,7 +34,7 @@ #define MAX_THROWPART (0.9) #define MAX_OFFSET (10000) // min/max exposition in ms -#define EXPOS_MIN (0.01) +#define EXPOS_MIN (1e-9) #define EXPOS_MAX (4001.) #define GAIN_MIN (0.) #define GAIN_MAX (256.) @@ -99,7 +99,8 @@ typedef struct{ int medfilt; // == 1 to make median filter before calculations int medseed; // median seed int fixedbkg; // don't calculate background, use fixed value instead - int fixedbkgval; // value of bk + int background; // value of background + int writedebugimgs; // write debugging images: binary/erosion/opening // dU = Kxu*dX + Kyu*dY; dV = Kxv*dX + Kyv*dY double Kxu; double Kyu; double Kxv; double Kyv; @@ -109,7 +110,7 @@ typedef struct{ double throwpart; // part of values to throw avay @ histogram equalisation double maxexp; // minimal and maximal exposition (in ms) double minexp; - double fixedexp; // exptime in manual mode + double exptime; // exposure time double gain; // gain value in manual mode double brightness; // brightness @camera double intensthres; // threshold for stars intensity comparison: fabs(Ia-Ib)/(Ia+Ib) > thres -> stars differs diff --git a/LocCorr_new/fits.c b/LocCorr_new/fits.c index b3cd3e7..2a9a47d 100644 --- a/LocCorr_new/fits.c +++ b/LocCorr_new/fits.c @@ -47,11 +47,6 @@ do{ fitsstatus = 0; \ if(status) fits_report_error(stderr, status);\ }while(0) -void Image_free(Image **img){ - FREE((*img)->data); - FREE(*img); -} - // I->data should be allocated!!! static inline void convflt2ima(float *f, Image *I){ if(!I || !I->data || !f) return; diff --git a/LocCorr_new/fits.h b/LocCorr_new/fits.h index 2d3fd76..bc38460 100644 --- a/LocCorr_new/fits.h +++ b/LocCorr_new/fits.h @@ -26,7 +26,6 @@ #include "imagefile.h" -void Image_free(Image **ima); bool FITS_read(const char *filename, Image **fits); #endif // FITS_H__ diff --git a/LocCorr_new/hikrobot.c b/LocCorr_new/hikrobot.c index 10d4062..9dbbfed 100644 --- a/LocCorr_new/hikrobot.c +++ b/LocCorr_new/hikrobot.c @@ -279,7 +279,7 @@ static int cam_connect(){ WARNX("Can't turn off triggered mode"); return FALSE; } - if(!changeenum("AcquisitionMode", MV_ACQ_MODE_SINGLE)){ + if(!changeenum("AcquisitionMode", /*MV_ACQ_MODE_SINGLE*/ MV_ACQ_MODE_CONTINUOUS)){ WARNX("Can't set acquisition mode to single"); return FALSE; } @@ -356,50 +356,69 @@ static int changeformat(frameformat *f){ return TRUE; } -// exptime - in milliseconds! static int setexp(float e){ - if(!handle) return FALSE; - float eS = e / 1e3; - if(eS > extrvalues.maxexp || eS < extrvalues.minexp){ - WARNX("Wrong exposure time: %fs (should be [%fs..%fs])", eS, + if(!handle){ + WARNX("NO HANDLE"); + return FALSE; + } + if(e > extrvalues.maxexp || e < extrvalues.minexp){ + WARNX("Wrong exposure time: %fs (should be [%fs..%fs])", e, extrvalues.minexp, extrvalues.maxexp); return FALSE; } - if(!changefloat("ExposureTime", e * 1e3)) return FALSE; - exptime = eS; + if(!changefloat("ExposureTime", e * 1e6)){ + WARNX("Can't set exptime %g", e); + return FALSE; + } + exptime = e; return TRUE; } static int cam_startexp(){ if(!handle || !pdata) return FALSE; - DBG("Start exposition for %gs", exptime); + DBG("+++++ Start exposition for %gs", exptime); MV_CC_StopGrabbing(handle); TRY(StartGrabbing); - ONERR() return FALSE; + ONERR(){ + DBG("+++++ Ooops! Can't start grabbing: try another time!"); + MV_CC_StopGrabbing(handle); + TRY(StartGrabbing); + ONERR(){ + DBG("+++++ ERR!"); + return FALSE; + } + } + DBG("+++++ OK, started"); return TRUE; } static Image* capture(){ double starttime = sl_dtime(); - if(!cam_startexp()) return NULL; + static int isstarted = 0; + if(!isstarted){ + if(!cam_startexp()) return NULL; + isstarted = 1; + } MV_FRAME_OUT_INFO_EX stImageInfo = {0}; // last image info - DBG("Started capt @ %g", sl_dtime() - starttime); + DBG("^^^^^^^^^^^^^^^^^^^^ Started capt @ %g", sl_dtime() - starttime); do{ usleep(100); double diff = exptime - (sl_dtime() - starttime); if(diff > 0.) continue; // wait until exposure ends DBG("diff = %g", diff); if(diff < -MAX_READOUT_TM){ // wait much longer than exp lasts - DBG("OOps, time limit"); + DBG("^^^^^^^^^^^^^^^^^^^^ OOps, time limit"); MV_CC_StopGrabbing(handle); + DBG("Restart grabbing"); + if(!cam_startexp()) isstarted = 0; return NULL; } - TRY(GetOneFrameTimeout, pdata, pdatasz, &stImageInfo, 10); + TRY(GetOneFrameTimeout, pdata, pdatasz, &stImageInfo, 100); ONOK() break; }while(1); - DBG("Tcapt=%g, exptime=%g", sl_dtime() - starttime, exptime); + DBG("^^^^^^^^^^^^^^^^^^^^ Tcapt=%g, exptime=%g", sl_dtime() - starttime, exptime); Image *captIma = u8toImage(pdata, stImageInfo.nWidth, stImageInfo.nHeight, stImageInfo.nWidth); - DBG("return @ %g", sl_dtime() - starttime); + DBG("^^^^^^^^^^^^^^^^^^^^ return @ %g", sl_dtime() - starttime); return captIma; } diff --git a/LocCorr_new/hikrobot.h b/LocCorr_new/hikrobot.h index 3c88f1e..e7e9100 100644 --- a/LocCorr_new/hikrobot.h +++ b/LocCorr_new/hikrobot.h @@ -24,10 +24,10 @@ #define HIKROBOT_CAPT_NAME "hikrobot" // maximal readout time, seconds -#define MAX_READOUT_TM (6.) +#define MAX_READOUT_TM (0.3) // tolerance of float values -#define HR_FLOAT_TOLERANCE (0.005) +#define HR_FLOAT_TOLERANCE (1.1) extern camera Hikrobot; #endif diff --git a/LocCorr_new/imagefile.c b/LocCorr_new/imagefile.c index d513b73..5a31ad0 100644 --- a/LocCorr_new/imagefile.c +++ b/LocCorr_new/imagefile.c @@ -204,14 +204,24 @@ Image *Image_read(const char *name){ * @return data allocated here */ Image *Image_new(int w, int h){ + static uint64_t cnt = 0; if(w < 1 || h < 1) return NULL; + DBGLOG("Image_new(%d, #%u)", w*h, cnt); Image *outp = MALLOC(Image, 1); outp->width = w; outp->height = h; + outp->counter = cnt++; outp->data = MALLOC(Imtype, w*h); return outp; } +void Image_free(Image **I){ + if(!I || !*I) return; + DBGLOG("Image_free(%d, #%d)", (*I)->height * (*I)->width, (*I)->counter); + FREE((*I)->data); + FREE(*I); +} + /** * @brief Image_sim - allocate memory for new empty Image with similar size & data type * @param i - sample image @@ -267,7 +277,7 @@ int calc_background(Image *img){ WARNX("Image values too small"); return FALSE; } - img->background = theconf.fixedbkgval; + img->background = theconf.background; return TRUE; } size_t histogram[HISTOSZ]; diff --git a/LocCorr_new/imagefile.h b/LocCorr_new/imagefile.h index 31d0c0f..c3680df 100644 --- a/LocCorr_new/imagefile.h +++ b/LocCorr_new/imagefile.h @@ -46,6 +46,7 @@ typedef struct{ float avg_intensity; Imtype background; // background value ptstat_t stat; // image statistics + uint64_t counter; // image counter } Image; // input file/directory type diff --git a/LocCorr_new/improc.c b/LocCorr_new/improc.c index 67db228..b58523b 100644 --- a/LocCorr_new/improc.c +++ b/LocCorr_new/improc.c @@ -203,8 +203,6 @@ void process_file(Image *I){ static int prev_x = -1, prev_y = -1; static object *Objects = NULL; static size_t Nallocated = 0; - il_ConnComps *cc = NULL; - size_t *S = NULL; #ifdef EBUG double t0 = sl_dtime(), tlast = t0; #define DELTA(p) do{double t = sl_dtime(); DBG("---> %s @ %gms (delta: %gms)", p, (t-t0)*1e3, (t-tlast)*1e3); tlast = t;}while(0) @@ -225,6 +223,7 @@ void process_file(Image *I){ //DELTA("Save original"); if(calc_background(I)){ DBG("backgr = %d", I->background); + theconf.background = I->background; DELTA("Got background"); int objctr = 0; if(prev_x > 0 && prev_y > 0){ @@ -273,25 +272,32 @@ void process_file(Image *I){ uint8_t *ibin = Im2bin(I, I->background); DELTA("Made binary"); if(ibin){ - Image *Itmp = bin2Im(ibin, I->width, I->height); + if(theconf.writedebugimgs){ + Image *Itmp = bin2Im(ibin, I->width, I->height); Image_write_jpg(Itmp, "binary.jpg", 1); Image_free(&Itmp); DELTA("save binary"); + } uint8_t *er = il_erosionN(ibin, W, H, theconf.Nerosions); FREE(ibin); DELTA("Erosion"); - Itmp = bin2Im(er, I->width, I->height); + if(theconf.writedebugimgs){ + Image *Itmp = bin2Im(er, I->width, I->height); Image_write_jpg(Itmp, "erosion.jpg", 1); Image_free(&Itmp); DELTA("Save erosion"); + } uint8_t *opn = il_dilationN(er, W, H, theconf.Ndilations); FREE(er); DELTA("Opening"); - Itmp = bin2Im(opn, I->width, I->height); + if(theconf.writedebugimgs){ + Image *Itmp = bin2Im(opn, I->width, I->height); Image_write_jpg(Itmp, "opening.jpg", 1); Image_free(&Itmp); DELTA("Save opening"); - S = il_cclabel4(opn, W, H, &cc); + } + il_ConnComps *cc = NULL; + size_t *S = il_cclabel4(opn, W, H, &cc); FREE(opn); if(S && cc) DBG("Nobj=%zd", cc->Nobj-1); if(S && cc && cc->Nobj > 1){ // Nobj = amount of objects + 1 @@ -329,68 +335,68 @@ void process_file(Image *I){ else qsort(Objects, objctr, sizeof(object), compDist); } -SKIP_FULL_PROCESS: - DBGLOG("T%.2f, N=%d\n", sl_dtime(), objctr); - DELTA("Calculate deviations"); - if(objctr){ -#ifdef EBUG - object *o = Objects; - green("%6s\t%6s\t%6s\t%6s\t%6s\t%6s\t%6s\t%6s\t%8s\n", - "N", "Area", "Mv", "W/H", "Xc", "Yc", "Sx", "Sy", "Area/r^2"); - for(int i = 0; i < objctr; ++i, ++o){ - // 1.0857 = 2.5/ln(10) - printf("%6d\t%6d\t%6.1f\t%6.1f\t%6.1f\t%6.1f\t%6.1f\t%6.1f\t%8.1f\n", - i, o->area, 20.-1.0857*log(o->Isum), o->WdivH, o->xc, o->yc, - o->xsigma, o->ysigma, o->area/o->xsigma/o->ysigma); - } -#endif - getDeviation(Objects); // calculate dX/dY and process corrections - } - DELTA("prepare image"); - { // prepare image and save jpeg - uint8_t *outp = NULL; - if(theconf.equalize) - outp = equalize(I, 3, theconf.throwpart); - else - outp = linear(I, 3); - static il_Pattern *cross = NULL, *crossL = NULL; - if(!cross) cross = il_Pattern_xcross(33, 33); - if(!crossL) crossL = il_Pattern_xcross(51, 51); - il_Img3 i3 = {.data = outp, .w = I->width, .h = H}; - DELTA("Draw crosses"); - // draw fiber center position - il_Pattern_draw3(&i3, crossL, theconf.xtarget-theconf.xoff, H-(theconf.ytarget-theconf.yoff), C_R); - if(objctr){ // draw crosses @ objects' centers - int H = I->height; - // draw current star centroid - il_Pattern_draw3(&i3, cross, Objects[0].xc, H-Objects[0].yc, C_G); - // add offset to show in target system - xc = Objects[0].xc + theconf.xoff; - yc = Objects[0].yc + theconf.yoff; - // draw other centroids - for(int i = 1; i < objctr; ++i) - il_Pattern_draw3(&i3, cross, Objects[i].xc, H-Objects[i].yc, C_B); - }else{xc = -1.; yc = -1.;} - char tmpnm[FILENAME_MAX+5]; - sprintf(tmpnm, "%s-tmp", GP->outputjpg); - if(stbi_write_jpg(tmpnm, I->width, I->height, 3, outp, 95)){ - if(rename(tmpnm, GP->outputjpg)){ - WARN("rename()"); - LOGWARN("can't save %s", GP->outputjpg); - } - } - DELTA("Written"); - FREE(outp); - } - }else{ - xc = -1.; yc = -1.; - Image_write_jpg(I, GP->outputjpg, theconf.equalize); } - DBGLOG("Image saved"); FREE(S); FREE(cc); } - }else Image_write_jpg(I, GP->outputjpg, theconf.equalize); +SKIP_FULL_PROCESS: + DBGLOG("T%.2f, N=%d\n", sl_dtime(), objctr); + DELTA("Calculate deviations"); + if(objctr){ +#ifdef EBUG + object *o = Objects; + green("%6s\t%6s\t%6s\t%6s\t%6s\t%6s\t%6s\t%6s\t%8s\n", + "N", "Area", "Mv", "W/H", "Xc", "Yc", "Sx", "Sy", "Area/r^2"); + for(int i = 0; i < objctr; ++i, ++o){ + // 1.0857 = 2.5/ln(10) + printf("%6d\t%6d\t%6.1f\t%6.1f\t%6.1f\t%6.1f\t%6.1f\t%6.1f\t%8.1f\n", + i, o->area, 20.-1.0857*log(o->Isum), o->WdivH, o->xc, o->yc, + o->xsigma, o->ysigma, o->area/o->xsigma/o->ysigma); + } +#endif + getDeviation(Objects); // calculate dX/dY and process corrections + } + DELTA("prepare image"); + { // prepare image and save jpeg + uint8_t *outp = NULL; + if(theconf.equalize) + outp = equalize(I, 3, theconf.throwpart); + else + outp = linear(I, 3); + static il_Pattern *cross = NULL, *crossL = NULL; + if(!cross) cross = il_Pattern_xcross(33, 33); + if(!crossL) crossL = il_Pattern_xcross(51, 51); + il_Img3 i3 = {.data = outp, .w = I->width, .h = H}; + DELTA("Draw crosses"); + // draw fiber center position + il_Pattern_draw3(&i3, crossL, theconf.xtarget-theconf.xoff, H-(theconf.ytarget-theconf.yoff), C_R); + if(objctr){ // draw crosses @ objects' centers + int H = I->height; + // draw current star centroid + il_Pattern_draw3(&i3, cross, Objects[0].xc, H-Objects[0].yc, C_G); + // add offset to show in target system + xc = Objects[0].xc + theconf.xoff; + yc = Objects[0].yc + theconf.yoff; + // draw other centroids + for(int i = 1; i < objctr; ++i) + il_Pattern_draw3(&i3, cross, Objects[i].xc, H-Objects[i].yc, C_B); + }else{xc = -1.; yc = -1.;} + char tmpnm[FILENAME_MAX+5]; + sprintf(tmpnm, "%s-tmp", GP->outputjpg); + if(stbi_write_jpg(tmpnm, I->width, I->height, 3, outp, 95)){ + if(rename(tmpnm, GP->outputjpg)){ + WARN("rename()"); + LOGWARN("can't save %s", GP->outputjpg); + } + } + DELTA("Written"); + FREE(outp); + } + }else{ + xc = -1.; yc = -1.; + Image_write_jpg(I, GP->outputjpg, theconf.equalize); + } + DBGLOG("Image saved"); ++ImNumber; if(lastTproc > 1.) FPS = 1. / (sl_dtime() - lastTproc); lastTproc = sl_dtime(); diff --git a/LocCorr_new/socket.c b/LocCorr_new/socket.c index 20f29d6..fe923da 100644 --- a/LocCorr_new/socket.c +++ b/LocCorr_new/socket.c @@ -67,6 +67,7 @@ typedef struct{ static char *helpmsg(const char *messageid, char *buf, int buflen); static char *stepperstatus(const char *messageid, char *buf, int buflen); static char *getimagedata(const char *messageid, char *buf, int buflen); +// should be in sorted order static getter getterHandlers[] = { {"help", helpmsg, "List avaiable commands"}, {"imdata", getimagedata, "Get image data (status, path, FPS, counter)"}, @@ -80,7 +81,7 @@ static char *setfocusstate(const char *state, char *buf, int buflen); static char *moveU(const char *val, char *buf, int buflen); static char *moveV(const char *val, char *buf, int buflen); static char *addcmnt(const char *cmnt, char *buf, int buflen); - +// should be in sorted order static setter setterHandlers[] = { {"comment", addcmnt, "Add comment to XY log file"}, {"focus", setfocusstate, "Move focus to given value"},