【问题标题】:Android zxing orientation: ResultMetaData is null, Get Rotation/OrientationAndroid zxing 方向:ResultMetaData 为空,获取旋转/方向
【发布时间】:2011-10-20 21:49:46
【问题描述】:

我正在开发一个读取 QR 码的应用程序,我需要代码的方向。 ZXING 源指出,可以通过键 ORIENTATION

从哈希表 ResultMetaData 中获取方向

现在,我的问题是当我运行以下命令时 getResultMetaData() 没有返回任何结果:

orientation = (Integer) Returned[v].getResultMetadata().get("ORIENTATION");

然而,在这上面的那一行,

points = Returned[v].getResultPoints();

工作得很好,所以我知道代码正在被读取,并且正在返回数据。

有没有人知道解决这个问题或获得方向的不同方法?

最后一点:我使用的是 QRCodeMultiReader,这就是为什么 Returned 是一个数组。

谢谢, 梭鲈

EDIT 我刚刚发现 getResultMetaData 只支持一维条码的方向,所以我想现在的问题是:如何获得二维码的方向?

EDIT #2这是获取旋转的代码(不支持透视)

ResultPoint a= points[1];
ResultPoint b= points[2];
ResultPoint c= points[0];
float distance = Math.abs(a.getX()-b.getX());
RectF rect = new RectF(a.getX(), a.getY(), a.getX()+distance, a.getY()+distance);
//Find the degree of the rotation that is needed
double z = Math.abs(a.getX()-b.getX());
double x = Math.abs(a.getY()-b.getY());
double theta = Math.atan(x/z);

if((b.getX()<a.getX())&&(b.getY()>a.getY())){//-+   
    theta=180-theta;
}else if((b.getX()<a.getX())&&(b.getY()<a.getY())){//--
    theta=180+theta;
}else if((b.getX()>a.getX())&&(b.getY()<a.getY())){ //+-
    theta=360-theta;
}
//theta stores the degree of rotation

【问题讨论】:

  • 为了简单地解释行为:方向并不是真正描述条形码,而是在其中找到条形码的图像的方向。对于 QR 码,这是相当不必要的,因为它可以在图像的任何方向上找到。
  • @SeanOwen 我在代码上绘制了一个覆盖层,需要方向。
  • 好的。这并没有改变关于方向在这里意味着什么的答案。

标签: android null qr-code zxing


【解决方案1】:

Result 有一个 getResultPoints 方法。这将在 QR 码中返回查找器图案(大的黑色方块)的位置。由于它们出现在代码的左上角、右上角和左下角,因此您可以找出它们描述的方向。 ResultPoint 类中有一些静态辅助方法。

对于没有透视的图像,三个点应该描述一个等腰直角三角形。如果有远见,事情就会变得更加复杂。

【讨论】:

  • 正确,尽管它们实际上按左下角、左上角、右上角的顺序出现。右下对齐模式如果存在则显示为第四个元素,除了版本 1 QR 码之外的所有元素。
【解决方案2】:

正确的计算仅考虑 a 点和 b 点之间的线段以及坐标轴之间定义的角度。它根据象限调整度数。进行此计算既不需要“距离”也不需要“矩形”变量:

ResultPoint a= points[1];
ResultPoint b= points[2];
ResultPoint c= points[0];

double z = Math.abs(a.getX()-b.getX());
double x = Math.abs(a.getY()-b.getY());
double theta = Math.toDegrees(Math.atan(x/z));

        // Quadrants 0 and 1
        if(a.getY() > b.getY()) {
            if(a.getX() > b.getX()) {
                theta = 90 + (90 - theta);
            }
        }
        // Quadrants 2 or 3
        else {
            if (a.getX() > b.getX()) {
                theta = 180 + theta;
            }
            else {
                theta = 360 - theta;
            }
        }

        return theta;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多