使用锁位比较图像无法正常工作
Comparing images using lockbits not functioning correctly
我正在尝试通过将图像与数字 0 - 9 的位图进行比较来对图像执行基本的纯数字 OCR,使用下面的代码。我已尝试按照 this question 的答案中的代码进行操作,但它没有返回正确的结果。我面临两个主要问题:
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);
}
}
}
}
}
下一行有(可能copy/paste)错误
byte* numPtr = (byte*)data.Scan0.ToPointer();
导致将位图与自身进行比较。应该是
byte* numPtr = (byte*)numData.Scan0.ToPointer();
我正在尝试通过将图像与数字 0 - 9 的位图进行比较来对图像执行基本的纯数字 OCR,使用下面的代码。我已尝试按照 this question 的答案中的代码进行操作,但它没有返回正确的结果。我面临两个主要问题:
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);
}
}
}
}
}
下一行有(可能copy/paste)错误
byte* numPtr = (byte*)data.Scan0.ToPointer();
导致将位图与自身进行比较。应该是
byte* numPtr = (byte*)numData.Scan0.ToPointer();