Canon EOS SDK загружает сделанное изображение прямо в буфер или поток - PullRequest
0 голосов
/ 13 июля 2020

Достаточно легко получить изображение во время операции просмотра в реальном времени, используя метод

EdsDownloadEvfImage(CameraRef, ImageRef);

Это очень удобно для дальнейшей обработки изображения (с OpenCV et c)

Таким же образом я хотел бы получить данные изображения при фотографировании. В документации я мог найти только способ загрузки изображения в P C, используя

EdsError EdsDownload(EdsDirectoryItemRef inDirItemRef, EdsUInt64 inReadSize, EdsStreamRef OutStreamRef)

Есть ли удобный способ загрузить снятое изображение напрямую в поток или буфер?

1 Ответ

1 голос
/ 13 июля 2020

Нет, но сделать это тоже не так уж и сложно. Поскольку существует несколько способов получения изображения, это не может быть так просто, как загрузка изображения в режиме реального времени.

Если вы хотите получить изображение сразу после его съемки, выполните следующие действия:

  • Установите для свойства SaveTo значение Host и прослушайте ObjectEvent.
  • Как только событие сработает с типом события DirItemRequestTransfer, вы можете получить необходимую информацию с помощью EdsGetDirectoryItemInfo
  • Создайте поток памяти с помощью EdsCreateMemoryStream
  • Вызов EdsDownload с помощью EdsDirectoryItemInfo, который вы получили ранее, а для inReadSize вы просто используете поле size из указанного struct (если вы хотите использовать более мелкие фрагменты и события выполнения, проверьте документацию для получения дополнительной информации).
  • После завершения загрузки обязательно вызовите EdsDownloadComplete и, конечно, отпустите все

Если вы не собираетесь загружать изображение, вы должны позвонить по номеру EdsDownloadCancel, иначе камера сохранит изображение в буфере, который заполнится и заблокирует выключение камеры (вам придется удалить аккумулятор, чтобы выключить его).

Если вы Если вы хотите загрузить изображение, сохраненное на карте памяти камеры, это становится немного сложнее, потому что вам сначала нужно пройти по структуре каталогов, чтобы найти нужное изображение. Я не буду go вдаваться в подробности, и вам лучше прочитать документацию по этому поводу, но вот приблизительные шаги:

  • Получите количество томов камеры с помощью EdsGetChildCount где inRef это камера
  • L oop через тома с EdsGetChildAtIndex (снова используя камеру для inRef) и EdsGetVolumeInfo
  • Затем в основном делайте одно и то же снова и снова но используйте EdsGetDirectoryItemInfo вместо EdsGetVolumeInfo. Для inRef с EdsGetChildCount и EdsGetChildAtIndex вы используете либо ссылку на том, либо ссылку на элемент каталога, если это папка (проверьте поле isFolder структуры EdsDirectoryItemInfo).
  • Для загрузки файл, который вы делаете так же, как и раньше, используйте EdsDownload и EdsCreateMemoryStream
...