public void find_circle(Mat img_mat, double threadhold) { Cv2.Blur(img_mat, img_mat, new Size(5, 5)); CircleSegment[] circle_seg = new CircleSegment[100]; circle_seg = Cv2.HoughCircles(img_mat, HoughMethods.Gradient, 1, 100, 200, 40, 20); for (int i = 0; i < circle_seg.Length; i++) { bool bfound = false; foreach (Polygon_T s in polygon_array) { if (circle_seg[i].Center.X > 0 && circle_seg[i].Center.Y > 0) { double dist = Math.Sqrt((circle_seg[i].Center.X - s.center_pos.X) * (circle_seg[i].Center.X - s.center_pos.X) + (circle_seg[i].Center.Y - s.center_pos.Y) * (circle_seg[i].Center.Y - s.center_pos.Y)); if (dist < threadhold) { bfound = true; } } } if (bfound == false) { Polygon_T p = new Polygon_T(); p.center_pos = circle_seg[i].Center; p.gt = GraphicType.GT_Sphere; polygon_array.Add(p); Cv2.Circle(img_mat, circle_seg[i].Center, 5, Scalar.Red, 2); Cv2.Circle(img_mat, (int)circle_seg[i].Center.X, (int)circle_seg[i].Center.Y, (int)circle_seg[i].Radius, Scalar.Red, 2); } } }
public void find_polygon(int polygon_type, double threadhold, Point[][] contours, Mat result_mat) { int idx, i; Point[] poly = new Point[100]; Point center_pos = new Point(); center_pos.X = 0; center_pos.Y = 0; for (idx = 0; idx < contours.Length; idx++) { poly = Cv2.ApproxPolyDP(contours[idx], 10, true); if (polygon_type == 10000) { int left = 10000, right = -10000, top = 10000, bottom = -10000; for (i = 0; i < poly.Length; i++) { if (left > poly[i].X) { left = poly[i].X; } if (right < poly[i].X) { right = poly[i].X; } if (top > poly[i].Y) { top = poly[i].Y; } if (bottom < poly[i].Y) { bottom = poly[i].Y; } center_pos.X += poly[i].X; center_pos.Y += poly[i].Y; Cv2.Line(result_mat, poly[i], poly[(i + 1) % poly.Length], Scalar.Blue, 2); } if (right - left > 30) { center_pos.X = (left + right) / 2; center_pos.Y = (top + bottom) / 2; bool bfound = false; foreach (Polygon_T s in polygon_array) { if (center_pos.X > 0 && center_pos.Y > 0) { double dist = Math.Sqrt((center_pos.X - s.center_pos.X) * (center_pos.X - s.center_pos.X) + (center_pos.Y - s.center_pos.Y) * (center_pos.Y - s.center_pos.Y)); if (dist < threadhold) { bfound = true; } } } if (bfound == false) { Polygon_T p = new Polygon_T(); p.center_pos = center_pos; p.gt = GraphicType.GT_Polygon; polygon_array.Add(p); Cv2.Circle(result_mat, center_pos, 5, Scalar.Red, 2); } } } else { if (poly.Length == polygon_type) { int left = 10000, right = -10000, top = 10000, bottom = -10000; for (i = 0; i < poly.Length; i++) { if (left > poly[i].X) { left = poly[i].X; } if (right < poly[i].X) { right = poly[i].X; } if (top > poly[i].Y) { top = poly[i].Y; } if (bottom < poly[i].Y) { bottom = poly[i].Y; } center_pos.X += poly[i].X; center_pos.Y += poly[i].Y; Cv2.Line(result_mat, poly[i], poly[(i + 1) % poly.Length], Scalar.Blue, 2); } center_pos.X = (left + right) / 2; center_pos.Y = (top + bottom) / 2; bool bfound = false; foreach (Polygon_T s in polygon_array) { if (center_pos.X > 0 && center_pos.Y > 0) { double dist = Math.Sqrt((center_pos.X - s.center_pos.X) * (center_pos.X - s.center_pos.X) + (center_pos.Y - s.center_pos.Y) * (center_pos.Y - s.center_pos.Y)); if (dist < threadhold) { bfound = true; } } } if (bfound == false) { Polygon_T p = new Polygon_T(); p.center_pos = center_pos; if (polygon_type == 3) { p.gt = GraphicType.GT_Triangularity; } if (polygon_type == 4) { p.gt = GraphicType.GT_Rectangle; } polygon_array.Add(p); Cv2.Circle(result_mat, center_pos, 5, Scalar.Red, 2); } } } } }
void DrawGraphic(Polygon_T pointinfo) { cube_pos_x = (float)pointinfo.center_pos.X - iWidth / 2; cube_pos_y = (float)pointinfo.center_pos.Y - iHeight / 2; cube_pos_x = cube_pos_x / 100.0f; cube_pos_y = cube_pos_y / 100.0f * (-1.0f); switch (pointinfo.gt) { case GraphicType.GT_Rectangle: rectangle.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, rec_z); GameObject obj_rectangle = Instantiate(rectangle); obj_rectangle.transform.position = new Vector3(cube_pos_x, cube_pos_y, rec_z); Graphic_list.Add(obj_rectangle); break; case GraphicType.GT_Triangularity: triangularity.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, tri_z); GameObject obj_triangule = Instantiate(triangularity); obj_triangule.transform.position = new Vector3(cube_pos_x, cube_pos_y, tri_z); Graphic_list.Add(obj_triangule); break; case GraphicType.GT_Sphere: sphere.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, sph_z); GameObject obj_sphere = Instantiate(sphere); obj_sphere.transform.position = new Vector3(cube_pos_x, cube_pos_y, sph_z); Graphic_list.Add(obj_sphere); break; case GraphicType.GT_Pipe: pipe.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, pipe_z); GameObject obj_pipe = Instantiate(pipe); obj_pipe.transform.position = new Vector3(cube_pos_x, cube_pos_y, pipe_z); Graphic_list.Add(obj_pipe); break; case GraphicType.GT_Cylinder: cylinder.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, cyl_z); GameObject obj_cylinder = Instantiate(cylinder); obj_cylinder.transform.position = new Vector3(cube_pos_x, cube_pos_y, cyl_z); Graphic_list.Add(obj_cylinder); break; case GraphicType.GT_TNK: tank.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, tnk_z); GameObject obj_tank = Instantiate(tank); obj_tank.transform.position = new Vector3(cube_pos_x, cube_pos_y, tnk_z); Graphic_list.Add(obj_tank); break; case GraphicType.GT_Polygon: polygon.transform.localPosition = new Vector3(cube_pos_x, cube_pos_y, pol_z); GameObject obj_polygon = Instantiate(polygon); obj_polygon.transform.position = new Vector3(cube_pos_x, cube_pos_y, pol_z); Graphic_list.Add(obj_polygon); break; } }