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

Image after cropping

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

明确地打破它:

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

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

public WhiteRectangleDetector(BitMatrix image, int initSize, int x, int y)

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

顺便说一句,这里有一个简短的解释,说明为什么WhiteRectangleDetector只捕获一个水平分数.有一个初始矩形沿着它的四边展开,直到它上面没有黑点.顶部和底部是正确的,而在一维条形码中,白条阻止算法进一步搜索.

WhiteRectangleDetector可以更好地处理2D​​代码(没有垂直白条代表代码的整个高度),因为您知道在哪里放置初始搜索中心.

点赞