В Android Как нарисовать прямоугольник на QR на основе точек, извлеченных детектором? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сделать сканер QR-кода, используя API Google Vision в Android. Я успешно обнаружил QR-код и извлек содержимое, я использую класс Detector для обнаружения QR. После сканирования я прекращаю просмотр камеры и хочу нарисовать рамку вокруг отсканированного QR. Для этого я получаю сканированные QR-точки (координаты X, Y) из класса детектора. Но эти точки не совпадают с QR-изображением в предварительном просмотре камеры. Вот скриншот отсканированного QR

Ниже приведен метод, который будет вызываться при обнаружении QR, и в этом методе я выбираю QR-коды, затем останавливаю камеру и вызываю метод рисования прямоугольника с положением QR, чтобы нарисовать прямоугольник вместо QR-кода

 @Override
 public void receiveDetections(Detector.Detections<Barcode> detections) 
 {
     final SparseArray<Barcode> qrCodes = detections.getDetectedItems();
     final Detector.Detections<Barcode> frame =   detections;

            if (qrCodes.size() != 0 )
            {
                scannerDetector.release();
                Handler handler = new Handler(Looper.getMainLooper());
                handler.post(new Runnable()
                {
                    @Override
                    public void run() 
                    {
                        cameraSource.stop();//Stopping the camera after a QR is detected

                        for (int i = 0; i < qrCodes.size(); i++)
                        {
                            final int key = qrCodes.keyAt(i);

                            // this gives the rect co-ordinates of the detected QR
                            Rect rect = qrCodes.get(key).getBoundingBox();

                            drawRectangle(rect);                            

                            break;
                        }
                    }

                });
             }
 } 

 private void drawRectangle(final Rect rect)
 {
   runOnUiThread(new Runnable()
   {
       @Override
       public void run()
       {
          // detected frame is a constraint layout and view returned from Draw Rectangle class will be  added as its subview
           detectedFrame.addView(new DrawRectangle(QRCodeScannerActivity.this, rect)); 
       }
   });
 }

Здесь я рисую прямоугольник с прямоугольными координатами, которые я получил от детектора.

public class DrawRectangle extends View
{ 
Rect rect;
public DrawRectangle(Context context, Rect rect )
{
    super(context);
    this.rect = rect;
}

@Override
protected void onDraw(Canvas canvas)
 {
    super.onDraw(canvas);

    Paint paint = new Paint();

    //Rectangle
    paint.setColor(Color.BLUE);
    paint.setStrokeWidth(5);
    paint.setStyle(Paint.Style.STROKE);

    try
    {

       canvas.drawRect(rect,paint);
    }
    catch (Exception e)
    {

    }
  }
}
...