WIN大恒工业相机SDK开发

news2024/11/17 5:56:50

大恒工业相机SDK开发概览

  • 一、开发环境搭建
    • 1、C# 环境配置(VS2019)
    • 2、C++ 环境配置(VS2019)
    • 3、python 环境配置(Pycharm)
  • 二、相机二次开发流程
  • 三、相机相机属性参数配置
  • 四、图像采集
    • 单帧采集
    • 回调采集
  • 注意事项
    • 千兆网相机心跳包
    • HDR相机

一、开发环境搭建

1、Galaxy的安装
Galaxy_windows2023年5月版本
下载完成后对软件进行安装,切记自己的安装目录
在这里插入图片描述
安装完成后,检查自己的相机是否是网口相机,如果是网口相机则需要进行IP配置,当相机与计算及网口处于同一网段下才可以打开相机并控制相机。

IPConfig工具可以查找到所有网段的设备,通过自动配置的方式配置相机IP,此时网口必须为固定IP
复位设备 功效等同于给设备掉电上电一次,相机内程序全部重新加载
重连设备 功效等同于软件接口关闭设备,执行此操作后,允许用户重新打开设备
在这里插入图片描述
在这里插入图片描述
打开GalaxyViewer,软件中可以实现正常采集图像,表示SDK的系统环境正常。

在这里插入图片描述
在这里插入图片描述
Windows环境下当Galaxy安装完成后,会在安装目录下生成APIDll、示例程序、驱动、开发文档等
在这里插入图片描述

1、C# 环境配置(VS2019)

(1)新建一个C#控制台应用,工程》引用》右键》添加引用。点击浏览,在安装目录中选择dll
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)在安装目录下》GalaxySDK》APIDll》根据工程架构不同,选择不同的dll文件,x64选择Win64,其他选择Win32
在这里插入图片描述
(3)根据目标框架不同,选择.NET3.5或者.NET4.0
在这里插入图片描述
选择项目菜单,点击属性,查看目标框架,
小于4.0版本,则使用.NET3.5大于4.0版本,则使用.NET4.0版本
在这里插入图片描述
(4)选择GxIAPINET.dll文件,点击添加,点击确定
在这里插入图片描述
在这里插入图片描述
(5)引用中显示已添加GxIAPINET后,在程序中添加using GxIAPINET
在这里插入图片描述
在这里插入图片描述
至此大恒工业相机C#的开发环境已经配置完毕

2、C++ 环境配置(VS2019)

(1)新建一个C++控制台项目
在这里插入图片描述
在这里插入图片描述
(2)打开项目菜单,选择工程属性
在这里插入图片描述
在这里插入图片描述
(3)配置头文件 选择C/C++》常规》包含附加目录
在这里插入图片描述
添加安装目录下GalaxySDK》Samples》C++SDK》inc文件夹
在这里插入图片描述
(4)配置链接器 选择链接器》常规》包含附加目录
在这里插入图片描述
查看自己的工程是x86还是x64
在这里插入图片描述
根据工程的不同,添加安装目录下GalaxySDK》Samples》C++SDK》lib》x86文件夹或者x64文件夹
在这里插入图片描述
(5)配置链接器 选择链接器》输入》附加依赖项,输入GxIAPICPPEx.lib
在这里插入图片描述
添加完链接库的名称后,再我们cpp工程中引用一下GalaxyIncludes库,就可以对我们的库进行调用了
在这里插入图片描述
至此大恒工业相机C++的开发环境已经配置完毕

3、python 环境配置(Pycharm)

(1)新建一个工程,将GalaxySDK》Samples》Python SDK中的gxipy文件夹拷贝到工程目录下
在这里插入图片描述
(2)添加PIL库,打开文件》Settings,选择Project:》Python Interpreter后,点击 + 号
在这里插入图片描述
(2)搜索pillow,选择这个库,点击Install Package进行安装
在这里插入图片描述
(3)安装numpy,搜索numpy选择这个库,点击Install Package进行安装
在这里插入图片描述
同样可以对我们的GalaxyAPI进行调用了
在这里插入图片描述
至此大恒工业相机python的开发环境已经配置完毕

二、相机二次开发流程

在这里插入图片描述
相机的初始化相关接口及功能
在这里插入图片描述

  1. IGXFactory接口类实现对全局资源的初始化
  2. IGXFactory接口类实现对所有设备的枚举
  3. IGXDeviceInfo接口类实现接收所有枚举出的设备信息

C++示例程序

