我是c ++编程的初学者,我开始使用Canon EDSDK 2.12远程控制EOS 600D数码单反相机。我使用代码here来更好地了解如何访问相机并拍摄单张图片并且工作正常但现在我不知道如何继续我的程序,因为我无法找出可能性带有编程参考的SDK。
是否可以使用自定义名称拍摄保存在camaeras SD上的照片?
如果不是
如何创建事件处理程序?我希望每次拍摄照片时都会得到一个由SD上的图像路径(文件夹和图像名称作为唯一ID)组成的字符串,并使用它执行其他任务。
我希望这有助于理解我想要做的事情。
答案 0 :(得分:0)
SDK文档中对此进行了描述,对您来说可能有点晚,但可能对其他人有所帮助。
要创建一个事件处理程序,您需要在获得摄像头参考并打开会话后的某些时间执行以下操作:
Err = EdsSetObjectEventHandler( Camera, kEdsObjectEvent_All, HandleAllObjectEvents, NULL);
为了响应对象事件的Canon SDK回调(即在HandleAllObjectEvents函数中),您可以执行以下操作:
switch ( inEvent ) {
case kEdsObjectEvent_DirItemCreated:
// new file created on camera card
EdsDirectoryItemRef fileNameRef;
EdsDirectoryItemRef folderNameRef;
EdsDirectoryItemInfo fileNameInfo;
EdsDirectoryItemInfo folderNameInfo;
fileNameRef = (EdsDirectoryItemRef)inObject;
EdsGetDirectoryItemInfo( fileNameRef, &fileNameInfo ); // got the file name and some other info
EdsGetParent( fileNameRef, &folderNameRef );
EdsGetDirectoryItemInfo( folderNameRef, &folderNameInfo ); // got the folder name
char fname[100];
strcpy( fname, folderNameInfo.szFileName );
strcat( fname, "\\" );
strcat( fname, fileNameInfo.szFileName );
如您所知,如果要拍摄大量照片,获取文件夹名称非常重要,因为文件名从IMG_9999.jpg翻到IMG_0000.jpg,文件放入新文件夹(例如从100CANON到101CANON。仅使用文件名并不能保证唯一的名称。
答案 1 :(得分:-1)
我可以想到几个解决方案。
Windows有一个API(FindFirstChangeNotification
and FindNextChangeNotificaton
),可以让您检测目录中的更改。只需使用相机在计算机上显示的“驱动器”,因为“这里是我想要查看通知的地方”。我从来没有在Mac上编程,但似乎有一些名为FSEvents的东西会做类似的事情。
您可以依靠相机以一致的名称存储图像。应用程序启动时,找到驱动器中作为摄像机存储的最后一个文件。然后只需将其编号为“IMG_0991.JPG”[如果使用RAW模式,将“JPG”替换为“CR2”]将变为“IMG_0992.JPG”。这种方法每次都有效。当您拍摄了10000张图像时,它最终会转换为“IMG_0001.JPG”(它可能会移动到名为“DCIM / 101CANON”的新目录,而不是“DCIM / 100CANON”)。
扫描目录并保留所有文件的列表。然后再扫描一遍。如果有很多图像,这可能需要一些时间。