使用C#进行光学标记识别

时间:2015-06-22 08:08:12

标签: c# image-processing point pixels optical-mark-recognition

这是一个确定点是否在图像边界内并检查它是否与其他圆重叠的函数。

如果它返回true,那么我检查圆圈填充黑色的阈值,然后将填充超过90%的点保存到点列表中。

我的程序分两步进行

1)如果它形成一个没有重叠的圆圈。

2)如果填充率为90%。

我正面临一个错误,如果我通过一个只有1个圆圈的图像就可以节省1408个圆圈。我不知道我做错了什么。

以下是按钮点击事件

        for (int i = 0; i < 50; i++)
        {
            for (int j = 0; j < 50; j++)
            {
                p.X = j;
                p.Y = i;
                if  (isCircle(p))
                {

                    if (checkThreshold(p) > 90)
                    {
                        pts.Insert(0, p);
                    }
                }
            }
        }

下面给出的是函数

private bool isCircle(Point p)
    {

        double count = 0;
        Point curP = new Point();
        //Point centre = new Point(24, 20);
        int a = 0;

        boundary.X = 50;
        boundary.Y = 50;

        for (int x = (p.X - radius); x <= (p.X - radius); x++)
        {
            for (int y = (p.Y - radius); y <= (p.Y - radius); y++)
            {
                if ((x < boundary.X) && (y < boundary.Y) && (x + radius < boundary.X) && (y + radius < boundary.Y))
                {
                    curP.X = 0;
                    curP.Y = 0;

                    curP.X = x;
                    curP.Y = y; //stores new point to be sent in curP
                    while (a < pts.Count)
                    {
                        //point , centre, radius
                        if (checkOverlap(curP, pts[a], radius) == false) //send point to check if it overlaps or not
                        {
                            // MessageBox.Show("yellow");
                            count = 1;
                            break;
                        }
                        else
                        {
                            a++;
                        }

                    }

                }
                if (count == 1)
                    break;
            }
            if (count == 1)
                break;

        }

        if (count == 1)
            return true;

        else return false;
    }

下面给出的是checkOverlap函数

    private bool checkOverlap(Point p, Point c, int radii)
    {

        Point listPoint;

        listPoint = p;

        //the following if condition checks if the point resides in the list or not

        if ((((c.X - radii) < listPoint.X) && (listPoint.X > (c.X - radii))) && (((c.Y - radii) < listPoint.Y) && (listPoint.Y > (c.Y - radii))))
        {
            if ((((p.X - c.X) * (p.X - c.X)) - ((p.Y - c.Y) * (p.Y - c.Y))) < (radius * radius))
            {
                return false;
            }
            return true;
        }
        else
            return true;
    }

1 个答案:

答案 0 :(得分:0)

不确定这是否是问题,但由于您正在测试相等的方式,因此count变量应为int