IGXFactory::GetInstance().Init();//初始化
GxIAPICPP::gxdeviceinfo_vector deviceInfo; //定义设备列表
IGXFactory::GetInstance().UpdateDeviceList(1000, deviceInfo);//枚举设备
size_t num = deviceInfo.size();
std::cout <<"检测到相机" << num<<"台\n";//显示设备数量

C#示例程序

 IGXFactory.GetInstance().Init();//初始化
List<IGXDeviceInfo> deviceInfo = new List<IGXDeviceInfo>();//创建一个设备列表
IGXFactory.GetInstance().UpdateDeviceList(1000, deviceInfo);//枚举所有设备
//IGXFactory.GetInstance().UpdateAllDeviceList(1000, deviceInfo);//枚举所有设备
int num = deviceInfo.Count;//获取设备数量
Console.WriteLine("检测到相机"+num+"台");

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述4. IGXDeviceInfo接口类获取设备的类型、厂商名称、 设备展示名称、设备SN号、 IP地址、用户id、mac地址等信息
在这里插入图片描述

GX_DEVICE_CLASS_LIST deviceclass = deviceInfo[0].GetDeviceClass();//获取设备类型USB3.0、USB2.0、Gige
string vendorname = deviceInfo[0].GetVendorName();//获取设备厂商名称
string displayname = deviceInfo[0].GetDisplayName();//获取设备展示名称
string ip = deviceInfo[0].GetIP();//获取设备ip地址
string sn = deviceInfo[0].GetSN();//获取设备SN号
string userid = deviceInfo[0].GetUserID();//获取设备用户id
string mac = deviceInfo[0].GetMAC();//获取设备mac地址

Python示例程序

DeviceManager接口类实现对设备的枚举、获取设备数量信息以及通过关键字获取设备的sn号、IP地址、Mac地址、厂商名称、设备名称等信息
在这里插入图片描述
大恒相机设备控制等功能
在这里插入图片描述
2. IGXFactory接口类通过sn、ip、userid、mac等方式打开设备,获取IGXDevice设备对象

CGXDevicePointer Cam;
/通过SN打开第一台设备
Cam = IGXFactory::GetInstance().OpenDeviceBySN(sn, GX_ACCESS_EXCLUSIVE);//通过IP打开第一台设备
Cam = IGXFactory::GetInstance().penDeviceByIP(ip,GX_ACCESS_EXCLUSIVE);//通过UserID打开第一台设备
Cam = IGXFactory::GetInstance().OpenDeviceByUserID(userid, GX_ACCESS_EXCLUSIVE);
Cam = IGXFactory::GetInstance().OpenDeviceByMAC(mac,GX_ACCESS_EXCLUSIVE);//通MAC地址打开第一台设备
IGXDevice Cam = null;
//通过SN打开第一台设备
Cam = IGXFactory.GetInstance().OpenDeviceBySN(sn, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);//通过IP打开第一台设备
Cam = IGXFactory.GetInstance().OpenDeviceByIP(ip, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);//通过UserID打开第一台设备
cam = IGXFactory.GetInstance().OpenDeviceByUserID(userid,GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE)//
Cam = IGXFactory.GetInstance().OpenDeviceByMAC(mac, GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);//通MAC地址打开第一台设备
  • GX_ACCESS_CONTROL以控制的方式打开相机
  • GX_ACCESS_EXCLUSIVE以独占的方式发开相机
  • GX_ACCESS_READONLY以只读的方式打开相机

在这里插入图片描述
在这里插入图片描述
IGXDevice接口类 获取流通到个数 获取IGXStream流通道对象获取IGXFeatureControl、GetRemoteFeatureControl 属性控制器
C++

//获取流通个数
int stream_num = Cam->GetStreamCount();
//打开第一台设备以及设备下面第一个流
CGXStreamPointer Cam_stream = Cam->OpenStream(0);
//获取远端设备属性控制器
CXFeatureControlpointer Cam RemoteControl = Cam->GetRemoteFeatureControl();
//获取本地属性控制器
CGXFeatureControlPointer Cam_Control = Cam->GetFeatureControl();
//关闭设备
Cam->Close();

C#

//获取流通道个数
uint stream_num = Cam.GetStreamCount();
//打开设备的流
IGXStream Cam_Stream = Cam.OpenStream();
//获取远端设备属性控制器
IGXFeatureControl Cam_RemoteControl = Cam.GetRemoteFeatureControl();
//获取本地属性控制器
IGXFeatureControl Cam_Control = Cam.GetFeatureControl();
//关闭设备
Cam.Close();

在这里插入图片描述
Python
DeviceManager接口类通过序号、sn、ip、userid、mac等方式打开设备,获取Device设备对象

