Веб-камера sarxos: переключение разрешения на лету - PullRequest
0 голосов
/ 12 апреля 2020

первый: какова цель? мое Java приложение должно отображать небольшой предварительный просмотр изображения с камеры, и когда пользователь нажимает кнопку, оно должно делать снимок в полном разрешении.

Я использую webcam-capture-0.3.12.jar на Windows 8.1 и массив [2] разрешений с 2 ​​значениями

Resolutions[INDEX_PREVIEW_RESOLUTION]:  WebcamResolution.QVGA.getSize()
Resolutions[INDEX_CAMERA_RESOLUTION]:  custom resolution 3264x2448

Когда я вхожу в Eclipse через метод getFullResolutionImage (), он работает. Но когда я выполняю тот же код на полной скорости, изображение с камеры становится равным NULL.

Я попытался добавить ожидание (5000 мс), чтобы позволить переключение контекста и позволить другим потокам дышать. Безуспешно.

Деталь, на реализацию которой у меня ушло довольно много времени: закрыть () / открыть () камеру и установить необходимое разрешение

Camera.setViewSize (Resolutions [INDEX_PREVIEW_RESOLUTION]);

недостаточно, я также должен повторить оператор

Camera.setCustomViewSizes (Resolutions);

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


  public BufferedImage getFullResolutionImage() {
    long stamp;
    BufferedImage image;

    System.out.println("Camera is open " + Camera.isOpen());
    if (Camera.isOpen() == true) {
      System.out.println("close camera before switching from preview to full resolution");
      Camera.close();
    }

    Camera.setCustomViewSizes(Resolutions);
    Camera.setViewSize(Resolutions[INDEX_CAMERA_RESOLUTION]);

    stamp = System.currentTimeMillis();
    Camera.open(false); // synchronous
    System.out.println("Camera.open() took " + (System.currentTimeMillis() - stamp) + "ms");

    stamp = System.currentTimeMillis();
    image = Camera.getImage();
    System.out.println("taking a picture took " + (System.currentTimeMillis() - stamp) + "ms");
    if (image != null)
      System.out.println("image has width/height " + image.getWidth() + " " + image.getHeight());
    else
      System.out.println("IMAGE == NULL");

    Camera.close();
    System.out.println("closed camera to switch back to preview resolution");

    System.out.println("now switch back to preview resolution");
    stamp = System.currentTimeMillis();
    try {
      Camera.setCustomViewSizes(Resolutions);
      Camera.setViewSize(Resolutions[INDEX_PREVIEW_RESOLUTION]);
    } catch (Exception ex) {
      System.out.println("Exception while switching back after " + (System.currentTimeMillis() - stamp) + "ms");
    }
    stamp = System.currentTimeMillis();
    Camera.open(true); // asynchronous
    System.out.println("Camera.open() took " + (System.currentTimeMillis() - stamp) + "ms");

    System.out.println("image has width/height " + image.getWidth() + " " + image.getHeight());
    return image;
  }

пошаговое выполнение этого кода дает следующий результат:

Camera is open true
close camera before switching from preview to full resolution
Camera.open() took 10190ms
taking a picture took 1218ms
image has width/height 3264 2448
closed camera to switch back to preview resolution
now switch back to preview resolution
Camera.open() took 3584ms
image has width/height 3264 2448

выполнение того же кода без отладчика дает мне

Camera is open true
close camera before switching from preview to full resolution
Camera.open() took 9171ms
taking a picture took 0ms
IMAGE == NULL
closed camera to switch back to preview resolution
now switch back to preview resolution
Camera.open() took 1489ms

Я не понимаю - почему разница между с / без отладчика? Без отладчика: open () невероятно медленный =: - O Приложение камеры MS Windows показывает плавный поток изображения даже с высоким разрешением.

У меня нет идей - любой совет приветствуется

...