QT使用canon sdk拍照并保存到本机的方法示例

 更新时间:2020年10月27日 12:52  点击:2050

一、概述

通过 usb 连接 canon 单反,通过 QT 拍照,并将拍到的图像保存到本机。

二、操作步骤

1. 初始化 SDK

EdsInitializeSDK();

2. 获取相机列表对象

  EdsCameraListRef cameraList = NULL;
  error = EdsGetCameraList(&cameraList);

3. 获取相机列表对象数量

  // 遍历相机列表对象,获取相机列表对象数量
  EdsUInt32 cameraCount = 0;
  error = EdsGetChildCount(cameraList, &cameraCount);
  if (error != EDS_ERR_OK)
  {
    qDebug() << "ERROR - failed to get camera count";
    EdsRelease(cameraList);
    return;
  }

4. 获取单个相机对象实例

  for (uint32_t idx = 0; idx < cameraCount; idx++)
  {
    // 获取单个相机对象
    EdsCameraRef cam = NULL;
    error = EdsGetChildAtIndex(cameraList, idx, &cam);
    m_camera = cam;
  }

之后我们对相机的操作主要就是通过这个。

5. 建立相机会话

EdsOpenSession(m_camera);

6. 将图片保存到本机

  EdsUInt32 saveTo = kEdsSaveTo_Both;    // 保存到相机和本机
  //EdsUInt32 saveTo = kEdsSaveTo_Host;  // 保存到本机
  error = EdsSetPropertyData(m_camera, kEdsPropID_SaveTo, 0, sizeof(saveTo), &saveTo);

7. 在本机设置足够大的容量存放图片

  EdsCapacity capacity = {0x7FFFFFFF, 0x1000, 1};
  error = EdsSetCapacity(m_camera, capacity);

8. 注册对象事件的句柄

error = EdsSetObjectEventHandler(m_camera, kEdsObjectEvent_All, objectEventHandler, this);

但相机对象发生改变将触发 objectEventHandler 回调函数

9. objectEventHandler 回调函数

EdsError EDSCALLBACK MainWindow::objectEventHandler(EdsUInt32 inEvent, EdsBaseRef inRef, EdsVoid* inContext)
{
  EdsStreamRef stream = NULL;
  EdsDirectoryItemInfo dirItemInfo;
  QString m("C:/Users/Administrator/Desktop/");
  switch (inEvent)
  {
   // 通知对象(如新文件夹或文件)的创建
   case kEdsObjectEvent_DirItemCreated:
      qDebug() << "Directory Item Created";
      break;
   // 通知相机上有物体要转移到计算机上。
   case kEdsObjectEvent_DirItemRequestTransfer:
      qDebug() << "Directory Item Requested Transfer";
      err = EdsGetDirectoryItemInfo(inRef, &dirItemInfo);
      m = m + dirItemInfo.szFileName;  // 拼接本地图片保存位置
      // 下载图片到本机
      err = EdsCreateFileStream(m.toStdString().data(), kEdsFileCreateDisposition_CreateAlways, kEdsAccess_ReadWrite, &stream);
      if (err != EDS_ERR_OK)
      {
       qDebug("failed to create file stream");
      }
      err = EdsDownload(inRef, dirItemInfo.size, stream);
      if (err != EDS_ERR_OK)
      {
       qDebug("failed to download");
      }
      err = EdsDownloadComplete(inRef);
      if (err != EDS_ERR_OK)
      {
        qDebug("failed to mark download as complete");
      }
      EdsRelease(stream);
      stream = NULL;
      break;
    default:
        qDebug() << "未知事件";
        break;
    }
   return EDS_ERR_OK;
}

10. 发送拍照命令

error = EdsSendCommand(m_camera, kEdsCameraCommand_TakePicture, 0);

11. 关闭相机会话

EdsCloseSession(m_camera); // 关闭相机会话

12. 结束 SDK

EdsTerminateSDK(); // 结束 sdk

三、参考资料

Canon EDSDK Tutorial in C#
EDSDK-cpp
Cinder-EDSDK

到此这篇关于QT使用canon sdk拍照并保存到本机的方法示例的文章就介绍到这了,更多相关QT canon sdk拍照 内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Qt 使用Poppler实现pdf阅读器的示例代码

    下面小编就为大家分享一篇Qt 使用Poppler实现pdf阅读器的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
  • 将matplotlib绘图嵌入pyqt的方法示例

    这篇文章主要介绍了将matplotlib绘图嵌入pyqt的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-27
  • Qt定时器和随机数详解

    在前一篇中我们介绍了键盘和鼠标事件,其实还有一个非常常用的事件,就是定时器事件,如果要对程序实现时间上的控制,那么就要使用到定时器。而随机数也是很常用的一个功能,在我们要想产生一个随机的结果时就要使用到随机数。本文我们就来简单介绍一下定时器和随机数。...2020-04-25
  • C#调用摄像头实现拍照功能的示例代码

    这篇文章主要介绍了C#调用摄像头实现拍照功能的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • 一篇文章教你3分钟如何发布Qt程序

    这篇文章主要给大家介绍了关于教你3分钟如何发布Qt程序的相关资料,文中通过实例代码结束的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-08-24
  • 微信jssdk在iframe页面失效问题的解决措施

    这篇文章主要介绍了微信jssdk在iframe页面失效问题的解决措施 的相关资料,需要的朋友可以参考下...2016-03-07
  • Qt实现闹钟小程序

    这篇文章主要为大家详细介绍了Qt实现闹钟小程序,利用Qt的designer设计需要的闹钟界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Qt使用windeployqt工具实现程序打包发布方法

    本文主要介绍了Qt使用windeployqt工具实现程序打包发布方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-11-01
  • 浅谈Qt信号与槽的各种连接方式

    信号和槽是Qt特有的信息传输机制,本文主要介绍了浅谈Qt信号与槽的各种连接方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • PyQt QMainWindow的使用示例

    这篇文章主要介绍了PyQt QMainWindow的使用示例,帮助大家更好的理解和学习使用pyqt,感兴趣的朋友可以了解下...2021-03-20
  • Qt实现UDP多线程数据处理及发送的简单实例

    本文主要介绍了Qt实现UDP多线程数据处理及发送的简单实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-21
  • Qt自定义控件实现线条型加载条

    这篇文章主要为大家详细介绍了Qt自定义控件实现线条型加载条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Qt自定义控件实现圆圈加载进度条

    这篇文章主要为大家详细介绍了Qt自定义控件实现圆圈加载进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Qt实现Flappy Bird游戏

    这篇文章主要为大家详细介绍了Qt实现Flappy Bird游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • Qt使用QPainter绘制3D立方体

    这篇文章主要为大家详细介绍了Qt使用QPainter绘制3D立方体,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-21
  • C# SDK实现百度云OCR的文字识别功能

    这篇文章主要为大家详细介绍了C# SDK实现百度云OCR的文字识别功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Qt实现进程界面之间的鼠标焦点切换

    这篇文章主要为大家详细介绍了Qt实现进程界面之间的鼠标焦点切换,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-09-25
  • QT开发应用程序的欢迎界面实例

    下面小编就为大家带来一篇QT开发应用程序的欢迎界面实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
  • Qt实现网络聊天室的示例代码

    本文主要介绍了Qt实现网络聊天室,实现一个在线聊天室, 使用tcp对客户端和服务器端进行通讯。具有一定的参考价值,具有一定的参考价值,...2021-06-23
  • QT串口通信的实现方法

    如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。本文介绍了QT串口通信的实现方法,感兴趣的小伙伴们可以参考一下...2021-05-20