# 通过索引序号打开设备
cam = device_manager.open_device_by_index(1)
# 通过SN号打开设备
cam = device_manager.open_device_by_sn(sn)
#通过ip地址开设备
cam = device_manager.open_device_by_ip(_ip)
# 通过mac地址打开设备
cam = device_manager .open_device_by_mac(mac)
# 通过user id打开设备
cam = device_manager.open_device_by_user_id(user_id)

Device接口类设置触发模式、曝光、增益、获取流通道个数、打开流通道、获取流通道对象、关闭设备

# set continuous acquisition
cam.TriggerMode.set(gx .GxSwitchEntry .0FF)
# set exposure
cam.ExposureTime.set(10000)
# set gain
cam.Gain.set(10.0)
stream_num = cam.get_stream_channel_num()
# start data acquisition
cam.stream_on()
cam_stream = cam.data_stream[0]
cam.close_device()

在这里插入图片描述
IGXStream、DataStream 接口对象注册、注销回调采集函数。
C++

//注册回调采集
pCaptureEventHandler = new CSampleCaptureEventHandler();
Cam_stream->RegisterCaptureCallback(pCaptureEventHandler,NULL);
//注销回调采集
Cam_stream->UnregisterCaptureCallback();

C#

//注册回调采集
Cam_Stream.RegisterCaptureCallback(Cam,OnFrameCallbackFun)
//注销回调采集
Cam_Stream.UnregisterCaptureCallback();

python

#注册采集回调函数
cam_stream.register_capture_callback(capture_callback)
# 注销采集回调函数
cam_stream.unregister_capture_caltback()

IGXStream、DataStream 接口对象进行单帧采集
C++

//单采集
CImageDataPointer image = Cam_stream->GetImage(2000);//超时ms

C#

//单采集
IImageData image = Cam_Stream.GetImage(2000);//超时ms

Python

# 单帧采集
raw_image = cam_stream.get_image()

三、相机相机属性参数配置

相机属性的数据类型

  • IIntFeature IGXFeatureControl::GetIntFeature 整型
  • IFloatFeature IGXFeatureControl::GetFloatFeature 浮点型
  • IBoolFeature IGXFeatureControl::GetBoolFeature 布尔型
  • IEnumFeature IGXFeatureControl::GetEnumFeature 枚举型
  • IStringFeature IGXFeatureControl::GetStringFeature 字符串
  • ICommandFeature IGXFeatureControl::GetCommandFeature 命令类型
  • IRegisterFeature IGXFeatureControl::GetRegisterFeature 寄存器类型
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述当不知道该属性可以被写入时,可通过IsReadable()和IsWritable()方法进行查询如:
bool bIsReadable = cam_control.IsReadable("ExposureTime");
if (bIsReadable)
	cam_control.GetFloatFeature("ExposureTime").GetValue():
else
	MessageBox.Show("此属性不可读");
bool bIsWriteable = cam_control.IsWritable("Gain");
if (bIswriteable)
	cam_control.GetFloatFeature("Gain").SetValue(6);
else
	MessageBox.Show("此属性不可写"):

对于int类型和float类的属性,可以获取该参数可设置的最大值、最小值、步进值,而float类型还可以获取参数的单位

cam_control.GetIntFeature("width").GetInc();
cam_control.GetIntFeature("width").GetMin();
cam control.GetIntFeature("width").GetMax();
cam_control.GetFloatFeature("ExposureTime").GetMin();
cam_control.GetFloatFeature("ExposureTime").GetUnit()
cam_control.GetFloatFeature("ExposureTime").GetInc();

对于枚举类型的参数,可以获取该参数的枚举项列表

List<string> m_enum = cam_control.GetEnumFeature("AutoExposure").GetEnumEntryList();

对于字符串类型的参数,可以获取该参数的最大支持写入长度

long maxlength = cam_control.GetStringFeature("DeviceUserID").GetStringMaxLength();

四、图像采集

单帧采集

采集前必须先调用 StartGrab 开启流通道的采集,然后再给设备发送开采命令,否则开采命令无效

//单采集
IImageData image = Cam_Stream.GetImage(1000);//超时ms
if (image.Getstatus() == GX_FRAME_STATUS_LIST.GX FRAME_STATUS_SUCCESS)
{
//获取到完整帧图像进行图像处理
image.Destroy();
}

回调采集

采集图像必须先注册回调采集函数,再调用 StartGrab 开启流通道采集、再给设备发送开采命令

//注册回调采集
Cam_Stream.RegisterCaptureCallback(Cam, OnFrameCallbackFun):
Cam_Stream.StartGrab();
Cam_RemoteControl.GetCommandFeature("AcquisitionStart").Execute();

