网站建设与开发定制,沈阳营销型网站制作技术,wordpress xmlrpc攻击,能自己做的ppt网站文章目录 引言正文相关开发库的介绍编程准备配置引用头文件GalaxyIncludes.h配置lib文件 具体编程过程初始化和反初始化枚举设备开关设备 属性控制属性控制器种类 图像采集控制和图像处理采单帧回调采集图像处理流对象属性控制 获取设备事件获取掉线事件通知 样例程序分析补充项目中常用库函数CINI库 总结 引言
在做老师的横向项目时需要用大恒相机需要将他的相机控制接入写的程序中但是对于他的SDK并不了解所以就好好看了他的SDK文件并按照他的开发手册写了一个小的demo。
正文
相关开发库的介绍
在使用别人的代码过程中有很多库自己都看不懂这里做一下记录GxIAPICPPEx.dll封装过后的通用并且统一的编程接口IGXFactory初始化接口库枚举设备打开设备IGXDevice设备对象以此对象为入口进行属性控制、图像采集获取相机事件等。IGXStream流对象从IGXDevice获得专门负责图像采集相关职能。IGXFeatureControl属性控制对象分别从IGXDevice和IGXStream获得属性控制对象IImageData回调采集和采单帧的图像结构体包括采集输出结果图像buffer和图像信息等还自带图像格式转换、图像增强的功能GXBitmap负责图像的显示和存储功能具体见示例程序 编程准备
首先需要下载安装对应设备的SDK文件具体链接相关SDK软件下载这里是结合VS 2022进行打开如何配置库如何指定相关的头文件。在编程之前需要配置好指定的项目文件 配置好所需要引用的头文件Galaxyincludes.h头文件设置需要引用的库文件GxlAPICPPEx.lib库文件
配置引用头文件GalaxyIncludes.h
这里安装了SDK的话需要指定你所运行的项目的配置文件这里有两种写法正常来说应该把对应的SDK复制在项目所在的文件里这样项目的可移植性就比较强。但是我这里已经在工控机上进行 配置了就直接写了绝对路径。
配置lib文件 这里必须配置GxIAPICPPEx.lib静态库文件这个库是大恒相机对外编程的统一接口。接受一个新的项目文件一般来说配置文件里面有但是属性里面没有配置踩过坑之后发现需要重新配置。 找到GxlAPICPPEx.lib的路径 设置相关的配置文件 指定对应目录下方的静态库 具体编程过程
当前章节主要是涉及到如何调用相关的开发库对相机进行初始化并对相机进行控制同时保存对应的图片。具体操作如下 初始化获取相关的资源 反初始化释放所有的资源枚举设备获取所有资源开关设备
初始化和反初始化
在调用GxlAPICPPEx.lib之前相机必须要进行初始化初始化是通过IGXFactory进行初始化的。
#include iostream
#include IGXFactory.h
#include GalaxyException.husing namespace std;int main()
{try {// 初始化相机实例IGXFactory::GetInstance().Init();}catch (CGalaxyExceptione) {cout error code e.GetErrorCode() endl;cout error description e.what() endl;}std::cout Hello World!\n;
}在初始化中遇到CGalaxyException找不到标识符的问题解决办法如下在vs中找到异常会跳转到GXSmartPtr.h头文件中添加#include “GalaxyException.h”具体如下 加上这句之后后续就没有运行问题了运行截图如下 在调用相机的进程退出之后必须要进行反初始化释放GxlAPICPPEx库函数调用的所有资源。
// DahengCameraStart.cpp : 此文件包含 main 函数。程序执行将在此处开始并结束。
// 基础应用#include iostream
#include IGXFactory.h
#include GalaxyException.husing namespace std;int main()
{try {// 初始化相机实例IGXFactory::GetInstance().Init();// 相机的反初始化释放所有占有的资源IGXFactory::GetInstance().Uninit();}catch (CGalaxyExceptione) {cout error code e.GetErrorCode() endl;cout error description e.what() endl;}std::cout Hello World!\n;
}枚举设备
用户通过枚举设备来获取当前计算机中可以使用的设备并进行相关的调用用户通过调用 IGXFactory::GetInstance().UpdateDeviceList 枚举当前所有可用设备获取一个设备信息列表列表类型为 GxIAPICPP::gxdeviceinfo_vector。具体代码如下
int main()
{try {// 初始化相机实例IGXFactory::GetInstance().Init();// 使用GxIAPICPP列表类保存相关的信息GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;// 第一个参数是扫描的时长第二个参数是将获取的信息保存到对应的列表中IGXFactory::GetInstance().UpdateDeviceList(10000,vectorDeviceInfo);cout the camera num: vectorDeviceInfo.size() endl;for (int i 0; i vectorDeviceInfo.size(); i) {cout vectorDeviceInfo[i].GetVendorName() endl;cout vectorDeviceInfo[i].GetModelName() endl;}// 相机的反初始化释放所有占有的资源IGXFactory::GetInstance().Uninit();}catch (CGalaxyExceptione) {cout error code e.GetErrorCode() endl;cout error description e.what() endl;}std::cout Hello World!\n;
}开关设备
控制设备关闭或者打开由于这里使用的是ME2P-1230-23U3M/C相机是通过USB3.0接口进行控制并不是千兆网相机所以MAC地址和IP地址都是空的 控制相机关闭打开总共有四种方式 SN 为设备序列号。 UserID 为用户自定义名称不支持 UserID 的设备此项为空字符串。 MAC 为设备 MAC 地址非千兆网相机此项为空字符串。 IP 为设备 IP 地址非千兆网相机此项为空字符串。 打开对应函数的对应函数接口是 IGXFactory::GetInstance().OpenDeviceBySNIGXFactory::GetInstance().OpenDeviceByUserIDIGXFactory::GetInstance().OpenDeviceByMACIGXFactory::GetInstance().OpenDeviceByIP 关闭对应相机的函数如下
//关闭设备之后不允许再调用 IDevice 以及设备的 IFeatureControl、IStream 的所有接口
objDevicePtr-Close();最终的代码我手上还没有相机老师就给我代码让我先看一下这里参考的是官方的参考手册代码
GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
if (vectorDeviceInfo.size() 0)
{
//打开链表中的第一个设备
CGXDevicePointerobjDevicePtr;
GxIAPICPP::gxstringstrSN vectorDeviceInfo[0].GetSN();
GxIAPICPP::gxstringstrUserID vectorDeviceInfo[0].GetUserID();
GxIAPICPP::gxstringstrMAC vectorDeviceInfo[0].GetMAC();
GxIAPICPP::gxstringstrIP vectorDeviceInfo[0].GetIP();
//用户也可以直接指定打开的设备信息下面代码中使用的信息为伪造信息用户以实际设备为准
//GxIAPICPP::gxstring strSN GA0140100002;
//GxIAPICPP::gxstring strUserID MyUserName;
//GxIAPICPP::gxstring strMAC A1-0B-32-7C-6F-81;
//GxIAPICPP::gxstring strIP 192.168.0.100;
objDevicePtr IGXFactory::GetInstance().OpenDeviceBySN(strSN, GX_ACCESS_EXCLUSIVE);
//objDevicePtr IGXFactory::GetInstance().OpenDeviceByUserID(strUserID,
//GX_ACCESS_EXCLUSIVE);
//objDevicePtr IGXFactory::GetInstance().OpenDeviceByMAC(strMAC,
//GX_ACCESS_EXCLUSIVE);
//objDevicePtr IGXFactory::GetInstance().OpenDeviceByIP(strIP,
//GX_ACCESS_EXCLUSIVE);
}属性控制
这部分东西比较琐碎并且不是重点就简单写一下
属性控制器种类
主要是通过IGXFeatureControl进行属性控制分别是有两类控制对象分别是设备Device和流Stream IGXFeatureControl IGXDevice::GetRemoteFeatureControl //包含主要设备信息,比如宽高、曝光增益等,一般用户主要使用此属性控制器即可。 IGXFeatureControl IGXDevice::GetFeatureControl //包含一些本地属性,不同类型的设备具备的功能也不一样。 IGXFeatureControl IGXStream::GetFeatureControl //流对象属性控制器,关于采集控制和采集数据统计的属性访问控制器。
图像采集控制和图像处理
所有和图像采集和控制的相关接口都在CGXStreamPointer指定的对象上获取和打开流对象的方法是通过这个流对象来获得但是这个流对象是通过设备对象获得设备对象打开之后返回的就是流对象具体如下更详细的在上一节
objDevicePtr IGXFactory::GetInstance().OpenDeviceBySN(strSN, GX_ACCESS_EXCLUSIVE);基本操作是枚举并获取对应的设备然后获取设备对应的流然后打开流才能进行图片采集。
获取设备之后需要打开设备对象的流OpenStream具体代码如下
uint32_t_t nStreamNum objDevicePtr-GetStreamCount();
if (nStreamNum 0)
{
CGXStreamPointer objStreamPtr objDevicePtr-OpenStream(0);
//流对象控制或者采集
//当用户不使用流对象的时候,需要将其关闭
objStreamPtr-Close();
}采单帧
用户开启流对象采集并且给设备发送采集命令就而可以调用GetImage接口采集单帧具体流程如下 打开流通道发送采集命令开始采集采单帧获取图片并进行处理停采关闭流通道 注意不适用高清相机的快速采集
// 打开对应设备对应的流
CGXStreamPointer objStreamPtr objDevicePtr-OpenStream();// 开启流通道的采集命令
objStreamPtr-StartGrab();//给设备发送采集命令进行开采
CGXFeatureControlPointer objFeatureControlPtr objDevicePtr-GetRemoteFeatureControl();
objFeatureControlPtr -GetCommandFeature(AcquisitionStart)-Execute();//采单帧
CImageDataPointer objImageDataPtr;objImageDataPtr objStreamPtr-GetImage(500);//超时时间使用 500ms,用户可以自行设定
if (objImageDataPtr-GetStatus() GX_FRAME_STATUS_SUCCESS)
{
//采图成功而且是完整帧,可以进行图像处理 ...
}
//停采
objFeatureControlPtr-GetCommandFeature(AcquisitionStop)-Execute();
objStreamPtr-StopGrab();
//关闭流通道
objStreamPtr-Close();
回调采集
回调采集当图片已经可以获取或者当目标已经就位的时候会自动调用一个函数来处理存储对应的图片。很符合我们的应用场景。在大恒摄像中的回调处理虚基类是ICaptureEventHandler,如果要实现对应的回调采集需要继承并实现虚基类
class CSampleCaptureEventHandler : public ICaptureEventHandler
{public:void DoOnImageCaptured(CImageDataPointer objImageDataPointer, void* pUserParam){if (objImageDataPointer-GetStatus() GX_FRAME_STATUS_SUCCESS){//图像获取为完整帧,可以读取图像宽、高、数据格式等uint64_t nWidth objImageDataPointer-GetWidth();uint64_t nHeight objImageDataPointer-GetHeight();GX_PIXEL_FORMAT_ENTRY emPixelFormat objImageDataPointer-GetPixelFormat();//其他图像信息的获取参见 IImageData 接口定义}}
};定义完自己的回调处理程序之后需要将对应的函数注册到回调采集函数中
// 打开设备的输入流
CGXStreamPointer objStreamPtr objDevicePtr-OpenStream(0);//注册采集回调函数,注意第一个参数是用户私有参数,用户可以传入任何 object 对象,也可以是 null
//用户私有参数在回调函数内部还原使用,如果不使用私有参数,可以传入 null
// 创建一个自己定义的回调函数的实例对象
ICaptureEventHandler* pCaptureEventHandler new CSampleCaptureEventHandler();
// 将对应的实例采集对象注册到回调采集函数中
objStreamPtr-RegisterCaptureCallback(pCaptureEventHandler,NULL);//开启流通道采集
objStreamPtr-StartGrab();
//给设备发送开采命令
CGXFeatureControlPointer objFeatureControlPtr
objDevicePtr-GetRemoteFeatureControl();
objFeatureControlPtr-GetCommandFeature(AcquisitionStart)-Execute();
//回调采集过程,参见回调函数//停采、注销采集回调函数
objFeatureControlPtr-GetCommandFeature(AcquisitionStop)-Execute();
objStreamPtr-StopGrab();
objStreamPtr-UnregisterCaptureCallback();
delete pCaptureEventHandler;
pCaptureEventHandler NULL;
//关闭流通道
objStreamPtr-Close();
图像处理 在大恒相机的图片处理中可以实现如下功能 图像格式转换将任何数据转成指定获取的8位有效数字或者是RGB的24位图像效果增强可以实现对图片的坏点矫正、锐化、对比度、亮度等图像效果增强的操作 具体的实现方式有两种 设置调试的配置文件然后直接进行调试
//通过设备对象构建图像处理配置对象
CImageProcessConfigPointer objImageProcessConfigPtr objDevicePtr-CreateImageProcessConfig();
//objImageDataPtr 可以是采集回调函数传入的还可以是 GetImage 获取的
void*pRGB24Processed NULL;
//返回结果就是经过图像效果增强之后的 RGB24 格式的数据
pRGB24Processed objIBaseDataImageProcess(objImageProcessConfigPtr);调用语句进行微调
//通过设备对象构建图像处理配置对象
CImageProcessConfigPointer objImageProcessConfigPtr
objDevicePtr-CreateImageProcessConfig();
//objImageProcessConfigPtr 对象在构建的时候会初始化默认配置参数,用户可以选择对配置
//参数进行微调,如下:
objImageProcessConfigPtr-SetValidBit(GX_BIT_0_7);
//选择有效数据位 0~7
objImageProcessConfigPtr-EnableDefectivePixelCorrect(true);//使能坏点校正功能
objImageProcessConfigPtr-EnableSharpen(true);//使能锐化
objImageProcessConfigPtr-SetSharpenParam(1);//设置锐化强度因子 1
objImageProcessConfigPtr-SetContrastParam(0);//设置对比度调节参数
objImageProcessConfigPtr-SetGammaParam(1);//设置 Gamma 系数
objImageProcessConfigPtr-SetLightnessParam(0);//设置亮度调节参数
objImageProcessConfigPtr-EnableDenoise(true);//使能降噪开关(黑白相机不支持)流对象属性控制
我们是通过流对象来控制设备进行图片采集的也是通过流对象来控制相机采集相关的属性和统计信息对于流属性的控制主要是通过IGXStream进行控制的
//objGXStream 为通过 IGXDevice::OpenStream 获取到的 CGXStreamPointer 对象
CGXFeatureControlPointer objStreamFeatureControlPtr objGXStream-GetFeatureControl();
//查看采集统计信息
//buffer 不足导致丢帧数
objStreamFeatureControlPtr-GetIntFeature(StreamLostFrameCount)-GetValue();
//接收的残帧个数
objStreamFeatureControlPtr-GetIntFeature(StreamIncompleteFrameCount)-GetValue();
//接收到的包数
objStreamFeatureControlPtr-GetIntFeature(StreamDeliveredPacketCount)-GetValue();
//重传包个数
objStreamFeatureControlPtr-GetIntFeature(StreamResendPacketCount)-GetValue();
//设置采集配置参数
//设置块超时时间 200ms
objStreamFeatureControlPtr-GetIntFeature(BlockTimeout)-SetValue(200);通过改变流对象属性中“StreamBufferHandlingMode”可以设置 Buffer 的处理模式,Buffer 处理模式目前支持三种 1)OldestFirst:默认值。图像缓冲区遵守先进先出的原则,所有的缓冲区全部填满后,新的图像数据会被丢弃,直到用户完成已经填满图像数据的缓冲区处理。典型应用场景是,要求接收到相机采集的每帧图像,不丢帧。该模式实现不丢帧,还需要图像数据的传输与处理的速度尽量快(至少小于帧周期)。2)OldestFirstOverwrite:同样遵守先进先出的原则。与 OldestFirst 模式的区别是,当所有的缓冲区全部填满后,SDK 将主动丢弃缓冲区中时间戳最旧的一帧图像缓冲区,用于接收新的图像数据。典型的应用成绩是,不要求接收相机采集的每帧图像,应用环境下图像传输与处理速度较慢。3)NewestOnly:该模式下用户拿到的始终是 SDK 接收到的最新图。SDK 每接收到一帧新的图像数据,就会主动丢弃旧时间戳的图像,因此当用户图像处理不及时或者速度较慢时,就会出现丢帧。该模式主要应用场合是,对图像采集与显示实时性要求比较高,且不要求接收到相机采集的每帧图像。但是受相机的采集帧率和内部缓存,以及传输速度、用户使用场景的限制,SDK 接收的最新图与相机最新曝光的图像可能有延迟。
获取设备事件
在回调函数中可以获取设备发生的具体事件并进行相关的处理。可以获取的五类事件如下 获取设备事件之后指定对应的回调函数然后在进行注册相关设备事件发生之后会自动调用相关的处理函数 下述代码是定义了设备发生曝光事件的处理函数
classCSampleFeatureEventHandler : public IFeatureEventHandler
{public:void DoOnFeatureEvent(constGxIAPICPP::gxstring strFeatureName, void* pUserParam){cout 发生曝光结束事件!endl;//pUserParam 是用户注册回调函数的时候传入的 ,此处将其还原用来获取事件数据CGXFeatureControlPointer* pObjFeatureControlPtr (CGXFeatureControlPointer*)pUserParam;//获取曝光结束事件时间戳(*pObjFeatureControlPtr)-GetIntFeature(EventExposureEndTimestamp)-GetValue();//获取曝光结束事件帧 ID(*pObjFeatureControlPtr)-GetIntFeature(EventExposureEndFrameID)-GetValue();}
};下述代码为具体的注册回调函数
//objDevicePtr 为 CGXDevicePointer 设备对象,设备已经打开
//设备事件属性在远端设备属性控制器上,首先应该获取远端设备属性控制器
CGXFeatureControlPointer objFeatureControlPtr
objDevicePtr-GetRemoteFeatureControl();
//选择事件源
objFeatureControlPtr-GetEnumFeature(EventSelector)-SetValue(
ExposureEnd);
//使能事件
objFeatureControlPtr-GetEnumFeature(
EventNotification)-SetValue(On);
//注册事件回调函数,注意参数三是用户私有参数,用户可以传入任何指针
//此处我们演示传入属性控制器指针,因为稍后会在回调函数内部使用此对象获取曝光结束事
//件数据信息
//此私有参数在回调函数内部可以被还原供用户使用 ,如果用户不使用私有参数,可以简单的将
//此参数设置为 NULL
GX_FEATURE_CALLBACK_HANDLE hEventHandle NULL;
IFeatureEventHandler* pFeatureEventHandler
new CSampleFeatureEventHandler();
hEventHandle objFeatureControlPtr-RegisterFeatureCallback(
EventExposureEnd,pFeatureEventHandler,objFeatureControlPtr);
//开启流通道采集
objStreamPtr-StartGrab();
//给设备发送开采命令
objFeatureControlPtr-GetCommandFeature(AcquisitionStart)-Execute();//发送开采命令,相机开始曝光输出图像,当曝光结束的时候会产生曝光结束事件,此时就会
//激活回调 OnFeatureCallback 接口
//接收曝光结束事件,见 OnFeatureCallback
//发送停采命令
objFeatureControlPtr-GetCommandFeature(AcquisitionStop)-Execute();
objStreamPtr-StopGrab();
//注销事件
objFeatureControlPtr-UnregisterFeatureCallback(objEventHandle);
delete pFeatureEventHandler;
pFeatureEventHandler NULL;获取掉线事件通知
这个和回调采集的道理是一样发生了掉线事件之后会自动调用这些函数进行反馈 将自己定义的回调函数进行注册的代码 这个比较特殊如果要关闭设备需要提前注销事件 样例程序分析
当前这部分用来展示一个完整的控制台程序实现了三个功能分别是 注册掉线设备定义设备掉线的处理方案注册远端设备事件定义远端设备发生发生某个事件之后的处理方案注册采集回调事件定义图片采集之后的处理事件
#include stdafx.h
#include isostream// 这里需要提前配置好工程头文件这个头文件基本上包含了所有的头文件加上这个了就不需要在二次调用了
#include GalaxyIncludes.h// 用户定义掉线的处理事件设备掉线会自动调用的程序
// 需要继承并实现虚基类IDeviceOfflineEventHandler
class CSampleDeivceOfflineEventHandler:public IDeviceOfflineEventHandler{
public:// pUserParam用户传入的参数void DoOnDeviceOfflineEvent(void *pUserParam){cout设备已经掉线了请注意处理endl;}
}// 用户定义属性更新事件的处理函数当属性发生改变时自动调用该函数
// 需要继承并实现虚基类
class CSampleCaptureEventHandler:Public ICaptureEventHandler{
public:void DoOnFeatureEvent(const GxIAPICPP:gxstring strFeatureName,void *pUserParam){cout收到曝光事件endl;}}// 用户定义回调采集函数的具体实现当回调采集事件发生时自动调用该函数
// 需要继承实现虚基类
class CSampleCaptureHandler : public ICaptureEventHandler{public:void DoOnImageCapture(CImageDataPointer objImageDataPointer,void * pUserParam){cout收到一帧图像 !endl;coutImageInfo: objImageDataPointer-GetStatus() endl;coutImageInfo: objImageDataPointer-GetWidth() endl;coutImageInfo: objImageDataPointer-GetHeight() endl;coutImageInfo: objImageDataPointer-GetPayloadSize() endl;}
}// main函数需要注册掉线事件、属性变动事件以及采集回调事件
int main(int argc,_TCHAR* argv[]){//定义事件回调的指针IDeviceOfflineEventHandler* pDeviceOfflineEventHandler NULL;//掉线事件回调对象IFeatureEventHandler* pFeatureEventHandler NULL;//远端设备事件回调对象ICaptureEventHandler* pCaptureEventHandler NULL;//采集回调对象// 初始化库才能调用相关的功能IGXFactory::GetInstance().Init()try{do{//枚举设备gxdeviceinfo_vector vectorDeviceInfo;IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);if (0 vectorDeviceInfo.size()){cout无可用设备!endl;break;}//打开第一台设备以及设备下面第一个流CGXDevicePointer ObjDevicePtr IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);CGXStreamPointer ObjStreamPtr ObjDevicePtr-OpenStream(0);//获取远端设备属性控制器CGXFeatureControlPointer ObjFeatureControlPtr ObjDevicePtr-GetRemoteFeatureControl();//获取流层属性控制器CGXFeatureControlPointer objStreamFeatureControlPtr ObjStreamPtr-GetFeatureControl();//设置 Buffer 处理模式objStreamFeatureControlPtr-GetEnumFeature(StreamBufferHandlingMode)-SetValue(OldestFirst);//注册设备掉线事件(目前只有千兆网系列相机支持此事件通知 )GX_DEVICE_OFFLINE_CALLBACK_HANDLE hDeviceOffline NULL;pDeviceOfflineEventHandler new CSampleDeviceOfflineEventHandler();hDeviceOffline ObjDevicePtr-RegisterDeviceOfflineCallback(pDeviceOfflineEventHandler, NULL);//设置曝光时间(示例中写死 us,只是示例,并不代表真正可工作参数)//ObjFeatureControlPtr-GetFloatFeature(ExposureTime)-SetValue(50);//注册远端设备事件:曝光结束事件(目前只有千兆网系列相机支持曝光结束事件 )//选择事件源ObjFeatureControlPtr-GetEnumFeature(EventSelector)-SetValue(ExposureEnd);//使能事件ObjFeatureControlPtr-GetEnumFeature(EventNotification)-SetValue(On);GX_FEATURE_CALLBACK_HANDLE hFeatureEvent NULL;pFeatureEventHandler new CSampleFeatureEventHandler();hFeatureEvent ObjFeatureControlPtr-RegisterFeatureCallback(EventExposureEnd, pFeatureEventHandler, NULL);//注册回调采集pCaptureEventHandler new CSampleCaptureEventHandler();ObjStreamPtr-RegisterCaptureCallback(pCaptureEventHandler,NULL);//发送开采命令ObjStreamPtr-StartGrab();ObjFeatureControlPtr-GetCommandFeature(AcquisitionStart)-Execute();//此时开采成功,控制台打印信息,直到输入任意键继续getchar();//发送停采命令ObjFeatureControlPtr-GetCommandFeature(AcquisitionStop)-Execute();ObjStreamPtr-StopGrab();//注销采集回调ObjStreamPtr-UnregisterCaptureCallback();//注销远端设备事件ObjFeatureControlPtr-UnregisterFeatureCallback(hFeatureEvent);//注销设备掉线事件ObjDevicePtr-UnregisterDeviceOfflineCallback(hDeviceOffline);//释放资源ObjStreamPtr-Close();ObjDevicePtr-Close();} while (0);}catch(CGalaxyExceptione){cout错误码: e.GetErrorCode() endl;cout错误描述信息 : e.what() endl;}catch(std::exceptione){cout错误描述信息 : e.what() endl;}//反初始化库IGXFactory::GetInstance().Uninit();//销毁事件回调指针if (NULL ! pCaptureEventHandler){delete pCaptureEventHandler;pCaptureEventHandler NULL;}if (NULL ! pDeviceOfflineEventHandler){delete pDeviceOfflineEventHandler;pDeviceOfflineEventHandler NULL;}if (NULL ! pFeatureEventHandler){delete pFeatureEventHandler;pFeatureEventHandler NULL;}return 0;
}补充项目中常用库函数
CINI库
介绍专门用来处理INI文件的C库INI是一种简单的数据存储格式用于存储应用程序的配置信息主要特性 读取和写入INI文件CINI库提供了函数来读取和写入INI文件。这使得你可以在你的程序中方便地使用INI文件来存储和检索配置信息。支持多种数据类型CINI库支持多种数据类型包括整数、浮点数、字符串等。这使得你可以在INI文件中存储各种类型的数据。错误处理CINI库提供了错误处理机制可以帮助你检测和处理可能出现的错误。跨平台CINI库可以在多种操作系统上使用包括Windows、Linux等。
总结
目前没有设备就不看他的说明文档了等我手里 有具体的相机了再继续开始写一些控制相机的基础代码了这里直接去看老师给的代码了 不往外放了。