我正在 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张新图片
所以看起来,线程号和消息以某种方式存储,并且它在执行中幸存下来并在下一次执行时重新加载(主窗口是否被销毁无关紧要)。所以我必须按正确的顺序排列。
编辑 2: 现在我找到了一个似乎可以正常工作的解决方案。我通过相机机身的序列号解决了这个问题,但由于 kEdsPropID_BodyIDEx
功能在 2.12 版中被禁用,因此我不得不返回 Canon EDSDK 2.11.3 版。我希望这会帮助其他用户解决类似的任务。
干杯 TL
最佳答案
您应该使用回调的“上下文”参数来区分这两个摄像头。当您使用 EdsSetObjectEventHandler 注册回调时,只需将每个摄像头的唯一值作为最后一个参数传递。
关于c++ - 佳能 SDK : Download latest picture taken by two devices to host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16398603/