回调函数

public static void OnFrameCallbackFun(object obj, IFrameData objIFrameData)
{
//用户私有参数 obi,用户在注册回调函数的时候传入了设备对象,在回调函数内部可以将此
//参数还原为用户私有参数
  IGXDevice objIGXDevice = obj as IGXDevice;
  if (objIFrameData.Getstatus() == GX_FRAME_STATUS_LIST.GX FRAME_STATUS_SUCCESS)
  {
    UInt64 nwidth = objIFrameData.Getwidth();
    UInt64 nHeight = objiFrameData.GetHeight();
    GX_PIXEL_FORMATENTRY emPixelFormat = objIFrameData.GetPixelFormat();
  }
}

回调采集图像的数据类型为IFrameData,单帧采集的数据类型为IImageData,两者的区别为IImageData类多了一个**Destroy()**方法
在这里插入图片描述

注意事项

千兆网相机心跳包

在程序正常运行时、相机和PC之间会有心跳检测信号保证相机处在连线状态。
在这里插入图片描述
当程序在Debug时,程序在单步调试时PC无法给发送心跳包、因此当停留时间超过心跳检测超时时间,则会出现设备掉线情况。

通常将心跳检测时间设置的大一些解决这种情况

打开设备后,没有执行关闭设备程序,退出了程序,再次调用相机时,会出现设备无法打开的情况。
在这里插入图片描述
使用Ipconfig中的复位设备,将设备状态重置

HDR相机

HDR相机中参数与其他相机的参数有冲突现象,因此在使用HDR相机时,直接参考HDR相机例程
在这里插入图片描述
当HDR相机开启HDR模式后,其他例程在相机初始话曝光等参数时,会出现错误。最好运行HDR专用例程。


PS:哈,终于写完了,累死,其他品牌的相机用到再说
有问题可以加QQ群:907873019

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/838208.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于边缘无线协同感知的低功耗物联网LPIOT技术:赋能智慧园区方案以及数字工厂领域

回到2000年左右&#xff0c;物联网的底层技术支撑还是“ZigBee”&#xff0c;虽然当时ZigBee的终端功耗指标其实也并不庞大&#xff0c;但是&#xff0c;“拓扑复杂导致工程实施难度大”、“网络规模小导致的整体效率低下”都成为限制其发展的主要因素。 LPWAN&#xff0c;新一…

自学(黑客)技术,入门到入狱!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

【数据结构篇】手写双向链表、单向链表(超详细)

文章目录 链表1、基本介绍2、单向链表2.1 带头节点的单向链表测试类&#xff1a;链表实现类&#xff1a; 2.2 不带头节点的单向链表2.3 练习测试类&#xff1a;链表实现类&#xff1a; 3、双向链表测试类&#xff1a;双向链表实现类&#xff1a; 4、单向环形链表**测试类**&…

初级web前端开发工程师的岗位职责描述(合集)

初级web前端开发工程师的岗位职责描述1 职责&#xff1a; 1. 根据功能需求设计编写页面原型; 2. 前后端联调保证功能流畅; 3. 提高页面易用性、美观提出合理建议。 4、与后台工程师配合开发联调并交付产品; 5、持续优化前端页面体验和访问速度&#xff0c;保证页面精美高效…

命令行快捷键Mac Iterm2

原文:Jump forwards, backwards and delete a word in iTerm2 on Mac OS iTerm2并不允许你使用 ⌥← 或 ⌥→ 来跳过单词。 你也不能使用 ⌥backspace 来删除整个单词。 下面是在Mac OS上如何配置iTerm2以便能做到这一点的方法。 退格键 首先&#xff0c;你需要将你的左侧 ⌥…

kubernetes基于helm部署gitlab

kubernetes基于helm部署gitlab 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab。 先决条件 已运行的 Kubernetes 集群负载均衡器&#xff0c;为ingress-nginx控制器提供EXTERNAL-IP&#xff0c;本示例使用metallb默认存储类&#xff0c;为gitlab pods提供持久化存储&…

python#django数据库一对一/一对多/多对多

一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…

蓝桥杯上岸必刷!!! (进制、数位专题)

蓝桥杯上岸必刷&#xff01;&#xff01;&#xff01;(进制、数位专题) 距离蓝桥杯省赛倒数最后1天 ❗️ ❗️ ❗️ 还没背熟模板的伙伴们背起来 &#x1f4aa; &#x1f4aa; &#x1f4aa; 大家好 我是寸铁&#x1f4aa; 真题千千万万遍&#xff0c;蓝桥省一自然现&#…

