первый: какова цель? мое 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 показывает плавный поток изображения даже с высоким разрешением.
У меня нет идей - любой совет приветствуется