Я использую библиотеку Android Zxing для декодирования QR-кода, который должен быть извлечен в режиме реального времени из рамки предварительного просмотра камеры. Проблема в том, что мне нужно использовать OpenCV для обнаружения QR-кода, не прося пользователя сделать снимок. Кто-нибудь, пожалуйста, скажите мне:
Как использовать кадры с камеры?
Как использовать OpenCV для обнаружения QR на этих кадрах, без захвата изображения?
Какой алгоритм использовать для обнаружения QR-кода?
Кроме того, я был бы признателен, если бы кто-нибудь сказал мне, какие функции, библиотеки использовать, а также некоторые примеры кодов, которые могут мне помочь.
Обновление: это то, что я делаю сейчас:
Используя кадр предварительного просмотра, декодируем его в массив байтов, а затем передаем его в RGBLuminance
public void surfaceCreated (Держатель SurfaceHolder) {
// The Surface has been created, acquire the camera and tell it where
// to draw.
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(new PreviewCallback() {
public void onPreviewFrame(byte[] data, Camera arg1) {
boolean shouldCall = (System.currentTimeMillis() - lastTime) > 1000;
if (shouldCall) {
lastTime = System.currentTimeMillis();
//slow work
Camera.Parameters parameters = camera.getParameters();
Size size = parameters.getPreviewSize();
Bitmap bMap1 = BitmapFactory.decodeByteArray(data, 0, data.length);
TextView textv = (TextView) findViewById(R.id.mytext);
LuminanceSource source = new RGBLuminanceSource(bMap1);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
Reader reader = new MultiFormatReader();
try {
Result result = reader.decode(bitmap);
text = result.getText();
byte[] rawBytes = result.getRawBytes();
if (rawBytes!= null)
camera.stopPreview();
BarcodeFormat format = result.getBarcodeFormat();
ResultPoint[] points = result.getResultPoints();
ParsedResult result2 = parseResult(result);
textv.setText(text);
} catch (NotFoundException e) {
camera.startPreview();
e.printStackTrace();
} catch (ChecksumException e) {
text = "Checksum Error";
camera.stopPreview();
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FormatException e) {
text = "Format Error";
camera.stopPreview();
// TODO Auto-generated catch block
e.printStackTrace();
}
lastTime = System.currentTimeMillis();
}
}
});
} catch (IOException e) {
camera.startPreview();
}
}
Но это не работает. Кто-нибудь может сказать мне, что я делаю не так? Кроме того, я использую тот же экземпляр декодирования в моем другом фрагменте кода, где я просто делаю снимок и декодирую его. Но каждый раз, когда картинка не содержит QR, приложение закрывается с принудительным закрытием. Что мне с этим делать? Кто-нибудь, пожалуйста, помогите