我有一个摄像头,以及能够截图了,图像是一个黑底上有两个十字光标(较大个,多数时间是没有倾斜的)的图形,亮度一浅一深我想图像识别,找出两个十字的中心,之后计算其中心的差距。请问应该怎么编程呢?
如果太复杂可以先告诉我一个十字应该怎么识别? 二值化之后我就没想到更好的处理方法了

解决方案 »

  1.   

    你都二值化了还有什么不能做的。。可以用X和Y两个方向的直方图投影,然后找到能量最高的两个点坐标,X1、X2和Y1、Y2,那么(X1,Y1)、(X2,Y2)就是你要的两个十字中心N个十字也是这么做只要十字在投影方向上不重叠。。
      

  2.   

    以一个倾斜十字为例试着找了一下中心点,没优化,不知道行不行。
            int centerx = -1;
            int centery = -1;
            Bitmap bp;
            public Form1()
            {
                InitializeComponent();
            }        unsafe private void button1_Click_1(object sender, EventArgs e)
            {
                bp = (Bitmap)Bitmap.FromFile("e:\\test.bmp");
                BitmapData data = bp.LockBits(new Rectangle(0, 0, bp.Width, bp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
                Dictionary<uint, List<Point>> colorpoints = new Dictionary<uint, List<Point>>();
                uint* p = (uint*)data.Scan0;
                for (int i = 0; i < bp.Width; i++)
                {
                    for (int j = 0; j < bp.Height; j++)
                    {
                        uint color = p[j * bp.Width + i];
                        if (!colorpoints.Keys.Contains(color))
                            colorpoints.Add(color, new List<Point>());
                        else
                            colorpoints[color].Add(new Point(i, j));
                    }
                }
                var cross = colorpoints.OrderByDescending(x => x.Value.Count).Select(y => y.Key).ToArray()[1];
                List<Point> list = colorpoints[cross];
                int leftx = list.Min(x => x.X);
                int rightx = list.Max(x => x.X);
                int topy = list.Min(x => x.Y);
                int bottomy = list.Max(x => x.Y);
                centerx = (leftx + rightx) / 2;
                centery = (topy + bottomy) / 2;
                for (int i = centerx - 10; i < centerx + 11; i++)
                {
                    for (int j = centery - 10; j < centery + 11; j++)
                    {
                        p[j * bp.Width + i] = 0xffffffff;
                    }
                }
                bp.UnlockBits(data);
                Invalidate();
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                if(centerx == -1)
                    return;
                e.Graphics.DrawImage(bp, new Point(0, 0));
            }
      

  3.   

    直接用估计不行,我用PowerPoint画的图,本应该只有黑白两种颜色,保存成图片后还是出现了五种。你用摄像头拍的照片估计杂色就更多了,得先降噪。否则万一不知道哪儿跑出一个小小的和十字一样的像素就谬以千里了。
      

  4.   


    var cross = colorpoints.OrderByDescending(x => x.Value.Count).Select(y => y.Key).ToArray()[1]
    这句不知道什么意思 能解释一下吗?
      

  5.   

    关于形心计算问题,代码,请看http://dongtingyueh.blog.163.com/blog/static/46194532011427105715472/
    http://dongtingyueh.blog.163.com/blog/static/461945320126238303158/
      

  6.   

    AFORGE里面有,你百度一下,下载了,直接可以调用,我当时做的是行人流量检测,用到了连通域判断,整个工程测试为25帧每秒,实时性完全可以!!!
      

  7.   

    AFORGE里面有,你百度一下,下载了,直接可以调用,我当时做的是行人流量检测,用到了连通域判断,整个工程测试为25帧每秒,实时性完全可以!!!
      

  8.   

    回复了好几次了,一直显示不出来....AForge里面有现成的代码,你百度一下,直接调用,我当时做的是行人流量自动检测,用到了这个,整个工程测试为25帧/S,实时性完全可以!!!
      

  9.   

    回复了好几次了,一直显示不出来....AForge里面有现成的代码,你百度一下,直接调用,我当时做的是行人流量自动检测,用到了这个,整个工程测试为25帧/S,实时性完全可以!!!
      

  10.   

    http://img.my.csdn.net/uploads/201209/12/1347443809_5125.JPG 。 这个是两个光斑一样亮度的情况,基本上求最亮两点就可以了。但我想做得比较通用的