小目标检测(1)——大恒(DaHeng)相机操作与控制编程
文章目录
- 引言
- 正文
- 相关开发库的介绍
- 编程准备
- 配置引用头文件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.h"using namespace std;int main()
{try {// 初始化相机实例IGXFactory::GetInstance().Init();}catch (CGalaxyException&e) {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.h"using namespace std;int main()
{try {// 初始化相机实例IGXFactory::GetInstance().Init();// 相机的反初始化,释放所有占有的资源IGXFactory::GetInstance().Uninit();}catch (CGalaxyException&e) {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 (CGalaxyException&e) {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().OpenDeviceBySN
- IGXFactory::GetInstance().OpenDeviceByUserID
- IGXFactory::GetInstance().OpenDeviceByMAC
- IGXFactory::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 = objIBaseData>ImageProcess(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;cout<<"ImageInfo: "<<objImageDataPointer->GetStatus() <<endl;cout<<"ImageInfo: "<<objImageDataPointer->GetWidth() <<endl;cout<<"ImageInfo: "<<objImageDataPointer->GetHeight() <<endl;cout<<"ImageInfo: "<<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(CGalaxyException&e){cout<<"错误码: "<<e.GetErrorCode() <<endl;cout<<"错误描述信息 : "<<e.what() <<endl;}catch(std::exception&e){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等。
总结
- 目前没有设备,就不看他的说明文档了,等我手里 有具体的相机了,再继续开始写一些控制相机的基础代码了,这里直接去看老师给的代码了, 不往外放了。
相关文章:
小目标检测(1)——大恒(DaHeng)相机操作与控制编程
文章目录 引言正文相关开发库的介绍编程准备配置引用头文件GalaxyIncludes.h配置lib文件 具体编程过程初始化和反初始化枚举设备开关设备 属性控制属性控制器种类 图像采集控制和图像处理采单帧回调采集图像处理流对象属性控制 获取设备事件获取掉线事件通知 样例程序分析补充&…...
异步实现邮件发送
目录 问题描述: 问题分析: 问题解决: 分析总结: 问题描述: 在写接口的时候,遇到一个问题,前端要求直接返回结果再去运行其他代码。 问题分析: 因为经费紧张,本次使用…...
【Redis】内存数据库Redis进阶(Redis分片集群)
目录 分布式缓存 Redis 四大问题搭建Redis分片集群分片原理散列插槽(插槽原理)集群伸缩需求设定配置集群伸缩 故障转移自动故障转移手动故障转移 RedisTemplate访问分片集群 分布式缓存 Redis 四大问题 基于 Redis 集群解决单机 Redis 存在的四大问题&a…...
替代LT8711龙讯替代RTD2172 CS5265中文规格书4K60HZ转接线 设计Type-C转HDMI2.0高清投屏方案
龙迅LT8711是一款Type-C/DP1.2 to HDMI2.0方案芯片,北京集睿致远(ASL)推出的CS5265可以完全代替LT8711UX,封装尺寸比LT8711UX小的同时,CS5265的芯片集成度高,内置MCU,内置lLDO等,CS5…...
HCIA-datacom数通题库和录播视频资料
HCIA-Datacom,是华为数通认证的初级考试,培训与认证具备数通基础通用知识和技能水平的工程师,只是入门了解数通的一些基础通用知识,适用于小白了解和学习数通知识点起点。 个人建议还是有必要考的,如果在企业考试考试…...
优思学院|质量工程师应具备什么能力?
质量工程师是一个需要耐心、细心、坚持态度、沟通能力、协调能力的工作,更需要持续学习强化自身的专业知识。 质量工程师负责审核、客户投诉的调查、过程的改进以达到质量之提升,他們也必须要预警生产线风险、质量异常,并且协调不同的部門一…...
数据分析 VS 数据可视化:决战时刻
数据分析和数据可视化是数据科学领域中两个重要的组成部分,很多人不明白两者之间的关系,会误认为是一个东西,其实不然。本文就带大家简单了解一下它们的区别与联系吧! 数据分析是指通过收集、处理和解释数据来获取有关特定问题或…...
Vue3中无法为el-tree-select设置反选问题分析
环境:Vue3.2、Element Plus 问题:子组件 setting.vue > 弹窗组件 Dialog > 树选择组件el-tree-select ,无法设置默认选中项 default-checked-keys 场景:在一个后台系统的列表页,选中一行数据,点击设置…...
Redis - 缓存持久化
Redis 的缓存持久化有两种技术 : RDB 和 AOF RDB Redis 的数据快照 简单说就是将缓存中的所有数据都记录到磁盘中,当Redis发生故障的时候,只需读取快照文件,就可恢复数据 相应的命令是 save 和 bgsave ,这两个命名…...
Pandas进阶修炼120题-第三期(金融数据处理,51-80题)
目录 往期内容:第一期:Pandas基础(1-20题)第二期:Pandas数据处理(21-50题) 第三期 金融数据处理51.使用绝对路径读取本地Excel数据方法一:双反斜杠绝对路径方法二:r 拓展…...
3、HAproxy高级配置
基于cookie的会话保持 在 HAProxy 中,可以通过使用 cookie 配置来实现基于 Cookie 的会话保持。cookie 配置用于配置与会话保持相关的选项,允许您定义要在HTTP响应中插入或重写的Cookie以及其他与Cookie会话保持相关的参数。 以下是一些常用的 cookie 配…...
tcpdump网络抓包工具的使用
tcpdump 是一款用在linux系统上的网络抓包工具 1、 基本语法 tcpdump 的常用参数如下: tcpdump -i eth0 -nn -s0 -v port 80-i : 选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口&…...
AMEYA360旗下品牌:日本SUSUMU推出RGV系列贴片电阻器新产品
电动汽车、机器人、精密测量仪器——在上述三例应用领域中,具有高精度、坚固性和长期稳定性的组件是必不可少的。对于这些和类似的应用,RGV系列精密电阻器是理想的选择。 RGV系列电阻器 RGV系列金属薄膜贴片电阻器的电阻值范围为120kΩ至3MΩ(…...
git-版本控制器
集中式版本控制工具(不常用) 版本库集中于中央服务器,team要联网才能工作(下载代码) SVN CVS 分布式版本控制工具 每个电脑上都有一个完整的版本库,工作时无需联网,可以把修改推送给其他人来…...
台式机/工控机通过网线共享笔记本电脑无线网络linux系统下 usb网卡的驱动安装
一、台式机/工控机通过网线共享笔记本电脑无线网络 1、 将台式机通过网线和笔记本连接。 2、 将笔记本的“本地连接”和“无线网络连接”的ipv4均设置为自动获取。 4.修改台式机的IP地址为如下(对应笔记本信息) IP地址为192.168.XXX.12 子网掩码为255.2…...
kotlin 编写一个简单的天气预报app(五)增加forcast接口并显示
参考资料 OpenWeatherMap提供了一个/forecast接口,用于获取未来几天的天气预报。你可以使用HTTP GET请求访问该接口,并根据你所在的城市或地理坐标获取相应的天气数据。 以下是一个示例请求的URL和一些常用的参数: URL: http://api.openwe…...
vs调试引发了异常:读取访问权限冲突,argv是0x7
vs2019写了几句小代码,结果报错: 引发了异常:读取访问权限冲突,argv是0x7 查了一堆是什么数组越界了,空指针异常了啥的。 只好都注释掉只留下主函数,结果还是报错,定睛一看才发现原因:main函数忘写第一…...
【电影推荐系统】实时推荐
概览 技术方案: 日志采集服务:通过利用Flume-ng对业务平台中用户对于电影的一次评分行为进行采集,实时发送到Kafka集群。消息缓冲服务:项目采用Kafka作为流式数据的缓存组件,接受来自Flume的数据采集请求。并将数据推…...
Delphi 开发不一样的窗体标题栏:TTitleBarPanel
目录 TTitleBarPanel 的使用 TTitleBarPanel 的使用进阶 一、设置标题栏高度、颜色 二、个性化标题栏的关闭等按键 我们在用Delphi开发程序的时候,窗体的标题栏一般都是标准的windows标题栏,上面包括:程序图标、标题、最小化、最大化、关闭…...
Quartz中禁止并发机制源码级解析
文章目录 Quartz进行任务调度时通常会要求一个任务禁止并发执行,此时只需要在Job类上面添加一个注解DisallowConcurrentExecution即可。在保存到数据库里面时,对应QRTZ_JOB_DETAILS表中的IS_NONCONCURRENT字段的值为1(true)。那么…...
保姆级排查指南:PyTorch装完CUDA不认账?手把手教你搞定torch.cuda.is_available()返回False
保姆级排查指南:PyTorch装完CUDA不认账?手把手教你搞定torch.cuda.is_available()返回False 刚装好PyTorch准备大展拳脚,结果torch.cuda.is_available()无情地返回False?这种挫败感我太懂了。作为过来人,我整理了这份…...
终极指南:5分钟掌握JarEditor,无需解压直接编辑JAR文件
终极指南:5分钟掌握JarEditor,无需解压直接编辑JAR文件 【免费下载链接】JarEditor IDEA plugin for directly editing and modifying files in jar without decompression. (一款无需解压直接编辑修改jar包内文件的IDEA插件) 项…...
pytest Code Review skill.md
Skills 架构设计 本文深入探讨 Agent Skills 的技术架构和设计理念,帮助你理解 Skills 如何高效地扩展 Claude 的能力。 核心设计理念 Agent Skills 采用**渐进式披露(Progressive Disclosure)**架构,这是一种现代软件工程中的…...
AI Agent Harness Engineering 技术选型指南:根据场景选择合适的大模型与框架
AI Agent Harness Engineering 技术选型指南:根据场景选择合适的大模型与框架 引言 痛点引入 你是否遇到过这样的场景?产品经理拍板要做一个**“能帮企业HR自动筛选简历、邀约面试、生成入职指南并跟进试用期转正材料”**的“超级HR助手”AI Agent——…...
GitHub史诗级泄露:3800个核心仓库被窃,TeamPCP如何通过VS Code扩展攻破全球最大代码平台
一、引言:全球开发者的至暗时刻 2026年5月20日,一则消息震惊了整个科技界:微软旗下全球最大代码托管平台GitHub确认,约3800个内部私有仓库被威胁组织TeamPCP窃取,涵盖GitHub Copilot、CodeQL、GitHub Actions、Codespa…...
Aube:下一代 Node.js 包管理器,性能远超 pnpm
好的,我已经为您整理了关于新一代 Node.js 包管理器 Aube 的详细介绍文章。文章基于您提供的摘要和 GitHub 仓库的详细文档,扩充了功能介绍、使用场景和命令参考,以形成一个完整的详情页面。 Aube:下一代 Node.js 包管理器&#x…...
RabbitMQ(七大模式+微服务+自用)
一、前置准备安装并启动 RabbitMQ(默认端口 5672)JDK 8、Maven、IDEA所有项目通用工具类 通用 pom,直接复制二、全局统一配置(所有项目必用)1. 公共连接工具类 ConnectionUtil.javajava运行package com.mq.util;impor…...
联想笔记本BIOS解锁终极指南:深度解析CFG Lock关闭与DVMT显存调整
联想笔记本BIOS解锁终极指南:深度解析CFG Lock关闭与DVMT显存调整 【免费下载链接】LEGION_Y7000Series_Insyde_Advanced_Settings_Tools 支持一键修改 Insyde BIOS 隐藏选项的小工具,例如关闭CFG LOCK、修改DVMT等等 项目地址: https://gitcode.com/g…...
告别环境报错:用Docker 10分钟在本地/服务器部署YOLOv8完整开发环境
告别环境报错:用Docker 10分钟在本地/服务器部署YOLOv8完整开发环境 在计算机视觉领域,YOLOv8作为当前最先进的目标检测模型之一,其强大的性能和易用性吸引了大量开发者和研究者。然而,传统的手动搭建开发环境过程往往令人望而生畏…...
MASA模组中文汉化包:为中文玩家打造的完整界面本地化解决方案
MASA模组中文汉化包:为中文玩家打造的完整界面本地化解决方案 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Minecraft中复杂的英文模组界面而困扰吗?MAS…...
