public BodyEngine AttchBodyEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe, List <Vector2> axis, bool iscurve) { BodyEngine be = gb.AddComponent <BodyEngine>() as BodyEngine; be.CreateBodyEngine(viewer, ge, proj, re, fe, axis, iscurve); return(be); }
public BodyEngine AttchHandleEngineToObject(GameObject gb, GameObject viewer, GraphicsEngine ge, Projector proj, RenderEngine re, FaceEngine fe, BodyEngine be, Image <Gray, byte> img, List <Vector2> axis, bool iscurve) { BodyEngine he = gb.AddComponent <BodyEngine>() as BodyEngine; bool isHandle = true; he.CreateHandleEngine(viewer, ge, proj, re, fe, be, axis, img, iscurve, isHandle); return(he); }
public void FitHandle(BodyEngine handleEngine) { handleEngine.SolveBody(); }
public void ReconstructAllGeometries() { UpdateEngine(); int i_inst = 0; // Fix null detection result if (geometries.Count == 0 && exper_isCubeExper) { SaveInstanceSeg(); } foreach (var geo in geometries) { i_inst++; // Creat GameObject GameObject inst = new GameObject("Instance" + i_inst); inst.transform.parent = this.gameObject.transform; this.m_Inst_list.Add(inst); // Creat FaceEngine FaceEngine faceEngine = AttchFaceEngineToObject(inst, m_projector, m_renderEngine); List <Image <Rgb, byte> > face_imgs = geo.GetFaceImage(); List <Image <Rgb, byte> > handle_imgs = geo.GetHandleImage(); this.m_faceEngine_list.Add(faceEngine); // Creat MeshViwer GameObject meshViewer = GameObject.Instantiate(m_meshViewer); meshViewer.name = m_ImgName + '_' + i_inst; this.m_meshViewer_list.Add(meshViewer); if (geo.label == Label.Cube) { Image <Rgb, byte> body_img = geo.GetBodyImage(true); // skeleton extractor SkeletonExtractor se = new SkeletonExtractor(geo.GetBodyImage(), face_imgs[0], i_inst); bool iscurve = false; List <Vector2> axis = se.ExtractCubeSkeleton(out iscurve); faceEngine.axis = axis; faceEngine.body_img = body_img.Convert <Gray, byte>(); this.FitTopRect(faceEngine, face_imgs[0].Convert <Gray, byte>()); BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve); this.m_bodyEngine_list.Add(bodyEngine); //--------------------------------------------------- //this.FitBody(bodyEngine); //--------------------------------------------------- // Handle List <BodyEngine> m_handleEngine_list = new List <BodyEngine>(); List <GameObject> m_handleViewer_list = new List <GameObject>(); int handle_i_inst = 0; foreach (Image <Rgb, byte> hi in handle_imgs) { GameObject handleViewer = GameObject.Instantiate(m_meshViewer); handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst; m_handleViewer_list.Add(handleViewer); SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst); seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi); bool ishcurve = false; List <Vector2> axis_h = seh.ExtractSkeleton(out ishcurve); BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this, m_projector, m_renderEngine, faceEngine, bodyEngine, hi.Convert <Gray, byte>(), axis_h, ishcurve); m_handleEngine_list.Add(handleEngine); handle_i_inst++; } this.m_handleViewer_lists.Add(m_handleViewer_list); this.m_handleEngine_lists.Add(m_handleEngine_list); } else if (geo.label == Label.Cylinder) { List <List <Vector2> > face_points = geo.Faces(); double minerror = double.MaxValue; int best_face_idx = 0; for (int i = 0; i < face_points.Count; i++) { double error = faceEngine.LikeAEllipse(face_points[i]); if (error < minerror) { minerror = error; best_face_idx = i; } } Image <Rgb, byte> body_img = geo.GetBodyImage(true); //body_img = MaskParser.FillBodyWithHandle(body_img, handle_imgs); // skeleton extractor bool iscurve = false; SkeletonExtractor se = new SkeletonExtractor(geo.GetBodyImage(), face_imgs, best_face_idx, i_inst); List <Vector2> axis = se.ExtractSkeleton(out iscurve); faceEngine.axis = axis; faceEngine.body_img = body_img.Convert <Gray, byte>(); this.FitTopCircle(faceEngine, face_imgs[best_face_idx].Convert <Gray, byte>()); BodyEngine bodyEngine = AttchBodyEngineToObject(inst, meshViewer, this, m_projector, m_renderEngine, faceEngine, axis, iscurve); this.m_bodyEngine_list.Add(bodyEngine); //--------------------------------------------------- //this.FitBody(bodyEngine); //--------------------------------------------------- // Handle List <BodyEngine> m_handleEngine_list = new List <BodyEngine>(); List <GameObject> m_handleViewer_list = new List <GameObject>(); int handle_i_inst = 0; foreach (Image <Rgb, byte> hi in handle_imgs) { GameObject handleViewer = GameObject.Instantiate(m_meshViewer); handleViewer.name = m_ImgName + '_' + i_inst + "_handle" + handle_i_inst; m_handleViewer_list.Add(handleViewer); SkeletonExtractor seh = new SkeletonExtractor(handle_i_inst); seh.SkeletonExtractorHandle(geo.GetBodyImage(), hi); bool ishcurve = false; List <Vector2> axis_h = seh.ExtractSkeleton(out ishcurve); BodyEngine handleEngine = AttchHandleEngineToObject(inst, handleViewer, this, m_projector, m_renderEngine, faceEngine, bodyEngine, hi.Convert <Gray, byte>(), axis_h, ishcurve); m_handleEngine_list.Add(handleEngine); handle_i_inst++; } this.m_handleViewer_lists.Add(m_handleViewer_list); this.m_handleEngine_lists.Add(m_handleEngine_list); } } //// if(m_bodyEngine_list.Count>1) // { // FaceEngineMulti m_FEM = new FaceEngineMulti(this, m_projector, m_renderEngine, m_faceEngine_list); // m_FEM.Optimize_allRects(); // } foreach (var be in m_bodyEngine_list) { this.FitBody(be); } }
public void FitBody(BodyEngine bodyEngine) { bodyEngine.SolveBody(); }