我正在Visual Studio 2010中编写基于Windows的应用程序。我的主机PC连接到两台Canon EOS 600D。到目前为止,我管理了两张照片,直接下载(没有SD卡)到主机PC,并在主机上以特定名称存储图片。如果我在循环中执行我的代码,它也可以正常工作(循环的索引指定相机和目标文件)。在下一步中,我使用OpenMP2.0来加速循环(这是我的第一个使用OpenMP的项目)。现在同时拍摄照片,但不幸的是,两张照片都是由相同的消息循环(摄像机0或摄像机1)处理,而不是每个任务的相应消息循环。因此,来自相机缓冲区的图像存储在同一文件中。
如果有人知道如何摆脱这个问题,那就太好了。从我的观点来看,最有利的解决方案是,我告诉消息循环(因为我发现一个就足够了)从哪个线程/相机拍摄照片。如果我可以避免使用互斥锁也会很好,因为这会降低我的算法速度。
到目前为止,这是我的事件处理程序,它可以工作,但必须找到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:现在我找到了一个似乎正常运行的解决方案。我通过相机机身的序列号解决了这个问题,但因为版本2.12中禁用了功能kEdsPropID_BodyIDEx
,所以我不得不回到Canon EDSDK版本2.11.3。我希望这可以帮助其他用户解决类似的任务。
干杯 TL
答案 0 :(得分:0)
您应该使用回调的'context'参数来区分这两个摄像头。当您使用EdsSetObjectEventHandler注册回调时,只需将每个摄像机的唯一值作为最后一个参数传递。
答案 1 :(得分:-1)
我也是C ++开发人员,目前正在使用Canon EDSDK。我无法下载从EOS 70D拍摄的照片。 因此,您能否分享完整的代码?那会很有帮助!