Я пытаюсь выполнить базовое распознавание символов только для чисел на изображении, сравнивая его с растровыми изображениями чисел от 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);
}
}
}
}
}
byte* numPtr = (byte*)data.Scan0.ToPointer();
не должно бытьbyte* numPtr = (byte*)numData.Scan0.ToPointer();
. Похоже, вы сравниваете растровое изображение с самим собой :-) - person Ivan Stoev   schedule 28.10.2015