Является ли класс CameraSource API-интерфейса Google Vision с открытым исходным кодом устаревшим?
В этой теме, pm0733464, говорится следующее:
мы открыли источник класса CameraSource, который также имеет метод автофокуса. Этот позволяет вам установить конкретный режим фокусировки, а не режим "непрерывного видео", который по умолчанию установлен в официальном API:
Это было здорово. Но похоже, что Google Vision API продвинулся дальше, а открытая версия Sourced - нет. Официальный API теперь имеет новый тип процессора под названием: FocusingProcessor, который позволяет детектору реагировать только на событие OnFocus.
barcodeDetector = new BarcodeDetector.Builder(this)
.setBarcodeFormats(Barcode.QR_CODE | Barcode.PDF417)
.build();
barcodeDetector.setProcessor(new BarcodeFocusingProcessor(
barcodeDetector,
new NullTracker()));
CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(1600, 1024)
.setAutoFocusEnabled(true)
.setRequestedFps(24.0f);
cameraSource = builder.build();
В моих экспериментах это "находит" штрих-коды намного быстрее, чем при использовании процессора, который приведен в Примерах API Google Vision.
Я что-то упустил где-то? Или CameraSource в библиотеках Google.Vision отличается от того, который они показывают в открытом коде?
[РЕДАКТИРОВАТЬ] Совместное использование кода по запросу pm0733464:
Для справки, я начал с развилки Vision Api Demo, который позволяет автоматически определять штрих-код
Мой код вносит несколько простых изменений. Прежде всего, я добавляю PDF417 к сканируемым штрих-кодам. Затем я установил процессор на автофокус-эр. Я превращаю трекер в nullTracker, потому что мне не нужно отображение графики, и я надеялся, что это ускорит некоторые вещи
в BarcodeCaptureActivity я изменяю createCameraSource, где он определил детектор штрих-кода следующим образом:
BarcodeDetector barcodeDetector =
new BarcodeDetector.Builder(context)
.setBarcodeFormats(Barcode.PDF417)
.build();
barcodeDetector.setProcessor(new MyCameraFocusingProcessor(
barcodeDetector,
new NullTracker()));
// Creates and starts the camera. Note that this uses a higher resolution in comparison
// to other detection examples to enable the barcode detector to detect small barcodes
// at long distances.
CameraSource.Builder builder = new CameraSource.Builder(getApplicationContext(), barcodeDetector)
.setFacing(CameraSource.CAMERA_FACING_BACK)
.setRequestedPreviewSize(1600, 1024)
.setRequestedFps(24.0f);
// make sure that auto focus is an available option
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH)
{
builder = builder.setFocusMode(
autoFocus ? Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE : null);
}
mCameraSource = builder
.setFlashMode(useFlash ? Camera.Parameters.FLASH_MODE_TORCH : null)
.build();
}
Мой FocusProcessor (в том же классе) выглядит так:
private class MyCameraFocusingProcessor implements Detector.Processor<Barcode>
{
public MyCameraFocusingProcessor(BarcodeDetector barcodeDetector, NullTracker emptyTracker)
{
}
@Override
public void release()
{
}
@Override
public void receiveDetections(Detector.Detections<Barcode> detections)
{
// boolean chk = detections.detectorIsOperational();
int sizeCheck = detections.getDetectedItems().size();
if (sizeCheck > 0)
{
SparseArray<Barcode> codes = detections.getDetectedItems();
for (int i = 0; i < sizeCheck; i++)
{
Barcode barcode = codes.valueAt(i);
try
{
if (barcode.format == Barcode.PDF417)
{
Intent data = new Intent();
data.putExtra(BarcodeObject, barcode);
setResult(CommonStatusCodes.SUCCESS, data);
finish();
break;
}
}
catch (Exception ex)
{
Log.d("Detect", "Error: " + ex.getMessage());
}
}
}
return;
}
}
private class NullTracker
{
}
1 ответ
Как официальная, так и открытая версии CameraSource являются актуальными, хотя в некоторых вариантах есть небольшие различия.
FocusingProcessor не нов, поскольку он был включен в первоначальный запуск API. На самом деле это никак не связано с понятием фокуса камеры или OnFocus. Вместо этого это связано с выбором детектора "фокусироваться" на конкретном обнаруженном предмете. Например, существует LargestFaceFocusingProcessor - подкласс FocusingProcessor - который изначально определяет самое большое видимое лицо и отслеживает только то лицо, которое видимо.
Обе версии CameraSource теперь поддерживают автофокусировку, хотя особенности того, как это указано в каждой, немного разошлись. Если официальный пример приложения со штрих-кодом работает медленнее, это, вероятно, означает, что автофокусировка не была включена в этом приложении.