这里必须配置GxIAPICPPEx.lib静态库文件,这个库是大恒相机对外编程的统一接口。接受一个新的项目文件,一般来说,配置文件里面有,但是属性里面没有配置,踩过坑之后发现需要重新配置。
设置相关的配置文件
#include
#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";
}
#include “GalaxyException.h”
,具体如下// DahengCameraStart.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// 基础应用
#include
#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";
}
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";
}
//关闭设备之后不允许再调用 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);
}
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();
}
// 打开对应设备对应的流
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();
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();
在大恒相机的图片处理中,可以实现如下功能
具体的实现方式有两种
设置调试的配置文件,然后直接进行调试
//通过设备对象构建图像处理配置对象
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);//使能降噪开关(黑白相机不支持)
//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);
获取设备事件之后,指定对应的回调函数,然后在进行注册,相关设备事件发生之后,会自动调用相关的处理函数
下述代码是定义了设备发生曝光事件的处理函数
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;