我正在尝试使用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");
}
答案 0 :(得分:2)
通过ResultPoints,您可以看到条形码的两侧。通过WhiteRectangleDetector(WRDet),您可以获得顶部的y坐标和条形码的高度。将所有这些信息放在一起可以得到准确的坐标!
明确地打破它:
调用ResultPoints并调用WRDet似乎有点过分,但如果初始搜索中心位于条形码内,WRDet算法会非常快。可以使用以下构造函数修改初始搜索中心:
public WhiteRectangleDetector(BitMatrix image, int initSize, int x, int y)
您知道x应位于左侧和右侧ResultPoint之间,对于y值,您可以选择其中一个ResultPoints的y值。
顺便说一句,这里有一个简短的解释,说明为什么WhiteRectangleDetector只捕获一个水平分数。有一个初始矩形沿着它的四边展开,直到它上面没有黑点。顶部和底部是正确的,而在一维条形码中,白条阻止算法进一步搜索。
WhiteRectangleDetector可以更好地处理2D代码(没有垂直白条代表代码的整个高度),因为您知道在哪里放置初始搜索中心。
答案 1 :(得分:0)
我自己也在研究这个问题,也许您可以在不同的构造函数中修改以下参数来克服您的问题:WhiteRectangleDetector.java中以下构造函数中的initSize参数会扩大初始搜索区域并导致检测到整个1D条码。
public WhiteRectangleDetector(BitMatrix image,int initSize,int x,int y)抛出NotFoundException {...}
我想问你的问题:WhiteRectangleDetector是否适用于1D和/或QR码?你有没有试过MonochromeRectangleDetector?
答案 2 :(得分:0)
对于QR码:在研究了ZXING的源代码之后,我找到了一个简单的解决方案。每个qr代码的resultsPoints按以下顺序包含以下几点:
索引0:bottomLeft index 1:topLeft index 2:topRight
因此,您可以使用resultPoints作为构造函数参数创建自己的类,以创建在图像中保存qr代码坐标的对象。以下代码是用C#编写的,因为我们使用的是Xamarin,但java代码看起来很相似:
public class QRCodeCoordinates
{
public float X1 { get; set; }
public float X2 { get; set; }
public float Y1 { get; set; }
public float Y2 { get; set; }
public QRCodeCoordinates(ZXing.ResultPoint[] resultPoints)
{
this.X1 = resultPoints[0].X; // index 0: bottom left
this.X2 = resultPoints[2].X; // index 2: top right
this.Y1 = resultPoints[2].Y; // index 2: top right
this.Y2 = resultPoints[0].Y; // index 0: bottom left
}
}