如何用emgu cv检测图像中的矩形?

时间:2017-11-17 08:32:01

标签: c# emgucv

我正试图在c#中检测Emgucv中的矩形,我正在玩下面的代码,我从互联网上下载。我是新手,所以我希望有人可以帮助我:

public class ShapeDectection
{
    public Image<Bgr, Byte> img;
    public PictureBox Picture;
    public PictureBox Result;
    public double dCannyThres;
    private UMat uimage;
    private UMat cannyEdges;
    private List<Triangle2DF> triangleList;
    private List<RotatedRect> boxList;
    private Image<Bgr, Byte> triangleRectImage;

    public ShapeDectection(PictureBox pic, string filepath, PictureBox results)
    {
        Picture = pic;
        Result = results;
        img = new Image<Bgr, Byte>(filepath);
        triangleList = new List<Triangle2DF>();
        boxList = new List<RotatedRect>();
        uimage = new UMat();
        cannyEdges = new UMat();
        dCannyThres = 180.0;
        fnFindTriangleRect();
        MessageBox.Show("done");
    }
    private void fnFindTriangleRect()
    {
        CvInvoke.CvtColor(img, uimage, ColorConversion.Bgr2Gray);
        UMat pyrDown = new UMat();
        CvInvoke.PyrDown(uimage, pyrDown);
        CvInvoke.PyrUp(pyrDown, uimage);
        triangleRectImage = img.CopyBlank();
        using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
        {
            CvInvoke.FindContours(cannyEdges, contours, null, RetrType.List, ChainApproxMethod.ChainApproxSimple);
            int count = contours.Size;
            MessageBox.Show("count = " + count);
            for (int i = 0; i < count; i++)
            {
                using (VectorOfPoint contour = contours[i])
                using (VectorOfPoint approxContour = new VectorOfPoint())
                {
                    CvInvoke.ApproxPolyDP(contour, approxContour, CvInvoke.ArcLength(contour, true) * 0.05, true);
                    if (CvInvoke.ContourArea(approxContour, false) > 250) //only consider contour with area > 250
                    {
                        MessageBox.Show("approxContour.Size = " + approxContour.Size);
                        if (approxContour.Size == 3) //The contour has 3 vertices, is a triangle
                        {
                            Point[] pts = approxContour.ToArray();
                            triangleList.Add(new Triangle2DF(pts[0], pts[1], pts[2]));
                        }
                        else if (approxContour.Size == 4) // The contour has 4 vertices
                        {
                            #region Determine if all the angles in the contours are within [80,100] degree
                            bool isRectangle = true;
                            Point[] pts = approxContour.ToArray();
                            LineSegment2D[] edges = PointCollection.PolyLine(pts, true);
                            for (int j = 0; j < edges.Length; j++)
                            {
                                double dAngle = Math.Abs(edges[(j + 1) % edges.Length].GetExteriorAngleDegree(edges[j]));
                                MessageBox.Show("" + dAngle);
                                if (dAngle < 80 || dAngle > 100)
                                {
                                    isRectangle = false;
                                    break;
                                }
                            }
                            #endregion
                            if (isRectangle) boxList.Add(CvInvoke.MinAreaRect(approxContour));
                        }
                    }
                }
            }

        }
        foreach (Triangle2DF triangle in triangleList)
        {
            triangleRectImage.Draw(triangle, new Bgr(Color.DarkBlue), 2);
        }
        foreach (RotatedRect box in boxList)
            triangleRectImage.Draw(box, new Bgr(Color.Red), 2);
        Result.Image = triangleRectImage.ToBitmap();
    }
}

我正在尝试检测下图enter image description here

中的形状

然而这是结果: enter image description here

你可以看到脚本没有检测到任何形状,因为轮廓的数量为零。我可以修改脚本以便检测这些形状吗?

1 个答案:

答案 0 :(得分:1)

我似乎无法找到&#34; Canny边缘检测&#34;

UMat cannyEdges = new UMat();
CvInvoke.Canny(uimage, cannyEdges, cannyThreshold, cannyThresholdLinking);
你的代码中的

。这是EmguCV wiki页面http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp

的链接

检查缺件。