文章目录
- 引言
- 正文
- 相关开发库的介绍
- 编程准备
- 配置引用头文件GalaxyIncludes.h
- 配置lib文件
- 具体编程过程
- 初始化和反初始化
- 枚举设备
- 开关设备
- 属性控制
- 属性控制器种类
- 图像采集控制和图像处理
- 采单帧
- 回调采集
- 总结
引言
- 在做老师的横向项目时,需要用大恒相机,需要将他的相机控制接入写的程序中,但是对于他的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 //流对象属性控制器,关于采集控制和采集数据统计的属性访问控制器。
-
图像采集控制和图像处理
采单帧
回调采集
总结
- 目前没有设备,就不看他的说明文档了,等我手里 有具体的相机了,再继续开始写一些控制相机的基础代码了,这里直接去看老师给的代码了, 不往外放了。