ZXing:查找条形码的边界矩形

man*_*nda 5 qr-code barcode bounding-box zxing

我正在实验ResultPoints,它返回与图像中条形码相关的点。
对于QR码,ResultPoints返回一组4个点,它们是QR码每个角上四个框的坐标。当我对条形码进行相同的实验时,它返回两个点,表示条形码的宽度。如何找到条形码的边界矩形?有什么方法可以使用ResultPoints数组计算条形码的左上角和右下角的坐标?

经过一些研究,我发现了类WhiteRectangleDetector。正是我感兴趣的东西,但是当我开始玩它时,它给了我部分结果,但不是确切结果。我已经附加了使用WhiteRectangleDetector获得的结果的图像,但是正如我们所看到的,它只是对条形码的中间部分而不是条形码的整个矩形部分进行着色。所以我想知道我是否能够遮盖条形码的整个矩形部分。

我的代码:

        barcodeBitmap = (Bitmap)Bitmap.FromFile("barcode-image.png");
        var luminanceSource = new ZXing.BitmapLuminanceSource(barcodeBitmap);
        var binarizer = new ZXing.Common.HybridBinarizer(luminanceSource);
        var bitMatrix = binarizer.BlackMatrix;

        var whiterect = WhiteRectangleDetector.Create(bitMatrix);

        ResultPoint[] whiterectpts = whiterect.detect();
        if (whiterectpts != null)
        {
            Console.WriteLine("\nWhiteRectangleDetector\n");
            foreach (var w in whiterectpts)
            {
                Console.WriteLine(w);
            }
            Rectangle whiterectangle = new Rectangle((int)whiterectpts[0].X, (int)whiterectpts[0].Y, (int)(whiterectpts[2].X - whiterectpts[1].X), (int)(whiterectpts[1].Y - whiterectpts[0].Y));
            img = Image.FromFile("barcode-image.png");
            g = Graphics.FromImage(img);
            g.DrawRectangle(pen, whiterectangle);
            img.Save("crop2.png");
        }
Run Code Online (Sandbox Code Playgroud)

裁剪后的图像

pur*_*ang 4

通过 ResultPoints,您可以获得条形码的侧面。通过 WhiteRectangleDetector (WRDet),您可以获得条形码顶部的 y 坐标和高度。将所有这些信息放在一起将为您提供准确的坐标!

明确地分解它:

  • left-top:顶部的 y 值来自 WRDet,x 值来自最左边的 ResultPoint
  • right-top:顶部的 y 值来自 WRDet,x 值来自最右边的 ResultPoint
  • left-bottom:顶部距 WRDet 的 y 值 + 距 WRDet 的高度,通过最左边 ResultPoint 的 x 值
  • right-bottom:顶部从 WRDet 的 y 值 + 从 WRDet 的高度,通过最右边的 ResultPoint 的 x 值

调用 ResultPoints 和调用 WRDet 似乎有些过分,但如果初始搜索中心位于条形码内部,则 WRDet 算法非常快。可以使用以下构造函数修改初始搜索中心:

public WhiteRectangleDetector(BitMatrix image, int initSize, int x, int y)
Run Code Online (Sandbox Code Playgroud)

您知道 x 应位于左右 ResultPoint 之间,对于 y 值,您可以选择其中一个 ResultPoint 的 y 值。


顺便说一句,这里是关于为什么 WhiteRectangleDetector 仅捕获水平部分的简短解释。有一个初始矩形,该矩形沿其四个边扩展,直到其上不再有黑点。顶部和底部是正确的,而在一维条形码中,白条阻止算法进一步搜索。

WhiteRectangleDetector 对于 2D 代码效果更好(代码的整个高度没有垂直白条),前提是您当然知道将初始搜索中心放在哪里。