Сравнение изображений с использованием битов блокировки не работает должным образом

Я пытаюсь выполнить базовое распознавание символов только для чисел на изображении, сравнивая его с растровыми изображениями чисел от 0 до 9, используя приведенный ниже код. Я пытался следовать коду в ответе на этот вопрос, но он не возвращает правильные результаты. Есть 2 основные проблемы, с которыми я сталкиваюсь:

1: Если программа определяет, что число 0 присутствует в любой данной точке, то она также определяет, что в этом месте присутствуют 1, 2, 3, ... и 9, что, очевидно, неверно.

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);
                    }
                }
            }
        }
    }

person BrianH    schedule 28.10.2015    source источник
comment
Разве это byte* numPtr = (byte*)data.Scan0.ToPointer(); не должно быть byte* numPtr = (byte*)numData.Scan0.ToPointer();. Похоже, вы сравниваете растровое изображение с самим собой :-)   -  person Ivan Stoev    schedule 28.10.2015
comment
@IvanStoev ДА! Это прекрасно. Смотрите - ошибка новичка. Если вы сделаете это ответом, я приму его :) Большое спасибо!   -  person BrianH    schedule 28.10.2015
comment
Пожалуйста. Я не совсем уверен, должен ли я публиковать такой ответ, но, поскольку вы спрашиваете, я это сделаю.   -  person Ivan Stoev    schedule 28.10.2015
comment
@IvanStoev Это ответ. Это решило проблему, и я ценю это. Я просто расстроен, что кто-то проголосовал против моего вопроса LOL   -  person BrianH    schedule 28.10.2015
comment
Нет проблем, это легко исправить :-) Береги себя, приятель.   -  person Ivan Stoev    schedule 28.10.2015


Ответы (1)


В следующей строке есть ошибка (вероятно, копирование/вставка).

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

что вызывает сравнение растрового изображения с самим собой. Так должно быть

byte* numPtr = (byte*)numData.Scan0.ToPointer();
person Ivan Stoev    schedule 28.10.2015