Пример #1
0
    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);
            }
        }
    }
Пример #2
0
    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);
                    }
                }
            }
        }
    }
Пример #3
0
    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;
        }
    }