【问题标题】:Canon EOS SDK download taken picture directly to a buffer or stream佳能 EOS SDK 将拍摄的图片直接下载到缓冲区或流
【发布时间】:2020-07-12 23:09:47
【问题描述】:

使用该方法在实时取景操作中很容易获取图像

EdsDownloadEvfImage(CameraRef, ImageRef);

这对于执行进一步的图像处理(使用 OpenCV 等)非常方便

同理,我想获取拍照时的图像数据。在文档中,我只能找到一种方法将图像下载到 PC 使用

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

有没有什么方便的方法可以直接将拍摄的图像加载到流或缓冲区中?

【问题讨论】:

    标签: c++ canon-sdk eos


    【解决方案1】:

    没有,但也没有那么难做到。因为获取图片的方式不止一种,所以没有下载实时取景图片那么简单。

    如果要拍完后直接获取图片,请执行以下操作:

    • SaveTo 属性设置为Host 并监听ObjectEvent
    • 一旦事件以DirItemRequestTransfer 的事件类型触发,您可以通过EdsGetDirectoryItemInfo 获得必要的信息
    • 使用EdsCreateMemoryStream 创建内存流
    • 使用您之前得到的EdsDirectoryItemInfo 调用EdsDownload,对于inReadSize,您只需使用所述结构中的size 字段(如果您想使用更小的块和进度事件,请查看文档以获取更多信息) .
    • 下载完成后,请务必致电EdsDownloadComplete,当然要发布所有内容

    如果您不打算下载图像,则必须调用 EdsDownloadCancel 否则相机会将图像保留在缓冲区中,缓冲区也会填满并阻止相机关闭(您必须删除电池强制关闭)。

    如果您要下载保存在相机存储卡上的图像,它会变得有点复杂,因为您首先必须遍历目录结构才能找到所需的图像。我不会详细介绍,您最好阅读文档,但这里是粗略的步骤:

    • 使用EdsGetChildCount 获取相机的卷数,其中inRef 是相机
    • 使用EdsGetChildAtIndex(再次使用相机拍摄inRef)和EdsGetVolumeInfo 循环遍历卷
    • 然后基本上一遍又一遍地做同样的事情,但使用EdsGetDirectoryItemInfo而不是EdsGetVolumeInfo。对于带有EdsGetChildCountEdsGetChildAtIndexinRef,您可以使用卷引用或目录项引用(如果它是文件夹)(检查EdsDirectoryItemInfo 结构的isFolder 字段)。
    • 要像以前一样下载文件,请使用EdsDownloadEdsCreateMemoryStream

    【讨论】:

    • 谢谢。完美运行。 eventHandler 有一些问题,但将 cameraRef 作为上下文传递并完美运行。此外,需要设置足够的容量,否则会拒绝下载到 PC 并说明它已满。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多