# Development-of-Canoncamera **Repository Path**: linsnchen/Development-of-Canoncamera ## Basic Information - **Project Name**: Development-of-Canoncamera - **Description**: Canon edsdk - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-10-27 - **Last Updated**: 2023-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Development-of-Canon-camera 佳能相机的二次开发 C++版本
[English](/ReadMe-EN.md ) | 简体中文 ## 目录 + [文件夹说明](#文件夹说明) + [CanonCamera](#CanonCamera) + [代码解析](#代码解析) + [相机控制代码](#相机控制代码) + [相机参数回调显示](#相机参数回调显示) + [调用过程解析](#调用过程解析) + [拍照和下载图像](#拍照和下载图像) + [获取属性变化](#获取属性变化) + [如何使用](#如何使用) + [回调函数](#回调函数) + [相机连接](#相机连接) + [相机设置](#相机设置) ## 文件夹说明 - Camra: 涉及到相机操作控制 - Class:相机动作,线程,线程控制 - Command:相机命令 - Event:事件通知,观察者 - EDSDK:相机原始SDK ## CanonCamera CanonCamera类是用户使用的佳能相机控制接口代码
### 代码解析 #### 相机控制代码 ```C++ //设置订阅者和被订阅者 void Canon_setupListener(ActionListener* listener); void Canon_setupObserver(Observable* ob); //连接 bool Canon_ListCamerasAndConnect(void); bool Canon_DisConnect(void); //EVF bool Canon_StartEVF(void); bool Canon_EndEVF(void); //缩放 bool Canon_ZoomFit(void); bool Canon_ZoomZoom(void); //拍照 bool Canon_TakeAnImage(void); //对焦 bool Canon_Focus_Near(int value); bool Canon_Focus_Far(int value); bool Canon_Focus_Direction(int value); //快门 bool Canon_SetTv(int sel); //光圈 bool Canon_SetAv(int sel); //感光度 bool Canon_SetIso(int sel); //AE bool Canon_SetAEMode(int sel); //测光模式 bool Canon_SetAMeteringMode(int sel); //曝光补偿 bool Canon_SetExposureComp(int sel); //输出图像格式 bool Canon_SetImageQuality(int sel); //输出图像格式 bool Canon_SetEvfAFMode(int sel); ``` #### 相机参数回调显示 ```C++ //设置回调函数 bool Canon_SetDownloadEvfCallback(IMAGEDATACALLBACK imgdata,LPARAM lParam); //预览的数据 void Canon_SetDownLoadCallback(DOWNLOADPROGRESSCALLBACK downloadstate,LPARAM lParam); //下载图像的进度 bool Canon_SetTvCallback(TVCALLBACK tvstate,LPARAM lParam); //TV值 bool Canon_SetAvCallback(AVCALLBACK avstate,LPARAM lParam); //AV值 bool Canon_SetIsoCallback(ISOCALLBACK isostate,LPARAM lParam); //ISO值 bool Canon_SetAEModeCallback(AECALLBACK aestate,LPARAM lParam); //AE模式 bool Canon_SetMeteringModeCallback(METERINGMODECALLBACK meteringmodestate,LPARAM lParam);//测光模式 bool Canon_SetExposureCompCallback(EXPOSURECOMPCALLBACK exposurecompstate,LPARAM lParam);//曝光补偿 bool Canon_SetImageQualityCallback(IMGQUALITYCALLBACK imgqualitystate,LPARAM lParam); //图像质量 bool Canon_SetEvfAFModeCallback(EVFAFMODECALLBACK evfafmodestate,LPARAM lParam); //EVF AF模式 ``` ### 调用过程解析 #### 拍照和下载图像 ```C++ //1.定义对象 ActionSource _TakePicture; //2.添加订阅者,命令字符 _TakePicture.addActionListener(listener); _TakePicture.setActionCommand("TakePicture"); //3.执行命令 _TakePicture.fireEvent(); actionPerformed(event);//对比命令字符 StoreAsync(new TakePictureCommand(_model));//创建对应任务 _processor.enqueue( command );//添加到任务队列 command->execute();//在线程中执行命令TakePictureCommand::execute() //4.下载图像 //设置SDK对象事件回调 err = EdsSetPropertyEventHandler( camera, kEdsObjectEvent_All, CameraEventListener::handleObjectEvent , (EdsVoid *)_controller); //下载 case kEdsObjectEvent_DirItemRequestTransfer: fireEvent(controller, "download", inRef); ``` #### 获取属性变化 ```C++ //1.设置SDK属性事件回调 err = EdsSetPropertyEventHandler( camera, kEdsPropertyEvent_All, CameraEventListener::handlePropertyEvent , (EdsVoid *)_controller); //2.将属性添加到观察者 ob->addObserver(static_cast(&_Tv)); //3.当相机属性改变时,会触发SDK属性事件回调,通知PC属性改变 switch(inEvent) { case kEdsPropertyEvent_PropertyChanged: fireEvent(controller, "get_Property", &inPropertyID); break; case kEdsPropertyEvent_PropertyDescChanged: fireEvent(controller, "get_PropertyDesc", &inPropertyID); break; } ``` ## 如何使用 ```C++ CanonCamera canoncam;//定义CanonCamera对象 ``` ### 回调函数 ```C++ //设置回调函数的目的是,当相机参数或状态改变时,相机将通知PC端,同步参数或状态 //这里以曝光时间,预览和下载为例 void xxxDlg::ShowTvState(EdsPropertyDesc TvDesc,EdsUInt32 Tv,LPARAM lParam) { xxxDlg *pDlg =(xxxDlg *)lParam; pDlg->m_Tv.ResetContent(); for(int i = 0; i < TvDesc.numElements; i++) { std::map::iterator itr = canoncam._TvDesc.find((EdsUInt32)TvDesc.propDesc[i]); if (itr != canoncam._TvDesc.end()) { int index = pDlg->m_Tv.InsertString(-1, itr->second); pDlg->m_Tv.SetItemData(index, itr->first); } } std::map::iterator itr = canoncam._TvDesc.find(Tv); if (itr != canoncam._TvDesc.end()) { pDlg->m_Tv.SetWindowText(itr->second); } } void xxxDlg::ShowEvf(CComPtr stream, LPARAM lParam) { xxxDlg *pDlg =(xxxDlg *)lParam; if (!pDlg->m_Image.IsNull())pDlg->image.Destroy(); pDlg->m_Image.Load(stream); if (pDlg->m_Image.IsNull())return; int cx, cy; cx = pDlg->m_Image.GetWidth(); cy = pDlg->m_Image.GetHeight(); CWnd *pWnd = NULL; CRect winrect,imgrect;//显示图像的区域 pWnd= pDlg->GetDlgItem(IDC_STATIC_IMG);//获取控件句柄 pWnd->GetClientRect(&winrect); // imgrect.left=0; imgrect.top=0; imgrect.right=cx-imgrect.left; imgrect.bottom=cy-imgrect.top; //显示相机预览画面 CDC *pDc = NULL; pDc = pWnd->GetDC(); int ModeOld=SetStretchBltMode(pDc->m_hDC,STRETCH_HALFTONE); pDlg->m_Image.StretchBlt(pDc->m_hDC,winrect,imgrect,SRCCOPY); SetStretchBltMode(pDc->m_hDC,ModeOld); pWnd->ReleaseDC(pDc); } void xxxDlg::ShowDownloadState(EdsUInt32 percent,int state,LPARAM lParam) { //percent是拍摄进度,可用作进度条参数 xxxDlg *pDlg =(xxxDlg *)lParam; if (state==SATRTDOWN) { //开始拍照 } else if (state==ENDDOWN) { //拍摄激结束 } else if (state==DOWNING) { //拍摄中 } else { //拍摄失败 } } ``` ### 相机连接 ```C++ if (!canoncam.Canon_GetCameraConnectedState()) { if(canoncam.Canon_ListCamerasAndConnect()) { canoncam.Canon_SetTvCallback(ShowTvState,LPARAM(this)); canoncam.Canon_SetAvCallback(ShowAvState,LPARAM(this)); canoncam.Canon_SetIsoCallback(ShowIsoState,LPARAM(this)); canoncam.Canon_SetDownloadEvfCallback(ShowEvf,(LPARAM)this); canoncam.Canon_SetDownLoadCallback(ShowDownloadState,(LPARAM)this); } else { //连接失败 canoncam.Canon_DisConnect(); } } else { //断开连接 canoncam.Canon_DisConnect(); } ``` ### 相机设置 ```C++ //相机设置这个部分非常简单 //拍摄 if(canoncam.Canon_GetCameraConnectedState()) { canoncam.Canon_TakeAnImage(); } //设置曝光时间TV DWORD_PTR data = m_Tv.GetItemData(m_Tv.GetCurSel()); canoncam.Canon_SetTv(data); ```