Android zxing orientation: ResultMetaData is null, Get Rotat



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

键从哈希表ResultMetaData中获得。

现在,我的问题是,getResultMetaData()是不返回任何结果,当我运行以下:

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

然而,在它的正上方,

points = Returned[v].getResultPoints();

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

有人知道这个修复或获得方向的不同方法吗?

最后一个注意:我使用QRCodeMultiReader这就是为什么返回是一个数组。

谢谢,詹德

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

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

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

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

正确的计算只考虑a点和b点之间的段和坐标轴之间定义的角度。它根据象限来调整度数。不需要'distance'或'rect'变量来进行此计算:

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;

最新更新