“科创中国”青百会轮值主席吴甜:以大语言模型为代表的AI将引发产业变革

8月1日&#xff0c;“科创中国”青年百人会&#xff08;后文简称青百会&#xff09;联合百度举办“青创汇”高端对话&#xff0c;围绕人工智能技术创新与产业发展交流研讨&#xff0c;同时正式成立“科创中国”青年百人会女性工作委员会。该委员会将鼓励更多女性投身科技创新事…

easyExcel如何实现自定义标题,前两个(多个)标题占满一行,最后标题有规律

实现效果 实现方式 1&#xff0c;标题&#xff1a; Data public class ExportPurchaseSortingCustDto {/** 序号 */ExcelProperty(value {"${bigHead}","${dateHead}","序号"},index 0)ApiModelProperty(value "序号")private int…

RAFT:Recurrent All-Pairs Field Transforms for Optical Flow

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Abstract1 Introduction2 Related WorkOptical Flow as Energy Minimization 3 Approach3.1 Feature Extraction3.2 Computing Visual Similarity Abstract 光流学…

RISC-V基础之浮点指令(包含实例)

RISC-V体系结构定义了可选的浮点扩展&#xff0c;分别称为RVF、RVD和RVQ&#xff0c;用于操作单精度、双精度和四倍精度的浮点数。RVF/D/Q定义了32个浮点寄存器&#xff0c;f0到f31&#xff0c;它们的宽度分别为32位、64位或128位。当一个处理器实现了多个浮点扩展时&#xff0…

企业人力资源管理系统servlet+jsp人事招聘培训薪资java源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 企业人力资源管理系统servletjsp 系统1权限&#xff…

基于面向对象基础设计——里氏替换原则

在Java中&#xff0c;支持抽象和多态的关键机制之一是继承。正是使用了继承&#xff0c;我们才可以创建实现父类中抽象方法的子类。那么&#xff0c;是什么规则在支配着这种特殊的继承用法呢&#xff1f;最佳的继承层次的特征又是什么呢&#xff1f;在什么情况下会使我们创建的…

Python中的copy和deepcopy

一、定义 浅拷贝&#xff1a;创建一个新的对象&#xff0c;不拷贝内部子对象&#xff0c;只拷贝子对象的引用。这意味着&#xff0c;如果原对象的子对象发生变化&#xff0c;拷贝后的对象也会受到影响。 深拷贝&#xff1a;创建一个新的对象&#xff0c;并递归地拷贝原对象的所…

删除这4个文件夹,流畅使用手机无忧

在现代社会中&#xff0c;手机已经成为我们生活中不可或缺的一部分。然而&#xff0c;随着使用时间的增长&#xff0c;我们可能会遇到手机卡顿和内存不足的问题&#xff0c;让我们感到十分困扰。手机卡顿不仅影响使用体验&#xff0c;还可能导致应用程序运行缓慢&#xff0c;甚…

简单高效,教你如何制作食品小程序商城

食品行业的发展越来越繁荣&#xff0c;为了满足人们对食品的需求&#xff0c;许多商家都开始转向线上销售。而制作一个食品小程序商城&#xff0c;不仅可以提高销售效率&#xff0c;还可以增加用户粘性。下面&#xff0c;我们就来详细介绍如何制作食品小程序商城。 首先&#x…

python日志logging的用法

python日志看起比较简单&#xff0c;要用起来稍微有点复杂&#xff0c;基础用法网上也介绍得比较多&#xff0c;下面就最近遇见的问题&#xff0c;作一个简单的介绍。就是在两个以上的python文件中要记录日志&#xff0c;怎么才能实现在一个地方配置&#xff0c;多个地方使用的…

11.函数递归与迭代

递归与迭代 1.什么是递归&#xff1f;2.递归的限制条件3.递归举例3.1 求n的阶乘3.2 顺序打印一个整数的每一位 4.递归与迭代4.1 求第n个斐波那契数&#xff08;递归 不推荐&#xff09;4.2 求第n个斐波那契数&#xff08;迭代 推荐&#xff09;4.3 总结 1.什么是递归&#xff1…

奥威BI—数字化转型首选,以数据驱动企业发展

奥威BI系统BI方案可以迅速构建企业级大数据分析平台&#xff0c;可以将大量数据转化为直观、易于理解的图表和图形&#xff0c;推动和促进数字化转型的进程&#xff0c;帮助企业更好地了解自身的运营状况&#xff0c;及时发现问题并采取相应的措施&#xff0c;提高运营效率和质…