Как рассчитать позицию пикселя?

Мое приложение имеет такое разрешение: ширина 1080 пикселей, высота 1920 пикселей. Я использую предварительный просмотр камеры, его разрешение составляет 1920 по ширине и 1080 по высоте. Потом обрабатываю прикосновение к экрану, получаю координаты например x=250, а y=600. Дальше идет какая-то обработка с использованием кадров превью камеры. Но не все так, как должно быть. Думаю, это связано с разницей в параметрах разрешения. Как изменить ширину и высоту мест? Потом рисую прямоугольник по новым координатам, которые рассчитываются по старым, но они слишком разные и даже близко не соответствуют результату.

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
    if (scanSpace) {
        mainActivity = new MainActivity();
        Log.d(TAG,"OnPreviewFRAME_START");
        Camera.Parameters parameters = camera.getParameters();
        int width = parameters.getPreviewSize().width;
        int height = parameters.getPreviewSize().height;
        Log.d(TAG, "Camera parameters: width: " + String.valueOf(width) + " height: " + String.valueOf(height) );
//^ camera parameters width 1920 , height 1080. - problem. My app display width 1080 height 1920


        //convert the byte[] to Bitmap through YuvImage;
        //make sure the previewFormat is NV21 (I set it so somewhere before)
        YuvImage yuv = new YuvImage(data, parameters.getPreviewFormat(), width, height, null);
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        yuv.compressToJpeg(new Rect(0, 0, width, height), 100, out);
        Bitmap bmp = BitmapFactory.decodeByteArray(out.toByteArray(), 0, out.size());

        Log.d(TAG, "Frame (picture) parameter: width: " + String.valueOf(bmp.getWidth()) + " height: " + String.valueOf(bmp.getHeight()));

        //convert Bitmap to Mat; note the bitmap config ARGB_8888 conversion that
        //allows you to use other image processing methods and still save at the end
        Log.d(TAG, "BMP size for search: HEIGHT:  " + String.valueOf(bmp.getHeight()) + " WIDTH: " + String.valueOf(bmp.getWidth()));
        Mat orig = new Mat(bmp.getHeight(), bmp.getWidth(),CvType.CV_8UC3);
        bmp = bmp.copy(Bitmap.Config.ARGB_8888, true);
        Utils.bitmapToMat(bmp, orig);
        Imgproc.cvtColor(orig, orig, Imgproc.COLOR_BGR2GRAY,4);
        Log.d(TAG, "Old RES: " + String.valueOf(orig.rows()) + " " + String.valueOf(orig.cols()));
        Mat rotMat = new Mat(2, 3, CvType.CV_32FC1);
        Mat destination = new Mat(orig.rows(), orig.cols(), orig.type());
        Point center = new Point(destination.cols() / 2, destination.rows() / 2);
        rotMat = Imgproc.getRotationMatrix2D(center, 90, 1);
        Imgproc.warpAffine(orig, destination, rotMat, destination.size());
        Log.d(TAG, "NEW RES: " + String.valueOf(destination.rows()) + " " + String.valueOf(destination.cols()));


        Mat crop_orig = mainActivity.cropImage(orig);
        Log.d(TAG, "CROP IMAGE PARAMS: HEIGHT:  " + String.valueOf(crop_orig.height()) + " WIDTH: " + String.valueOf(crop_orig.width()));
        Mat result = new Mat();
        matchTemplate(orig, crop_orig, result, Imgproc.TM_SQDIFF);
        Core.MinMaxLocResult r = Core.minMaxLoc(result);
        System.out.println(r.minVal + " " + r.minLoc);

        Core.MinMaxLocResult mmr = Core.minMaxLoc(result);
        Point matchLoc = mmr.maxLoc;
        double tmp_x = matchLoc.x;
        double tmp_y = matchLoc.y;
        xPoint_1 = (int) tmp_x;
        yPoint_1 = (int) tmp_y;
        // result not true because diffrent resolution
        Log.d(TAG, "FINISH template");

        scanSpace = false;
        camera.setPreviewCallback(this);
    }

    }

Без кода помочь сложно. Пожалуйста, вставьте MCVE, который поможет нам помочь вам

IanQ 08.02.2019 22:34

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

Vitalja B. 09.02.2019 06:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
708
0

Другие вопросы по теме