【问题标题】:Canon SDK: Download latest picture taken by two devices to hostCanon SDK:下载两台设备拍摄的最新图片到主机
【发布时间】:2013-05-06 12:17:24
【问题描述】:

我正在 Visual Studio 2010 中编写基于 Windows 的应用程序。我的主机 PC 连接到两台 Canon EOS 600D。到目前为止,我管理了两张照片,将其直接(无需 SD 卡)下载到主机 PC 并将图片以特定名称存储在主机上。如果我在循环中执行我的代码,它也可以正常工作(循环的索引指定相机和目标文件)。在下一步中,我使用 OpenMP2.0 来加速循环(这是我使用 OpenMP 的第一个项目)。现在照片是同时拍摄的,但不幸的是,两张照片都由同一个消息循环(相机 0 或相机 1)处理,而不是每个任务的相应消息循环。因此,相机缓冲区中的图片存储在同一个文件中。

如果有人知道如何摆脱这个问题,那就太好了。从我的角度来看,最有利的解决方案是,我告诉消息循环(因为我发现一个就足够了)从哪个线程/相机拍摄了照片。如果我能避免使用 Mutex 也很好,因为这会减慢我的算法。

到目前为止,这是我的事件处理程序,它可以工作,但必须找到 threadNo

EdsError EDSCALLBACK fHandleObjectEvent( EdsObjectEvent event,EdsBaseRef object,EdsVoid * context){
  if(event){fDownloadImage(object,threadNo}
  /// Object must be released
  if(object){EdsRelease(object);}
  return EDS_ERR_OK;
}

还有我的主要功能

int main(int argc, char** argv){
  #pragma omp parallel for
  for(int ii=0;ii<2;ii++){
    fTakePicture(ii);
  }
  return 0;
}

提前致谢。

编辑 1: 我刚刚发现,如果我禁用 Windows 消息循环(引用它),程序会显示以下行为:

第一次执行:拍摄 2 张​​照片

第二次执行:从上一次执行中下载两张图片,拍摄两张新图片

看来,线程号和消息以某种方式存储,并且它在执行中幸存下来并在下一次执行中重新加载(主窗口是否被破坏都无关紧要)。所以我必须把它按正确的顺序排列。

编辑 2: 现在我找到了一个似乎可以正常工作的解决方案。我通过相机机身的序列号解决了这个问题,但由于kEdsPropID_BodyIDEx 功能在版本 2.12 中被禁用,因此我不得不返回佳能 EDSDK 版本 2.11.3。我希望这将有助于其他用户解决类似的任务。

干杯 总而言之

【问题讨论】:

    标签: c++ multithreading openmp windows-messages canon-sdk


    【解决方案1】:

    您应该使用回调的“上下文”参数区分两个摄像头。当您向 EdsSetObjectEventHandler 注册回调时,只需将每个相机的唯一值作为最后一个参数传递。

    【讨论】:

      【解决方案2】:

      我也是一名 C++ 开发人员,目前从事 Canon EDSDK 的工作。我无法下载从我的 EOS 70D 拍摄的照片。 那么你能分享你的完整代码吗?那会很有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        相关资源
        最近更新 更多