Ориентация zxing в Android: ResultMetaData имеет значение null, получить поворот / ориентацию - PullRequest
4 голосов
/ 21 октября 2011

Я работаю над приложением, которое читает QR-коды, и мне нужна ориентация кода.Источник ZXING утверждает, что ориентация может быть получена из хеш-таблицы ResultMetaData через ключ ORIENTATION

Теперь моя проблема заключается в том, что getResultMetaData () не возвращает никаких результатов, когда я запускаю следующее:

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

Тем не менее, строка прямо над этим,

points = Returned[v].getResultPoints();

Работает просто отлично, поэтому я знаю, что кодчитается и возвращает данные.

Кто-нибудь знает исправление для этого или другого метода получения ориентации?

Последнее замечание: я использую QRCodeMultiReader , поэтому Возвращено - это массив.

Спасибо, Зандер

РЕДАКТИРОВАТЬ Я только что обнаружил, что getResultMetaData поддерживает только ориентацию для 1D штрих-кодов, поэтому я думаю, что вопросы сейчас: Как мне получить ориентацию QR-кода?

РЕДАКТИРОВАТЬ # 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

Ответы [ 2 ]

1 голос
/ 21 октября 2011

Результат имеет метод getResultPoints.Это вернет расположение шаблонов поиска (большие черные квадраты) в QR-коде.Поскольку они отображаются в верхнем левом, верхнем правом и нижнем левом углу кода, вы можете определить ориентацию, которую они описывают.В классе ResultPoint есть несколько статических вспомогательных методов.

Для изображения без перспективы три точки должны описывать равнобедренный прямоугольный треугольник.Если есть перспектива, все становится сложнее.

0 голосов
/ 01 декабря 2017

Правильный расчет учитывает только отрезок между точками 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;
...