我正在研究一个读取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;