Android zxing方向:ResultMetaData为空,获取旋转/方向。

4

我正在开发一款扫描二维码的应用程序,需要获取二维码的方向信息。ZXING源代码中指出,可以通过哈希表ResultMetaDataORIENTATION键获取方向信息。

然而,当我运行以下代码时,getResultMetaData()没有返回任何结果:

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

然而,就在这句话的上一行,
points = Returned[v].getResultPoints();

代码可以正常工作,所以我知道代码已经被读取,并且返回了数据。

有人知道如何修复这个问题或者获得方向的不同方法吗?

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

谢谢, Zander

编辑 我刚刚发现getResultMetaData只支持1D条形码的方向,所以现在的问题是:如何获得QR码的方向?

第二次编辑 这是获取旋转的代码(不支持透视)

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 码来说,这是相当不必要的,因为它可以在图像的任何方向上被找到。 - Sean Owen
@SeanOwen 我正在代码上绘制叠加层,需要确定方向。 - MrZander
好的。这并不改变这里“方向”一词的含义。 - Sean Owen
相关问题:http://stackoverflow.com/questions/3689210/qr-codes-camera-orientation-projection - Andre Luus
2个回答

1

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

对于没有透视效果的图像,这三个点应该描述一个等腰直角三角形。如果存在透视效果,则情况会变得更加复杂。


虽然它们实际上是按照左下、左上、右上的顺序出现,但这是正确的。如果存在第四个元素,则底部右侧对齐模式将作为第四个元素出现,除了版本1 QR码外,所有QR码都是如此。 - Sean Owen

0
正确的计算只考虑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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接