大恒水星工业相机开发笔记(一):相机基本介绍、安装GalaxyViwer软件和搭建SDK基础环境
前言
大恒水星工业相机SDK开发。
大恒水星,全称大恒图像 MERCURY 系列,是大恒图像推出的紧凑型面阵 CMOS 工业相机,分为多个子系列,常见有 MER-U3(USB3.0)、MER-GE(千兆网),也包含部分 USB2.0 老款机型。
它定位中端普惠型工业相机,主打轻量化、低功耗、即插即用,不是那种超高分辨率、超高速的旗舰机型,而是面向绝大多数常规视觉场景的 “主力款”。
机身非常小巧,金属外壳,体积紧凑,可以轻松安装在狭小工位、机械臂末端、显微镜光路里面,不会占用大量空间。
水星型号矩阵非常齐全,分辨率从几十万像素到千万级都有,帧率梯度丰富:
- 低像素高帧率:适合运动检测、流水线测速、飞拍;
- 中高像素:尺寸测量、缺陷检测、OCR、定位;
- 支持彩色/黑白版本选择;黑白相机信噪比更高、灵敏度更好;彩色适合外观质检、颜色分拣。
传感器选用成熟的 CMOS,全局快门和卷帘快门版本分开。重点提醒:做运动物体抓拍,一定要选全局快门;静止拍摄、文档扫描、静态外观检测,卷帘快门性价比更高。
- USB3.0(MER-U3):最受个人、实验室、小项目欢迎,直接插电脑,不需要额外采集卡,布线简单;缺点是长线传输受限,一般建议 5 米以内。
- 千兆网(MER-GE):适合工厂现场,网线可以拉很长,抗干扰更强,适合自动化产线、多相机同步,搭配交换机组网,是集成项目常客。
配套的 SDK、驱动、示例程序全部免费开放,支持Windows、Linux,同时提供C/C++、C#、Python、VB等开发例程。同时兼容Halcon、VisionPro、OpenCV、LabVIEW 等几乎主流视觉软件,这也是它出圈的关键。不用自己啃底层,拿到手就能跑图。
对比同规格进口相机,水星价格友好很多,对于学生课题、初创团队、小批量改造项目非常友好。大恒是国内老牌视觉厂商,售后和技术支持在国内比较方便,样件申请、技术答疑、维修渠道成熟。
除相机本体,市面上配套的镜头、转接环、光源、支架非常好找。大恒自带的 Galaxy 上位机软件,可以直接预览图像、调节曝光、增益、触发模式、ROI、白平衡,不需要写一行代码就能调试相机,新手调试、现场打样效率很高。
支持软触发、硬触发,可以接入外部光电传感器、PLC,满足流水线同步采集需求,支持 ROI 感兴趣区域裁剪,裁剪之后还能提升帧率。
水星不是万能相机,但在下面这些场景里非常合适:
- 高校与科研:机器视觉课程、图像处理实验、显微成像、光学实验;
- 自动化检测:零件尺寸测量、毛刺缺陷检测、印刷品缺印、二维码条码识别;
- 分拣与定位:物料定位、机械手引导、颜色分选;
- 安防与采集:静态图像采集、文档扫描、模具监控;
- 教学与打样:视觉工作室、个人爱好者搭建 OpenCV、Halcon 学习平台。
官网:自行搜索,无法贴了已经(无法过审)
下载sdk:



解压,双击:



随便选了,等待安装完成。


下载软件的时候,是否包含了开发sdk需要确认(下载好像会有说明),或者安装好后看,安装好包含sdk如下:


Qt5.15.2,msvc2019x64版本。



有冗余,调整下内部文件夹:

模块引入sdk:

没有直接的参考流程,提供的手册是详细按环节一个一个说明,需要自行学习查看,这里提供一个简单枚举设备的代码Demo:
void GalaxyICamManager::testEnv()
{
// 初始化设备库
IGXFactory::GetInstance().Init();
// 枚举相机设备
GxIAPICPP::gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
if(vectorDeviceInfo.size() <= 0)
{
LOG << "if(vectorDeviceInfo.size() <= 0)";
return;
}
for(int index = 0; index < vectorDeviceInfo.size(); index++)
{
IGXDeviceInfo *pIGXDeviceInfo = &vectorDeviceInfo[index];
#if 1
LOG << "***********************************************";
LOG << "<Vendor Name: " << pIGXDeviceInfo->GetVendorName() << ">";
LOG << "<Model Name: " << pIGXDeviceInfo->GetModelName() << ">";
LOG << "<Serial Number: " << pIGXDeviceInfo->GetSN() << ">";
if(pIGXDeviceInfo->GetDeviceClass() == GX_DEVICE_CLASS_GEV)
{
LOG << "<Interface: GigE Vision >";
LOG << "IP Address: " << pIGXDeviceInfo->GetIP() << ">";
LOG << "MAC Address: " << pIGXDeviceInfo->GetMAC() << ">";
}else if(pIGXDeviceInfo->GetDeviceClass() == GX_DEVICE_CLASS_USB2)
{
LOG << "<Interface: USB2.0 >";
}else if(pIGXDeviceInfo->GetDeviceClass() == GX_DEVICE_CLASS_U3V)
{
LOG << "<Interface: USB3 Vision(U3V) >";
}
#else
// 通过SN打开相机设备
GXSmartPtr<IGXDevice> pDevice = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(), GX_ACCESS_EXCLUSIVE);
// 获取相机属性控制对象
GXSmartPtr<IGXFeatureControl> pRemoteControl = pDevice->GetRemoteFeatureControl();
//选择默认参数组
pRemoteControl->GetEnumFeature("UserSetSelector")->SetValue("Default");
//加载参数组
pRemoteControl->GetCommandFeature("UserSetLoad")->Execute();
LOG << "***********************************************";
LOG << "<Vendor Name: " << pDevice->GetDeviceInfo().GetVendorName() << ">";
LOG 