Canon EDSDK Focus
Я хотел бы отправить команду, чтобы сфокусировать камеру, затем отключить функцию автоматической фокусировки, а затем сделать фотографии. Это сделано для того, чтобы избежать фокусировки между фотографиями. Это возможно? У меня полностью написана программа, но это последний кусок головоломки.
2 ответа
Вот что я нашел.
фокусировка немного проблематична с Canon SDK. Но для вашего случая я думаю, что самая простая вещь будет такой:
MainCamera.SendCommand(CameraCommand.PressShutterButton,(int)ShutterButton.Completely);
//Wait for some time here and if the photo wasn't taken, call:
MainCamera.SendCommand(CameraCommand.PressShutterButton,(int)ShutterButton.Completely_NonAF);
//Then, in either case, call
MainCamera.SendCommand(CameraCommand.PressShutterButton,(int)ShutterButton.OFF);
Или, если вы используете просмотр в реальном времени, вы должны сделать что-то вроде этого:
MainCamera.SendCommand(CameraCommand.DoEvfAf, 1);
//Wait for some time here
MainCamera.SendCommand(CameraCommand.DoEvfAf, 0);
MainCamera.SendCommand(CameraCommand.PressShutterButton,(int)ShutterButton.Completely_NonAF);
MainCamera.SendCommand(CameraCommand.PressShutterButton,(int)ShutterButton.OFF);
Надеюсь, что это поможет кому-то, как я долго и трудно для этого.
Существует более точный способ определения того, что на самом деле происходит после начала фокусировки. Во-первых, вы можете определить, удалось ли выполнить фокусировку, а также узнать, когда фокус завершился, поэтому вам не нужно ждать слишком долго.
Операция отличается в LiveView и в обычном режиме. Я протестировал его в LiveView, но в документации говорится о некоторой разнице в обычном режиме. Во всяком случае, это для LV:
Используйте первую команду, как вы сделали:
MainCamera.SendCommand(CameraCommand.DoEvfAf, kEdsCameraCommand_EvfAf_ON);
затем периодически проверяйте kEdsPropID_FocusInfo
свойство, чтобы обнаружить, если некоторые из точек фокусировки находятся в фокусе.
Документация на моей камере явно неверна (5D Mark IV), потому что возвращенные точки фокусировки имеют justFocus
значение, которое должно быть 0 или 1 в соответствии с документацией, но это не так!
Вместо этого я обнаружил, что justFocus
имеет по крайней мере эти значения:
- 16 = неизвестное состояние фокуса и в данный момент не фокусируется
- 17 = Фокусировка выполнена успешно, фокусировка приостановлена (в режиме однократной съемки). Однако фокусировка все еще находится в режиме "Вкл.", Поэтому вы должны изменить ее на "Выкл.", Используя приведенную ниже команду, в противном случае некоторые операции, такие как масштабирование, не будут работать.
- 18 = Фокус не удался
- 20 = фокусировка выполнена успешно, фокусировка все еще выполняется (в режиме следящего АФ)
Моя тактика состоит в том, чтобы сканировать возвращенные точки фокусировки и искать успешную или неудачную фокусировку. Если найден, я остановлю процесс фокусировки, вызвав:
MainCamera.SendCommand(CameraCommand.DoEvfAf, kEdsCameraCommand_EvfAf_OFF);