static __inline__ void build_area_table(const BBOX_TREE *bbox_tree, Uint32 a, Uint32 b, float *areas) { VECTOR3 bmin, bmax, len; int i, j; VFill(bmin, BOUND_HUGE); VFill(bmax, -BOUND_HUGE); if (a < b) { for (i = a, j = 0; i <= b; i++, j++) { VMin(bmin, bmin, bbox_tree->items[i].bbox.bbmin); VMax(bmax, bmax, bbox_tree->items[i].bbox.bbmax); VSub(len, bmax, bmin); areas[j] = len[X] * len[Y] * len[Z]; } } else { for (i = a, j = a-b; i >= (int)b; i--, j--) { VMin(bmin, bmin, bbox_tree->items[i].bbox.bbmin); VMax(bmax, bmax, bbox_tree->items[i].bbox.bbmax); VSub(len, bmax, bmin); areas[j] = len[X] * len[Y] * len[Z]; } } }
static __inline__ void add_dynamic_item_to_node(BBOX_TREE *bbox_tree, Uint32 node, const AABBOX bbox, Uint32 ID, Uint32 type, Uint32 texture_id, Uint32 extra) { Uint32 index, size; if (node != NO_INDEX) { index = bbox_tree->nodes[node].dynamic_objects.index; size = bbox_tree->nodes[node].dynamic_objects.size; if (size <= index) { if (size < 4) size = 4; size *= 2; bbox_tree->nodes[node].dynamic_objects.items = (BBOX_ITEM*)realloc(bbox_tree->nodes[node].dynamic_objects.items, size*sizeof(BBOX_ITEM)); bbox_tree->nodes[node].dynamic_objects.size = size; } bbox_tree->nodes[node].dynamic_objects.items[index].ID = ID; bbox_tree->nodes[node].dynamic_objects.items[index].extra = extra; bbox_tree->nodes[node].dynamic_objects.items[index].texture_id = texture_id; bbox_tree->nodes[node].dynamic_objects.items[index].type = type; #ifdef CLUSTER_INSIDES bbox_tree->nodes[node].dynamic_objects.items[index].cluster = current_cluster; #endif // CLUSTER_INSIDES VAssign(bbox_tree->nodes[node].dynamic_objects.items[index].bbox.bbmin, bbox.bbmin); VAssign(bbox_tree->nodes[node].dynamic_objects.items[index].bbox.bbmax, bbox.bbmax); bbox_tree->nodes[node].dynamic_objects.index = index + 1; VMin(bbox_tree->nodes[node].bbox.bbmin, bbox_tree->nodes[node].bbox.bbmin, bbox.bbmin); VMax(bbox_tree->nodes[node].bbox.bbmax, bbox_tree->nodes[node].bbox.bbmax, bbox.bbmax); } }
static __inline__ void calc_bbox_sub_nodes(BBOX_TREE* bbox_tree, Uint32 sub_node, Uint32 in_mask, AABBOX* bbox) { Uint32 out_mask, result, idx; if (sub_node != NO_INDEX) { idx = bbox_tree->cur_intersect_type; result = check_aabb_in_frustum(bbox_tree->nodes[sub_node].bbox, bbox_tree->intersect[idx].frustum, in_mask, &out_mask); if (result == INSIDE) { VMin(bbox->bbmin, bbox->bbmin, bbox_tree->nodes[sub_node].bbox.bbmin); VMax(bbox->bbmax, bbox->bbmax, bbox_tree->nodes[sub_node].bbox.bbmax); } else { if (result == INTERSECT) { merge_dyn_items(bbox_tree, sub_node, out_mask, bbox); if ( (bbox_tree->nodes[sub_node].nodes[0] == NO_INDEX) && (bbox_tree->nodes[sub_node].nodes[1] == NO_INDEX)) merge_items(bbox_tree, sub_node, out_mask, bbox); else { calc_bbox_sub_nodes(bbox_tree, bbox_tree->nodes[sub_node].nodes[0], out_mask, bbox); calc_bbox_sub_nodes(bbox_tree, bbox_tree->nodes[sub_node].nodes[1], out_mask, bbox); } } } } }
static __inline__ void build_area_table(BBOX_TREE *bbox_tree, Uint32 a, Uint32 b, float *areas) { int i, imin, dir; VECTOR3 bmin, bmax, len; if (a < b) { imin = a; dir = 1; } else { imin = b; dir = -1; } VFill(bmin, BOUND_HUGE); VFill(bmax, -BOUND_HUGE); for (i = a; i != (b + dir); i += dir) { VMin(bmin, bmin, bbox_tree->items[i].bbox.bbmin); VMax(bmax, bmax, bbox_tree->items[i].bbox.bbmax); VSub(len, bmax, bmin); areas[i - imin] = len[X] * len[Y] * len[Z]; } }
static __inline__ void find_axis_and_bbox(const BBOX_TREE *bbox_tree, Uint32 first, Uint32 last, Uint32 *ret, AABBOX *bbox) { Uint32 i, a1, a2, a3; VECTOR3 bmin, bmax; float d, e; VFill(bmin, BOUND_HUGE); VFill(bmax, -BOUND_HUGE); for (i = first; i < last; i++) { VMin(bmin, bmin, bbox_tree->items[i].bbox.bbmin); VMax(bmax, bmax, bbox_tree->items[i].bbox.bbmax); } VAssign(bbox->bbmin, bmin); VAssign(bbox->bbmax, bmax); a1 = 0; a2 = 1; a3 = 2; d = bmax[a1] - bmin[a1]; e = bmax[a2] - bmin[a2]; if (d < e) { i = a2; a2 = a1; a1 = i; } d = bmax[a1] - bmin[a1]; e = bmax[a3] - bmin[a3]; if (d < e) { // i = a2; // a2 = a1; i = a3; a3 = a1; a1 = i; } d = bmax[a2] - bmin[a2]; e = bmax[a3] - bmin[a3]; if (d < e) { i = a3; a3 = a2; a2 = i; } ret[0] = a1; ret[1] = a2; ret[2] = a3; }
void VisuParalx(Video_Win aW,Fonc_Num f,REAL & aV0,REAL & aV1,bool CalcV) { if (CalcV) ELISE_COPY ( aW.all_pts(),Rconv(f),VMin(aV0) | VMax(aV1)); ELISE_COPY ( aW.all_pts(), AUC(round_ni((f-aV0) * (255.0/(aV1-aV0)))), aW.ogray() ); }
static VBoolean MySeek (FILE *f, long bytes) { int len; char buf[1000]; while (bytes > 0) { len = VMin (bytes, sizeof (buf)); if (fread (buf, 1, len, f) != len) return FALSE; bytes -= len; } return TRUE; }
void ShowIm2(Im2D_INT2 aZ,Video_Win aW) { INT zMax,zMin; ELISE_COPY(aZ.all_pts(),aZ.in(),VMax(zMax)|VMin(zMin)); cout << "Z = [" << zMin << " , " << zMax << "]\n"; ELISE_COPY ( aZ.all_pts(), Max(0,Min(255,aZ.in())), // (aZ.in()-zMin) * (255.0/(zMax-zMin)), aW.ogray() ); }
static __inline__ Uint32 delete_dynamic_aabb_from_node(BBOX_TREE *bbox_tree, Uint32 node, Uint32 ID, Uint32 type_mask) { Uint32 i, result, idx1, idx2; AABBOX new_bbox; if (node != NO_INDEX) { result = dynamic_aabb_is_in_node(bbox_tree, node, ID, type_mask); if (result != 0) { if ((bbox_tree->nodes[node].nodes[0] != NO_INDEX) && (bbox_tree->nodes[node].nodes[1] != NO_INDEX)) { idx1 = bbox_tree->nodes[node].nodes[0]; idx2 = bbox_tree->nodes[node].nodes[1]; VMin(new_bbox.bbmin, bbox_tree->nodes[idx1].bbox.bbmin, bbox_tree->nodes[idx2].bbox.bbmin); VMax(new_bbox.bbmax, bbox_tree->nodes[idx1].bbox.bbmax, bbox_tree->nodes[idx2].bbox.bbmax); } else { VAssign(new_bbox.bbmin, bbox_tree->nodes[node].orig_bbox.bbmin); VAssign(new_bbox.bbmax, bbox_tree->nodes[node].orig_bbox.bbmax); } for (i = 0; i < bbox_tree->nodes[node].dynamic_objects.index; i++) { VMin(new_bbox.bbmin, new_bbox.bbmin, bbox_tree->nodes[node].dynamic_objects.items[i].bbox.bbmin); VMax(new_bbox.bbmax, new_bbox.bbmax, bbox_tree->nodes[node].dynamic_objects.items[i].bbox.bbmax); } VAssign(bbox_tree->nodes[node].bbox.bbmin, new_bbox.bbmin); VAssign(bbox_tree->nodes[node].bbox.bbmax, new_bbox.bbmax); return 1; } } return 0; }
bool Triangle::TestInterval(const RayInterval &i) const { //TODO: wrong, backface culling still on //TODO: min/max origin float det = (plane.x < 0.0f? i.minDir.x : i.maxDir.x) * plane.x + (plane.y < 0.0f? i.minDir.y : i.maxDir.y) * plane.y + (plane.z < 0.0f? i.minDir.z : i.maxDir.z) * plane.z; if(det < 0.0f) return 1; enum { sharedOrigin = 1 }; Vec3f c1a, c1b, c2a, c2b; if(sharedOrigin) { Vec3f tvec = i.minOrigin - a; Vec3f c1 = ba ^ tvec, c2 = tvec ^ ca; c1a = i.minDir * c1; c1b = i.maxDir * c1; c2a = i.minDir * c2; c2b = i.maxDir * c2; } else { Vec3f tvec1 = i.minOrigin - a, tvec2 = i.maxOrigin - a; { float xa1 = ba.y * tvec1.z, xb1 = ba.z * tvec1.y; float xa2 = ba.y * tvec2.z, xb2 = ba.z * tvec2.y; float ya1 = ba.z * tvec1.x, yb1 = ba.x * tvec1.z; float ya2 = ba.z * tvec2.x, yb2 = ba.x * tvec2.z; float za1 = ba.x * tvec1.y, zb1 = ba.y * tvec1.x; float za2 = ba.x * tvec2.y, zb2 = ba.y * tvec2.x; c1a.x = Min(xa1, xa2) - Max(xb1, xb2); c1b.x = Max(xa1, xa2) - Min(xb1, xb2); c1a.y = Min(ya1, ya2) - Max(yb1, yb2); c1b.y = Max(ya1, ya2) - Min(yb1, yb2); c1a.z = Min(za1, za2) - Max(zb1, zb2); c1b.z = Max(za1, za2) - Min(zb1, zb2); } { float xa1 = tvec1.y * ca.z, xb1 = tvec1.z * ca.y; float xa2 = tvec2.y * ca.z, xb2 = tvec2.z * ca.y; float ya1 = tvec1.z * ca.x, yb1 = tvec1.x * ca.z; float ya2 = tvec2.z * ca.x, yb2 = tvec2.x * ca.z; float za1 = tvec1.x * ca.y, zb1 = tvec1.y * ca.x; float za2 = tvec2.x * ca.y, zb2 = tvec2.y * ca.x; c2a.x = Min(xa1, xa2) - Max(xb1, xb2); c2b.x = Max(xa1, xa2) - Min(xb1, xb2); c2a.y = Min(ya1, ya2) - Max(yb1, yb2); c2b.y = Max(ya1, ya2) - Min(yb1, yb2); c2a.z = Min(za1, za2) - Max(zb1, zb2); c2b.z = Max(za1, za2) - Min(zb1, zb2); } Vec3f t1, t2, t3, t4; t1 = i.minDir * c1a; t2 = i.maxDir * c1b; t3 = i.maxDir * c1a; t4 = i.minDir * c1b; c1a = VMin(VMin(t1, t2), VMin(t3, t4)); c1b = VMax(VMax(t1, t2), VMax(t3, t4)); t1 = i.minDir * c2a; t2 = i.maxDir * c2b; t3 = i.maxDir * c2a; t4 = i.minDir * c2b; c2a = VMin(VMin(t1, t2), VMin(t3, t4)); c2b = VMax(VMax(t1, t2), VMax(t3, t4)); } float u[2] = { Min(c1a.x, c1b.x) + Min(c1a.y, c1b.y) + Min(c1a.z, c1b.z), Max(c1a.x, c1b.x) + Max(c1a.y, c1b.y) + Max(c1a.z, c1b.z) }; float v[2] = { Min(c2a.x, c2b.x) + Min(c2a.y, c2b.y) + Min(c2a.z, c2b.z), Max(c2a.x, c2b.x) + Max(c2a.y, c2b.y) + Max(c2a.z, c2b.z) }; return Min(u[1], v[1]) >= 0.0f && u[0] + v[0] <= det * t0; }
void ObjectInstance::ComputeBBox() { BBox b = tree->GetBBox(); floatq x0(b.min.x); floatq x1(b.max.x); floatq y(b.min.y, b.min.y, b.max.y, b.max.y); floatq z(b.min.z, b.max.z, b.min.z, b.max.z); Vec3q p0( y * rotation[0].y + z * rotation[0].z, y * rotation[1].y + z * rotation[1].z, y * rotation[2].y + z * rotation[2].z); Vec3q p1( x1 * rotation[0].x + p0.x, x1 * rotation[1].x + p0.y, x1 * rotation[2].x + p0.z); p0.x += x0 * rotation[0].x; p0.y += x0 * rotation[1].x; p0.z += x0 * rotation[2].x; bbox = BBox(Minimize(VMin(p0, p1)) + translation, Maximize(VMax(p0, p1)) + translation); }
static __inline__ Uint32 check_aabb_aabb(const AABBOX bbox, const AABBOX dyn_bbox, float grow) { AABBOX new_bbox; VECTOR3 len; float old_v, new_v; VMin(new_bbox.bbmin, bbox.bbmin, dyn_bbox.bbmin); VMax(new_bbox.bbmax, bbox.bbmax, dyn_bbox.bbmax); VSub(len, bbox.bbmax, bbox.bbmin); old_v = len[X] * len[Y] * len[Z]; VSub(len, new_bbox.bbmax, new_bbox.bbmin); new_v = len[X] * len[Y] * len[Z]; if ((new_v / old_v) > grow) return 0; else return 1; }
static __inline__ void calc_bbox(AABBOX *bbox, BBOX_TREE *bbox_tree, Uint32 first, Uint32 last) { int i; VECTOR3 bmin, bmax; VFill(bmin, BOUND_HUGE); VFill(bmax, -BOUND_HUGE); for (i = first; i < last; i++) { VMin(bmin, bmin, bbox_tree->items[i].bbox.bbmin); VMax(bmax, bmax, bbox_tree->items[i].bbox.bbmax); } VAssign(bbox->bbmin, bmin); VAssign(bbox->bbmax, bmax); }
static __inline__ void merge_dyn_items(BBOX_TREE* bbox_tree, Uint32 sub_node, Uint32 in_mask, AABBOX* bbox) { Uint32 idx, size, i; idx = bbox_tree->cur_intersect_type; size = bbox_tree->nodes[sub_node].dynamic_objects.index; for (i = 0; i < size; i++) { if (check_aabb_outside_frustum(bbox_tree->nodes[sub_node].dynamic_objects.items[i].bbox, bbox_tree->intersect[idx].frustum, in_mask) != OUTSIDE) { VMin(bbox->bbmin, bbox->bbmin, bbox_tree->nodes[sub_node].dynamic_objects.items[i].bbox.bbmin); VMax(bbox->bbmax, bbox->bbmax, bbox_tree->nodes[sub_node].dynamic_objects.items[i].bbox.bbmax); } } }
void DebugDrag() { std::string aDir = "/media/data1/Jeux-Tests/Dragon-2/MEC2Im-Epi_Im1_Right_IMGP7511_IMGP7512.tif-Epi_Im2_Left_IMGP7511_IMGP7512.tif/"; std::string aNamePx = "Px1_Num6_DeZoom2_LeChantier.tif"; std::string aNameMasq = "AutoMask_LeChantier_Num_5.tif"; Tiff_Im aTP = Tiff_Im::StdConv(aDir+aNamePx); Tiff_Im aTM = Tiff_Im::StdConv(aDir+aNameMasq); double aMinPx; ELISE_COPY ( aTP.all_pts(), aTP.in() * aTM.in(), VMin(aMinPx) ); std::cout << "MIN PX " << aMinPx << "\n"; }
void FillStat(cXml_StatVino & aStat,Flux_Pts aFlux,Fonc_Num aFonc) { aFonc = Rconv(aFonc); int aNbCh = aFonc.dimf_out(); aStat.Soms().resize(aNbCh,0.0); aStat.Soms2().resize(aNbCh,0.0); aStat.ECT().resize(aNbCh,0.0); aStat.VMax().resize(aNbCh,0.0); aStat.VMin().resize(aNbCh,0.0); Symb_FNum aSF(aFonc); ELISE_COPY ( aFlux, Virgule(1.0,aSF,Square(aSF)), Virgule ( sigma(aStat.Nb()), sigma(VData(aStat.Soms()),aNbCh) | VMin(VData(aStat.VMin()),aNbCh) | VMax(VData(aStat.VMax()),aNbCh), sigma(VData(aStat.Soms2()),aNbCh) ) ); double aNb = aStat.Nb(); aStat.IntervDyn() = Pt2dr(0,0); for (int aK=0 ; aK<aNbCh ; aK++) { aStat.Soms()[aK] /= aNb; aStat.Soms2()[aK] /= aNb; aStat.ECT()[aK] = sqrt(ElMax(0.0,aStat.Soms2()[aK]-ElSquare(aStat.Soms()[aK]))); aStat.IntervDyn().x += aStat.VMin()[aK]; aStat.IntervDyn().y += aStat.VMax()[aK]; } aStat.IntervDyn() = aStat.IntervDyn() / aNbCh; }
void VisuGray(Video_Win aW,Fonc_Num aFonc) { REAL aMax,aMin; ELISE_COPY(aW.all_pts(),Rconv(aFonc),VMax(aMax)|VMin(aMin)); ELISE_COPY(aW.all_pts(),(aFonc-aMin)*255.0/(aMax-aMin),aW.ogray()); }
void FiltreRemoveBorderHeter(Im2D_REAL4 anIm,Im2D_U_INT1 aImMasq,double aCostRegul,double aCostTrans) { Pt2di aSz = anIm.sz(); double aVMax,aVMin; ELISE_COPY(aImMasq.border(1),0,aImMasq.out()); ELISE_COPY(aImMasq.all_pts(),aImMasq.in()!=0,aImMasq.out()); ELISE_COPY(anIm.all_pts(),anIm.in(),VMax(aVMax)|VMin(aVMin)); Video_Win * aW = Video_Win::PtrWStd(aSz); ELISE_COPY(anIm.all_pts(),(anIm.in()-aVMin) * (255.0/(aVMax-aVMin)),aW->ogray()); std::cout << "VMAX " << aVMax << "\n"; //ELISE_COPY(aW->all_pts(),aImMasq.in(),aW->odisc()); //aW->clik_in(); ELISE_COPY ( aW->all_pts(), nflag_close_sym(flag_front8(aImMasq.in_proj()!=0)), aW->out_graph(Line_St(aW->pdisc()(P8COL::red))) ); cParamFiltreDepthByPrgDyn aParam = StdGetFromSI(Basic_XML_MM_File("DefFiltrPrgDyn.xml"),ParamFiltreDepthByPrgDyn); aParam.CostTrans() = aCostTrans; aParam.CostRegul() = aCostRegul; Im2D_Bits<1> aNewMasq = FiltrageDepthByProgDyn(anIm,aImMasq,aParam); ELISE_COPY ( select(aNewMasq.all_pts(),aNewMasq.in()), 2, aImMasq.out() ); TIm2D<U_INT1,INT> aTMasq(aImMasq); FiltrageCardCC(false,aTMasq,2,0,100); Neighbourhood aNV4=Neighbourhood::v4(); Neigh_Rel aNrV4 (aNV4); ELISE_COPY ( conc ( select(select(aImMasq.all_pts(),aImMasq.in()==1),aNrV4.red_sum(aImMasq.in()==0)), aImMasq.neigh_test_and_set(aNV4,1,0,256) ), 3, Output::onul() ); ELISE_COPY ( aNewMasq.all_pts(), aImMasq.in(), aW->odisc() ); /* ELISE_COPY ( aW->all_pts(), nflag_close_sym(flag_front8(aNewMasq.in_proj())), aW->out_graph(Line_St(aW->pdisc()(P8COL::green))) ); */ aW->clik_in(); }
int GrShade_main(int argc,char ** argv) { std::string aNameIn; std::string aNameOut; std::string aNameCol=""; Pt2di aP0Glob(0,0),aSzGlob(0,0); INT aNbDir = 20; REAL aFZ = 1.0; REAL aPdsAnis = 0.95; INT aBrd = -1; std::string aTMNt = "real4"; std::string aTShade = "real4"; INT aDequant =0; INT aVisu = 0; REAL aHypsoDyn = -1.0; REAL aHypsoSat = 0.5; Pt2di aSzMaxDalles (3000,3000); INT aSzRecDalles = 300; std::string aModeOmbre="CielVu"; std::string modeOmbre[] = {aModeOmbre,"IgnE","Local","Med","Mixte"}; std::list<std::string> lModeOmbre(modeOmbre, modeOmbre + sizeof(modeOmbre) / sizeof(std::string) ); std::string aFileMasq=""; double aDericheFact=2.0; int aNbIterF = 4; double aFactExp = 0.95; double aDyn = 1.0; int aNbMed = 100; int aNbIterMed = 1; Tiff_Im::SetDefTileFile(1<<15); std::vector<double> aVPdsFiltre; std::string aModeColor = "IntensShade"; std::string modeColor[] = {aModeColor,"BackRGB","GrayBackRGB"}; std::list<std::string> lModeColor(modeColor, modeColor + sizeof(modeColor) / sizeof(std::string) ); double aTetaH = 25.0; double anAzimut = 0.0; double aDynMed = 1.0; ElInitArgMain ( argc,argv, LArgMain() << EAMC(aNameIn, "File name", eSAM_IsExistFile) , LArgMain() << EAM(aNameOut,"Out",true) << EAM(aNameCol,"FileCol",true, "Color file", eSAM_IsExistFile) << EAM(aVisu,"Visu",true) << EAM(aP0Glob,"P0",true) << EAM(aSzGlob,"Sz",true) << EAM(aFZ,"FZ",true) << EAM(aDynMed,"DynMed",true) << EAM(aPdsAnis,"Anisotropie",true) << EAM(aNbDir,"NbDir",true) << EAM(aBrd,"Brd",true) << EAM(aTMNt,"TypeMnt",true, "Type", eSAM_None, ListOfVal(GenIm::bits1_msbf, "")) << EAM(aTShade,"TypeShade",true, "Type", eSAM_None, ListOfVal(GenIm::bits1_msbf, "")) << EAM(aDequant,"Dequant",true) << EAM(aHypsoDyn,"HypsoDyn",true) << EAM(aHypsoSat,"HypsoSat",true) << EAM(aSzMaxDalles,"SzMaxDalles",true) << EAM(aSzRecDalles,"SzRecDalles",true) << EAM(aModeOmbre,"ModeOmbre",true,"in {CielVu,IgnE,Local,Med,Mixte}",eSAM_None,lModeOmbre) << EAM(aFileMasq,"Mask",true, "Mask file", eSAM_IsExistFile) << EAM(aDericheFact,"DericheFact",true) << EAM(aNbIterF,"NbIterF",true) << EAM(aFactExp,"FactExp",true) << EAM(aDyn,"Dyn",true) << EAM(aVPdsFiltre,"PdsF",true,"[CielVu,Local,Grad,Med]", eSAM_NoInit) << EAM(aModeColor,"ModeColor",true,"Color mode", eSAM_None, lModeColor) << EAM(aNbMed,"NbMed",true) << EAM(aNbIterMed,"NbIterMed",true) << EAM(aTetaH,"TetaH",true) << EAM(anAzimut,"Azimut",true) ); if (!MMVisualMode) { double aPdsDef = aVPdsFiltre.size() ? 0 : 1; for (int aK=aVPdsFiltre.size() ; aK<4 ; aK++) aVPdsFiltre.push_back(aPdsDef); double aSPdsF = 0; for (int aK=0 ; aK<4 ; aK++) aSPdsF += aVPdsFiltre[aK]; for (int aK=0 ; aK<4 ; aK++) aVPdsFiltre[aK] /= aSPdsF; std::string aDir,aNameFileIn; SplitDirAndFile(aDir,aNameFileIn,aNameIn); bool WithHypso = (aHypsoDyn>0) || (aNameCol != ""); // bool WithCol = (aNameCol != ""); if (aNameOut=="") aNameOut = StdPrefix(aNameIn) +std::string("Shade.tif"); Tiff_Im aFileIn = Tiff_Im::StdConvGen(aNameIn,1,true,false); if (aSzGlob== Pt2di(0,0)) aSzGlob = aFileIn.sz() -aP0Glob; Fonc_Num aFIn = aFileIn.in_gen(Tiff_Im::eModeCoulGray,Tiff_Im::eModeNoProl); { Tiff_Im ( aNameOut.c_str(), aSzGlob, GenIm::u_int1, Tiff_Im::No_Compr, WithHypso ? Tiff_Im::RGB : Tiff_Im::BlackIsZero ); } Tiff_Im aTifOut(aNameOut.c_str()); if (aSzMaxDalles.x<0) aSzMaxDalles = aSzGlob; Pt2di aPRD(aSzRecDalles,aSzRecDalles); cDecoupageInterv2D aDecoup ( Box2di(aP0Glob,aP0Glob+aSzGlob), aSzMaxDalles, Box2di(-aPRD,aPRD) ); Im2DGen aMnt = AllocImGen(aDecoup.SzMaxIn(),aTMNt); Im2DGen aShade = AllocImGen(aDecoup.SzMaxIn(),aTShade); cout << "SZ Max In " << aDecoup.SzMaxIn() << endl; REAL aRatio = ElMin(800.0/aSzGlob.x,700.0/aSzGlob.y); Video_Win * pW = aVisu ? Video_Win::PtrWStd(Pt2di(Pt2dr(aSzGlob)*aRatio)) : 0 ; aTetaH *= (2*PI)/360.0; anAzimut *= (2*PI)/360.0; for (int aKDec=0; aKDec<aDecoup.NbInterv() ; aKDec++) { Box2di aBoxIn = aDecoup.KthIntervIn(aKDec); Pt2di aSzIn = aBoxIn.sz(); Pt2di aP0In = aBoxIn.P0(); cout << "DEQ " << aDequant << "Sz In " << aSzIn <<endl; REAL aVMin; if (aDequant) { ElImplemDequantifier aDeq(aSzIn); aDeq.SetTraitSpecialCuv(true); aDeq.DoDequantif(aSzIn, trans(aFIn,aP0In),true); REAL aVMax; ELISE_COPY ( rectangle(Pt2di(0,0),aSzIn), aDeq.ImDeqReelle() * aFZ, aMnt.out() | VMax(aVMax) |VMin(aVMin) ); } else { ELISE_COPY ( rectangle(Pt2di(0,0),aSzIn), trans(aFIn,aP0In)*aFZ, aMnt.out()|VMin(aVMin) ); } Im2D_Bits<1> aIMasq(aSzIn.x,aSzIn.y,1); if (aFileMasq!="") { if (ELISE_fp::exist_file(aDir+aFileMasq)) aFileMasq = aDir+aFileMasq; double aDif=100; Tiff_Im aFM = Tiff_Im::StdConvGen(aFileMasq,1,true,false); ELISE_COPY ( select(rectangle(Pt2di(0,0),aSzIn),trans(!aFM.in_proj(),aP0In)), aVMin-aDif, aMnt.out() | (aIMasq.out() << 0) ); aVMin-= aDif; } if (aBrd>0) { cout << "VMin = " << aVMin <<endl; ELISE_COPY(aMnt.border(aBrd),aVMin-1000,aMnt.out()); } // Im2D_REAL4 aShade(aSzGlob.x,aSzGlob.y); ELISE_COPY(aShade.all_pts(),0,aShade.out()); if (pW) pW = pW->PtrChc(Pt2dr(aP0Glob-aP0In),Pt2dr(aRatio,aRatio)); REAL SPds = 0; REAL aSTot = 0; REAL Dyn = 1.0; if (aTShade != "u_int1") Dyn = 100; bool Done = false; if ( (aModeOmbre=="CielVu") || ((aModeOmbre=="Mixte") && (aVPdsFiltre[0] > 0.0)) ) { std::cout << "BEGIN CIEL" << endl; Done = true; for (int aK=0 ; aK< 2 ; aK++) { SPds = 0; for (int i=0; i<aNbDir; i++) { REAL Teta = (2*PI*i) / aNbDir ; Pt2dr U(cos(Teta),sin(Teta)); Pt2di aDir = Pt2di(U * (aNbDir * 4)); REAL Pds = (1-aPdsAnis) + aPdsAnis *ElSquare(1.0 - euclid(U,Pt2dr(0,1))/2); if (aK==1) Pds = (Pds*Dyn) / (2*aSTot); Symb_FNum Gr = (1-cos(PI/2-atan(gray_level_shading(aMnt.in())))) *255.0; cout << "Dir " << i << " Sur " << aNbDir << " P= " << Pds << endl; SPds += Pds; if (aK==1) { ELISE_COPY ( line_map_rect(aDir,Pt2di(0,0),aSzIn), Min(255*Dyn,aShade.in()+Pds*Gr), aShade.out() // | (pW ? (pW->ogray()<<(aShade.in()/SPds)) : Output::onul()) | (pW ? (pW->ogray()<<(Gr)) : Output::onul()) ); } } aSTot = SPds; } double aMul = (aModeOmbre=="Mixte") ? aVPdsFiltre[0] : 1.0; ELISE_COPY(aShade.all_pts(),aShade.in()*(aMul/SPds),aShade.out()); SPds = aMul; std::cout << "BEGIN CIEL" << endl; } if ( (aModeOmbre=="Local") || ((aModeOmbre=="Mixte") && (aVPdsFiltre[1] > 0.0)) ) { std::cout << "BEGIN LOCAL" << endl; Done = true; Fonc_Num aFonc = aMnt.in_proj(); Fonc_Num aMoy = aFonc; for (int aK=0 ; aK<aNbIterF; aK++) aMoy = canny_exp_filt(aMoy*aIMasq.in_proj(),aFactExp,aFactExp) / Max(0.1,canny_exp_filt(aIMasq.in_proj(),aFactExp,aFactExp)); double aMul = (aModeOmbre=="Mixte") ? aVPdsFiltre[1] : 1.0; ELISE_COPY ( rectangle(Pt2di(0,0),aSzIn), Max(0,Min(255, aShade.in() +(128+(aFonc-aMoy)*aDyn)* aMul)), aShade.out() ); SPds += aMul; std::cout << "END LOCAL" << endl; } if ( (aModeOmbre=="Med") || ((aModeOmbre=="Mixte") && (aVPdsFiltre[3] > 0.0)) ) { std::cout << "BEGIN MED" << endl; Done = true; Fonc_Num aFonc = round_ni(aMnt.in_proj()*aDynMed); int aVMax,aVMin; ELISE_COPY ( rectangle(Pt2di(-1,-1),aSzIn+Pt2di(1,1)), aFonc, VMin(aVMin)|VMax(aVMax) ); Fonc_Num aMoy = aFonc-aVMin; for (int aK=0 ; aK<aNbIterMed; aK++) aMoy = rect_median(aMoy,aNbMed,aVMax-aVMin+1); aMoy = aMoy + aVMin; double aMul = (aModeOmbre=="Mixte") ? aVPdsFiltre[3] : 1.0; ELISE_COPY ( rectangle(Pt2di(0,0),aSzIn), Max(0,Min(255, aShade.in() +(128+((aFonc-aMoy)*aDyn)/aDynMed)* aMul)), aShade.out() ); SPds += aMul; std::cout << "END MED" << endl; } if ( (aModeOmbre=="IgnE") || ((aModeOmbre=="Mixte") && (aVPdsFiltre[2] > 0.0)) ) { int aCpt=0; aCpt++; std::cout << "IGN E " << aCpt << " " << aKDec << "\n"; Done = true; if (aCpt>0) { Symb_FNum aGrad = deriche(aMnt.in_proj(),aDericheFact); Symb_FNum aGx = (aGrad.v0()); Symb_FNum aGy = (aGrad.v1()); Symb_FNum aNG = sqrt(1+Square(aGx)+Square(aGy)); Symb_FNum aNx (aGx/aNG); Symb_FNum aNy (aGy/aNG); Symb_FNum aNz (1/aNG); Pt2dr aDirS = Pt2dr::FromPolar(1.0,anAzimut) * Pt2dr(1,0); double aSx = aDirS.x * sin(aTetaH); double aSy = aDirS.y * sin(aTetaH); double aSz = cos(aTetaH); Symb_FNum aScal(aNx*aSx+aNy*aSy+aNz*aSz); std::cout << "AAAAAAAaa" << endl; double aMul = (aModeOmbre=="Mixte") ? aVPdsFiltre[2] : 1.0; ELISE_COPY ( rectangle(Pt2di(0,0),aSzIn), Max(0,aShade.in() + 255*aScal * aMul), aShade.out() ); SPds += aMul; std::cout << "BBBBbbb" << endl; } } if (! Done) { ELISE_ASSERT(false,"Unknown ModeOmbre"); } Fonc_Num aFoncRes = Max(0,Min(255,aShade.in()/SPds)); if (WithHypso) { Fonc_Num aFIntens = aFoncRes; Fonc_Num aFTeinte = trans(aFIn,aP0In)*aHypsoDyn; Fonc_Num aFSat = 255*aHypsoSat; if (aNameCol!="") { Tiff_Im aFileCol = Tiff_Im::StdConvGen(aDir+aNameCol,-1,true,false); Symb_FNum aFNC(trans(rgb_to_its(aFileCol.in()),aP0In)); if (aModeColor == "IntensShade") { aFIntens = aFoncRes; aFTeinte = aFNC.v1(); aFSat = aFNC.v2(); } else if (aModeColor == "BackRGB") { aFIntens = aIMasq.in()*aFoncRes + (1- aIMasq.in()) * aFNC.v0(); aFTeinte = aFNC.v1(); aFSat = aFNC.v2() * (1- aIMasq.in()); } else if (aModeColor == "GrayBackRGB") { aFIntens = aIMasq.in()*aFoncRes + (1- aIMasq.in()) * aFNC.v0(); aFTeinte = aFNC.v1(); aFSat = aFNC.v2()*(1-aIMasq.in()); } else { ELISE_ASSERT(false,"Unknown mode color"); } } aFoncRes = its_to_rgb(Virgule(aFIntens,aFTeinte,aFSat)); //aFoncRes = its_to_rgb(Virgule(aFoncRes,trans(aFIn,aP0In)*aHypsoDyn,255*aHypsoSat)); } /* if (WithCol) { Tiff_Im aFileCol(aNameCol.c_str()); Symb_FNum aFNC(trans(rgb_to_its(aFileCol.in()),aP0In)); aFoncRes = its_to_rgb(Virgule(aFoncRes,aFNC.v1(),aFNC.v2()*aHypsoSat)); // aFoncRes = aFileCol.in(); } */ // Tiff_Im::Create8BFromFonc(aNameOut,aShade.sz(),aShade.in()/SPds); cout << "WithHypso " << WithHypso << " DIM " << aFoncRes.dimf_out() << endl; Box2di aBoxOut = aDecoup.KthIntervOut(aKDec); ELISE_COPY ( rectangle(aBoxOut.P0()-aP0Glob,aBoxOut.P1()-aP0Glob), trans(aFoncRes,aP0Glob-aP0In), aTifOut.out() ); } return EXIT_SUCCESS; } else return EXIT_SUCCESS; }
Im2D_INT2 TestCoxRoy ( INT aSzV, Im2D_U_INT1 imG1, Im2D_U_INT1 imG2, Pt2di aP0, Pt2di aP1, INT aParMin, INT aParMax ) { ElTimer aRoyTimer; TheP0 = aP0; Pt2di aSz = aP1 -aP0; Im2D_INT2 aRes (aSz.x,aSz.y); TheCorr = new EliseCorrel2D ( imG1.in(0), imG2.in(0), imG1.sz(), aSzV, false, -1, true, true ); Im2D_INT2 aIZMin(aSz.x,aSz.y,(INT2)(aParMin)); Im2D_INT2 aIZMax(aSz.x,aSz.y,(INT2)(aParMax)); cInterfaceCoxRoyAlgo * TheCRA = cInterfaceCoxRoyAlgo::NewOne ( aSz.x, aSz.y, aIZMin.data(), aIZMax.data(), false, false ); InitCostCoxRoy(*TheCRA); INT MpdFlow=0; if (false) { cInterfaceCoxAlgo * pSCA = cInterfaceCoxAlgo::StdNewOne ( aSz, 0, aParMax-aParMin, 2, false ); for (INT anX=aP0.x ; anX<aP1.x ; anX++) for (INT anY=aP0.y ; anY<aP1.y ; anY++) for (INT aZ=0 ; aZ<(aParMax-aParMin) ; aZ++) { Pt2di aP(anX,anY); REAL aC = TheCorr->Correl(aP,aP+Pt2di(aZ+aParMin,0)); pSCA->SetCost(Pt3di(anX-aP0.x,anY-aP0.y,aZ),MakeCapa(1-aC)); } MpdFlow = pSCA->PccMaxFlow(); Im2D_INT2 aSol = pSCA->Sol(0); Video_Win aW = Video_Win::WStd(aSol.sz(),1.0); aW.set_title("MPD"); INT aV0,aV1; ELISE_COPY(aSol.all_pts(),aSol.in(),VMin(aV0)|VMax(aV1)); ELISE_COPY(aSol.all_pts(),(aSol.in()-aV0)*(255.0/(aV1-aV0)),aW.ogray()); delete pSCA; } cout << "MPD Flow " << MpdFlow << "\n"; aRoyTimer.reinit(); INT aFl1 = TheCRA->TopMaxFlowStd(aRes.data()); cout << "Roy Time = " << aRoyTimer.uval() << "\n"; ELISE_COPY(aRes.all_pts(),aRes.in(),aRes.out()); { INT aV0,aV1; ELISE_COPY(aRes.all_pts(),aRes.in(),VMin(aV0)|VMax(aV1)); cout << "Cox Roy Interv = " << aV0 << " --- " << aV1 << "\n"; } delete TheCRA; INT ecartPlani = 2; INT ecartAlti = 5; ELISE_COPY ( aIZMin.all_pts(), rect_min(aRes.in(aParMax),ecartPlani) -ecartAlti, aIZMin.out() ); ELISE_COPY ( aIZMax.all_pts(), rect_max(aRes.in(aParMin),ecartPlani) +ecartAlti, aIZMax.out() ); Im2D_INT2 aRes2 (aSz.x,aSz.y); TheCRA = cInterfaceCoxRoyAlgo::NewOne ( aSz.x, aSz.y, aIZMin.data(), aIZMax.data(), false, false ); InitCostCoxRoy(*TheCRA); aRoyTimer.reinit(); INT aFl2 = TheCRA->TopMaxFlowStd(aRes2.data()); cout << "Roy Time 2 = " << aRoyTimer.uval() << "\n"; INT aNbDif; ELISE_COPY ( aRes.all_pts(), aRes.in()!=aRes2.in(), sigma(aNbDif) ); BENCH_ASSERT(aNbDif==0); cout << "FLOWS : " << aFl1 << " " << aFl2 << "\n"; cout << "Nb Dif = " << aNbDif << "\n"; delete TheCorr; return aRes; }
void bench_algo_dist_32(Pt2di sz) { Im2D_U_INT1 I0(sz.x,sz.y); Im2D_U_INT1 Id_plus(sz.x,sz.y); Im2D_U_INT1 Id_moins(sz.x,sz.y); Im2D_INT1 Idneg1(sz.x,sz.y); Im2D_INT1 Idneg2(sz.x,sz.y); ELISE_COPY ( I0.all_pts(), gauss_noise_1(10)>0.5, I0.out() ); ELISE_COPY(I0.border(2),0,I0.out()); ELISE_COPY ( I0.all_pts(), extinc_32(I0.in(0),255), Id_plus.out() ); ELISE_COPY ( I0.all_pts(), extinc_32(! I0.in(0),255), Id_moins.out() ); ELISE_COPY ( select(I0.all_pts(),I0.in()), Min(Id_plus.in()-1,127), Idneg1.out() ); ELISE_COPY ( select(I0.all_pts(),! I0.in()), Max(1-Id_moins.in(),-128), Idneg1.out() ); ELISE_COPY(I0.all_pts(),I0.in(),Idneg2.out()); TIm2D<INT1,INT> TIdneg2(Idneg2); TIdneg2.algo_dist_32_neg(); INT dif; ELISE_COPY ( I0.all_pts(), Abs(Idneg2.in()-Idneg1.in()), VMax(dif) ); BENCH_ASSERT(dif==0); ELISE_COPY ( Idneg1.all_pts(), Iconv((gauss_noise_1(10)-0.5)* 20), Idneg1.out() | Idneg2.out() ); ELISE_COPY(Idneg1.border(2),-100, Idneg1.out() | Idneg2.out()); ELISE_COPY ( Idneg1.all_pts(), 128-EnvKLipshcitz_32(128-Idneg1.in(-100),100), Idneg1.out() ); TIdneg2.algo_dist_env_Klisp32_Sup(); INT Max2 [2]; INT Min2 [2]; ELISE_COPY ( I0.interior(1), Virgule(Idneg1.in(),Idneg2.in()), VMax(Max2,2) | VMin(Min2,2) ); ELISE_COPY ( I0.interior(1), Abs(Idneg2.in()-Idneg1.in()), VMax(dif) ); BENCH_ASSERT(dif==0); }