使用锁定位不正确的图像进行比较

时间:2015-10-28 18:37:50

标签: c# bitmap comparison lockbits

我试图通过使用下面的代码将数字与数字0 - 9的位图进行比较,对图像执行基本数字OCR。我试图按照this question的答案中的代码,但它没有返回正确的结果。我面临两个主要问题:

1:如果程序确定在任何给定点存在数字0,那么它还确定在该位置存在1,2,3,...和9,这显然不是真的。< / p>

2:它在...中找到数字的位置...大部分位置都是空白(白色)空格。

我会第一个承认使用lockbits方法对我来说是新的,因为我通常使用比较的getPixel()方法,但这对于这个项目来说太慢了,所以我可能会成为一个新手错误或2.

感谢您的帮助!!!

P.S。 OCR的图像是RTA,我相信其他一切都是不言自明的。

void newOCR()
    {
        Rectangle rect = new Rectangle(0, 0, 8, 9);
        Rectangle numRect = new Rectangle(0, 0, 8, 9);

        for (int i = 0; i < RTA.Width - 8; i++)
        {
            for (int j = 0; j < RTA.Height - 9; j++)
            {
                rect.Location = new Point(i, j);
                for (int n = 0; n < numbers.Length; n++)
                {
                    System.Drawing.Imaging.BitmapData data = RTA.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, RTA.PixelFormat);
                    System.Drawing.Imaging.BitmapData numData = numbers[n].LockBits(numRect, System.Drawing.Imaging.ImageLockMode.ReadOnly, numbers[n].PixelFormat);

                    unsafe
                    {
                        byte* ptr = (byte*)data.Scan0.ToPointer();
                        byte* numPtr = (byte*)data.Scan0.ToPointer();

                        int width = rect.Width * Image.GetPixelFormatSize(data.PixelFormat) / 8;
                        for(int y = 0; y < rect.Height; y++)
                        {
                            bool outBreak = false;
                            for(int x = 0; x < width; x++)
                            {
                                if(*ptr != *numPtr)
                                {
                                    outBreak = true;
                                    break;
                                }
                                else if(y == rect.Height - 1 && x == width - 1)
                                {
                                    timeDict.Add(new Point(i, j), n);
                                }

                                ptr++;
                                numPtr++;
                            }

                            if(outBreak)
                            {
                                break;
                            }

                            ptr += data.Stride - width;
                            numPtr += numData.Stride - width;
                        }

                        RTA.UnlockBits(data);
                        numbers[n].UnlockBits(numData);
                    }
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

以下行中存在(可能是复制/粘贴)错误

byte* numPtr = (byte*)data.Scan0.ToPointer();

导致将位图与自身进行比较。它应该是

byte* numPtr = (byte*)numData.Scan0.ToPointer();