检查图像 C# 中的文本。使用 memcmp 是一种选择吗?

发布于 2024-11-30 06:29:44 字数 1148 浏览 1 评论 0原文

我正在开展一个研究项目,该项目要求我识别图像中的文本。在论坛上我看到了一篇使用 memcmp 的帖子,但我对此没有运气。

为了提供有关我的任务的更多详细信息:

我对此进行了屏幕截图。我的图像显示“GPS:初始位置 34 45 23”。

然后,我深入研究在应用程序启动时加载的预定义图像地图。该地图包含文本图像 - 初始、重置、启动等。

如何检查我捕获的图像是否与其中之一匹配地图中的预定义图像。

请帮忙。

附上代码快照

public static bool CompareMemCmp(Bitmap b1, Bitmap b2)
{
  if ((b1 == null) != (b2 == null)) return false;

  var bd1 = b1.LockBits(new Rectangle(new Point(0, 0), b1.Size), ImageLockMode.ReadOnly, b1.PixelFormat);
  var bd2 = b2.LockBits(new Rectangle(new Point(0, 0), b2.Size), ImageLockMode.ReadOnly, b2.PixelFormat);

  try
  {
    IntPtr bd1scan0 = bd1.Scan0;
    IntPtr bd2scan0 = bd2.Scan0;

    int stride = bd1.Stride;
    int len = stride * b1.Height;

    int stride2 = bd2.Stride;
    int len2 = stride2 * b2.Height;

    for (int i = 0; i < len; ++i)
    {
      bd1scan0 = bd1.Scan0 + i;

      int test = memcmp(bd1scan0, bd2scan0, len2);
      if (test == 0)
      {
        Console.WriteLine("Found the string");
        return true;
      }
    }

    return false;
  }
  finally
  {
    b1.UnlockBits(bd1);
    b2.UnlockBits(bd2);
  }
}

I'm working on a research project which requires me to identify text within an image. Over the forum I saw a post of using memcmp, but I'm having no luck with this.

To give more details on my task :

I screen capture this. My image reads "GPS: Initial Location 34 45 23".

I then dip into a predefined map of images that I load at the start of my application.The map contains images for text - Initial, Reset, Launch, ....

How do I check if the image I captured matches to one of the predefined images in the map.

Kindly help.

Attaching a snapshot of code

public static bool CompareMemCmp(Bitmap b1, Bitmap b2)
{
  if ((b1 == null) != (b2 == null)) return false;

  var bd1 = b1.LockBits(new Rectangle(new Point(0, 0), b1.Size), ImageLockMode.ReadOnly, b1.PixelFormat);
  var bd2 = b2.LockBits(new Rectangle(new Point(0, 0), b2.Size), ImageLockMode.ReadOnly, b2.PixelFormat);

  try
  {
    IntPtr bd1scan0 = bd1.Scan0;
    IntPtr bd2scan0 = bd2.Scan0;

    int stride = bd1.Stride;
    int len = stride * b1.Height;

    int stride2 = bd2.Stride;
    int len2 = stride2 * b2.Height;

    for (int i = 0; i < len; ++i)
    {
      bd1scan0 = bd1.Scan0 + i;

      int test = memcmp(bd1scan0, bd2scan0, len2);
      if (test == 0)
      {
        Console.WriteLine("Found the string");
        return true;
      }
    }

    return false;
  }
  finally
  {
    b1.UnlockBits(bd1);
    b2.UnlockBits(bd2);
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不忘初心 2024-12-07 06:29:44

如果您正在寻找精确匹配,即每个位都相同的匹配,则可以使用此方法。但是,如果情况并非如此,其他算法可能会更好。一个例子是使用互相关。我用它来比较音频文件,效果很好。请参阅​​这个问题< /a>

If you are looking for an exact match, i.e. a match where every bit is the same, you could use this approach. However, if this is not the case, other algorithms might be better. One example would be to use cross correlation. I used it to compare audio files and it works great. See this question

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文