Я пытаюсь сделать сканер 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)
{
}
}
}