【大恒相机】C++ 设备枚举+打开关闭+启停采集(基础入门))
-
- 文章目录
- [1. 前言](#1. 前言)
- [2. 开发环境准备(提前必看)](#2. 开发环境准备(提前必看))
- [3. VS2010新建控制台项目(一步一步来)](#3. VS2010新建控制台项目(一步一步来))
- [4. 大恒GalaxySDK配置(关键步骤,必看)](#4. 大恒GalaxySDK配置(关键步骤,必看))
- [5. 完整代码(可直接复制,无冗余)](#5. 完整代码(可直接复制,无冗余))
- [6. 代码关键步骤讲解(超详细)](#6. 代码关键步骤讲解(超详细))
- 7.运行程序
- [8. 常见运行失败及排查方法](#8. 常见运行失败及排查方法)
- [9. SDK配置常见错误及解决方法](#9. SDK配置常见错误及解决方法)
- [10. 注意事项(避坑指南)](#10. 注意事项(避坑指南))
- 配套资源下载(VS工程直接用)
- 总结
本文适合:大恒相机新手、VS2010使用者、工业视觉二次开发工程师,全程图文+步骤,从新建项目到运行成功,每一步都详细说明,零基础也能上手,纯控制台无界面,适合项目集成。
文章目录
1. 前言
大恒相机是工业视觉、机器视觉领域非常常用的相机品牌,这篇文章是大恒相机入门第一篇,代码极简、注释超详细、无报错、可直接运行。
本文基于大恒相机GalaxySDK,实现工业视觉开发最基础、最核心的完整流程------设备枚举、相机打开、采集启停、相机关闭,采用纯控制台实现(无任何界面),可直接复制到项目中二次开发,也可作为新手入门的第一个大恒相机实操案例。
适用场景:工业项目集成、相机调试、批量设备检测,适合大恒自产GigE/USB/CXP全系列相机。
适合:
✅ 刚接触大恒 SDK 的新手
✅ 想快速跑通基础流程
✅ 做课程设计 / 毕业设计
✅ VS2010 / VS2019 / VS2022 通用
实现功能
本程序实现大恒相机最核心的完整流程:
- 初始化 SDK
- 枚举所有已连接相机
- 打印相机信息(SN、型号、IP)
- 打开第一个相机
- 自动开启图像采集
- 自动停止图像采集
- 安全关闭设备、释放资源
- 异常捕获,报错不闪退
2. 开发环境准备(提前必看)
在开始操作前,必须准备好以下环境,否则会导致项目报错、无法运行:
-
操作系统:Windows 7/10/11(32位/64位均可,建议64位)
-
IDE:Visual Studio 2010(本文以VS2010为例,其他版本操作一致)
-
SDK:大恒GalaxySDK(必须安装,建议安装最新版本,安装路径默认即可)
-
硬件:大恒工业相机(GigE/USB均可),已正常连接电脑相机灯是绿色(USB相机直接插USB口,GigE相机确保IP与电脑在同一网段)
-
权限:电脑以管理员身份运行VS2010(避免权限不足,导致无法打开相机)
补充:GalaxySDK下载地址( 大恒官网):(进入官网下载中心→软件下载→windows第一个就行),安装时一路下一步,默认安装路径为:C:\Program Files\Daheng Imaging\GalaxySDK(64位系统)。

3. VS2010新建控制台项目(一步一步来)
全程步骤如下:
步骤1:打开VS2010
点击电脑开始菜单→找到"Microsoft Visual Studio 2010"→右键"以管理员身份运行"(重点!必须管理员身份,否则后续打开相机可能报错)。
步骤2:新建项目
-
打开VS2010后,点击左上角【文件】→【新建】→【项目】(快捷键:Ctrl+Shift+N);

-
在弹出的"新建项目"窗口中,左侧选择【Visual C++】→【Win32控制台应用程序】→"名称"处输入项目名:CPP_Daheng_Enum_Open;
-
"位置"处选择自己的项目保存路径(建议新建一个"大恒相机C++项目"文件夹,统一存放,避免混乱);
-
"解决方案名称"默认和项目名一致即可,取消勾选"创建目录用于解决方案"(可选,勾选也不影响);

5.选择 【下一步】

6.选择【空项目】→【完成】

- 点击【确定】,完成空项目创建。
步骤3:新建源文件(main.cpp)
-
项目创建完成后,在VS左侧"解决方案资源管理器"中,右键点击【源文件】→【添加】→【新建项】;
-
在弹出的"添加新项"窗口中,左侧选择【Visual C++】→【C++文件(.cpp)】;
-
右侧"名称"处输入:main.cpp(必须是main.cpp,否则程序无法运行);

-
点击【添加】,此时main.cpp文件创建完成,选到【x64】,后续我们将代码粘贴到这个文件中。

步骤4:设置项目字符集(关键步骤)
-
右键点击项目名称"CPP_Daheng_Enum_Open"→【属性】(快捷键:Alt+F7);
-
在弹出的"项目属性"窗口中,左侧选择【配置属性】→【常规】;
-
右侧找到"字符集",点击下拉框,选择【使用多字节字符集】(重点!如果选择"使用 Unicode 字符集",会导致SDK相关函数报错);
-
点击窗口右下角【应用】→【确定】,完成字符集设置。

4. 大恒GalaxySDK配置(关键步骤,必看)
SDK配置是核心,配置错误会导致"找不到头文件""链接失败"等问题,全程按步骤来,不要漏一步:
步骤1:配置包含目录(让VS找到SDK头文件)
-
右键点击项目名称"CPP_Daheng_Enum_Open"→【属性】→【配置属性】→【C/C++】→【常规】;
-
右侧找到"附加包含目录",点击右侧的"..."按钮;
-
在弹出的"附加包含目录"窗口中,点击【添加】,然后粘贴SDK的inc目录路径:
------ 64位系统默认路径:C:\Program Files\Daheng Imaging\GalaxySDK\Development\C++ SDK\inc

- 粘贴完成后,点击【确定】→【应用】,包含目录配置完成。
步骤2:配置库目录(让VS找到SDK库文件)
-
还是在"项目属性"窗口中,【配置属性】→【链接器】→【常规】;
-
右侧找到"附加库目录",点击"..."按钮;
-
点击【添加】,粘贴SDK的lib目录路径(根据自己的系统选择32位或64位):
------ 64位系统:C:\Program Files\Daheng Imaging\GalaxySDK\Development\C++ SDK\lib\x64

- 点击【确定】→【应用】,库目录配置完成。
步骤3:配置链接器输入(添加SDK库文件)
-
继续在"项目属性"窗口中,【配置属性】→【链接器】→【输入】;
-
右侧找到"附加依赖项",点击右侧的"..."按钮;
-
在弹出的窗口中,输入:GxIAPICPPEx.lib(大恒SDK核心库文件,必须输入正确,不能多字少字);
-
点击【确定】→【应用】→【确定】,SDK配置全部完成。

补充:如果配置完成后仍报错,可重启VS2010,重新打开项目,一般能解决问题。
5. 完整代码(可直接复制,无冗余)
打开我们新建的main.cpp文件,删除里面的空内容,复制下面的完整代码,粘贴进去(复制全部,不要漏行):
cpp
#include <iostream>
// 引入大恒SDK头文件(必须包含,否则无法使用SDK函数)
#include "GalaxyIncludes.h"
// 引入延时函数所需头文件(用于模拟采集时长)
#include <windows.h>
// 使用标准命名空间,避免每次写cout都要加std::
using namespace std;
// 主函数,程序入口
int main()
{
// 1. 初始化大恒GalaxySDK
// IGXFactory是SDK的核心工厂类,GetInstance()获取单例,Init()初始化SDK
IGXFactory::GetInstance().Init();
try
{
// 2. 枚举本地所有已连接的相机设备
// vectorDeviceInfo 是相机设备信息数组,用于存储所有扫描到的相机信息
gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
if (0 == vectorDeviceInfo.size())
{
cout << "【错误】未扫描到任何大恒相机设备!" << endl;
// 未扫描到相机,先释放SDK资源,再退出程序
IGXFactory::GetInstance().Uninit();
return -1;
}
// 3. 打印扫描到的相机数量及详细信息
cout << "【成功】扫描到的相机数量:" << vectorDeviceInfo.size() << " 台" << endl;
cout << "========================================" << endl;
// 遍历相机信息数组,打印每台相机的关键信息
for (int i = 0; i < vectorDeviceInfo.size(); i++)
{
cout << "设备索引:" << i << endl; // 相机索引(打开相机时用到)
cout << "SN 码:" << vectorDeviceInfo[i].GetSN() << endl; // 相机唯一SN码
cout << "相机型号:" << vectorDeviceInfo[i].GetModelName() << endl; // 相机型号
cout << "IP 地址:" << vectorDeviceInfo[i].GetIP() << endl; // 相机IP地址(GigE相机才有)
cout << "===================打开第一个相机=====================" << endl;
}
// 4. 打开指定索引的相机(这里打开第1台,索引为0)
//打开第一台设备以及设备下面第一个流
CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(vectorDeviceInfo[0].GetSN(),GX_ACCESS_EXCLUSIVE);
cout << "打开相机成功!" << endl;
CGXStreamPointer ObjStreamPtr = ObjDevicePtr->OpenStream(0);
//获取远端设备属性控制器
CGXFeatureControlPointer ObjFeatureControlPtr = ObjDevicePtr->GetRemoteFeatureControl();
//获取流层属性控制器
CGXFeatureControlPointer objStreamFeatureControlPtr = ObjStreamPtr->GetFeatureControl();
//提高网络相机的采集性能,设置方法参考以下代码(目前只有千兆网系列相机支持设置最优包长)。
GX_DEVICE_CLASS_LIST objDeviceClass = ObjDevicePtr->GetDeviceInfo().GetDeviceClass();
if (GX_DEVICE_CLASS_GEV == objDeviceClass)
{
//判断设备是否支持流通道数据包功能
if (true == ObjFeatureControlPtr->IsImplemented("GevSCPSPacketSize"))
{
//获取当前网络环境的最优包长值
int nPacketSize = ObjStreamPtr->GetOptimalPacketSize();
//将最优包长值设置为当前设备的流通道包长值
ObjFeatureControlPtr->GetIntFeature("GevSCPSPacketSize")->SetValue(nPacketSize);
}
}
// 5.开始采集
//发送开采命令
ObjStreamPtr->StartGrab();
ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();
cout << "开始采集成功!此处可添加取图逻辑,第一篇仅做启停演示,预留扩展位置,模拟采集1秒" << endl;
// 此处可添加取图逻辑,第一篇仅做启停演示,预留扩展位置
Sleep(1000); // 模拟采集1秒,可删除
// 6.停止采集(停采)
//发送停采命令
ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();
ObjStreamPtr->StopGrab();
cout << "停止采集成功!" << endl;
// 7.释放资源:关闭流通道→关闭相机→释放SDK
//释放资源
ObjStreamPtr->Close();
ObjDevicePtr->Close();
}catch(CGalaxyException&e)
{
cout<<"错误码: "<<e.GetErrorCode() <<endl;
cout<<"错误描述信息: "<<e.what() <<endl;
}catch(std::exception&e)
{
cout<<"错误描述信息: "<<e.what() <<endl;
}
//反初始化库
IGXFactory::GetInstance().Uninit();
// 程序运行完成,提示退出
cout << "【完成】相机已关闭,SDK资源已释放,程序正常退出!" << endl;
system("pause"); // 暂停控制台,方便查看运行结果(避免程序一闪而过)
return 0;
}
6. 代码关键步骤讲解(超详细)
- 初始化 SDK
cpp
IGXFactory::GetInstance().Init();
必须第一个调用,用于初始化相机底层库。
- 枚举设备
cpp
gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);
扫描所有连接的相机,存入列表。
- 打印设备信息
可以看到:
- 设备索引
- SN 码(唯一)
- 相机型号
- IP 地址(GigE 相机)
- 打开相机(通过 SN 打开)
cpp
CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(...)
稳定、安全、不会打开错设备。
- 开启采集(最重要)
cpp
ObjStreamPtr->StartGrab();
ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();
这两句必须一起调用:
StartGrab ():开启流通道
AcquisitionStart:让相机开始发图
- 停止采集
cpp
ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();
ObjStreamPtr->StopGrab();
顺序不能反,否则会报错。
- 释放资源
cpp
//释放资源
//关闭流
ObjStreamPtr->Close();
// 关闭设备
ObjDevicePtr->Close();
//反初始化库
IGXFactory::GetInstance().Uninit();
7.运行程序
-
在VS2010中,点击顶部菜单栏【调试】→【开始执行(不调试)】(快捷键:Ctrl+F5);
-
如果配置正确、相机连接正常,会弹出控制台窗口,显示运行结果。

8. 常见运行失败及排查方法
-
报错"未扫描到任何大恒相机设备":
-
排查1:相机是否正常连接电脑,相机灯是否为绿色(USB线是否插紧,网线是否插好);
-
排查2:GigE相机是否和电脑在同一网段(可通过大恒SDK自带的"GalaxyView"软件查看相机IP);
-
排查3:是否安装了正确的GalaxySDK,且SDK版本和相机型号匹配。
-
-
报错"打开索引0的相机失败":
-
排查1:是否以管理员身份运行VS2010;
-
排查2:相机是否被其他软件占用(比如GalaxyView软件,关闭其他占用相机的软件);
-
排查3:相机索引是否正确(比如扫描到1台相机,索引只能是0,不能是1)。
- 开始采集失败
- 没开流通道
- 相机参数异常
- 带宽不足
-
-
停止采集报错
- 顺序错误
- 设备已关闭
-
报错"找不到GalaxyIncludes.h":
- 排查:SDK包含目录配置错误,重新检查"附加包含目录"的路径是否正确,是否粘贴了正确的inc目录。
-
报错"无法解析的外部符号":
-
排查1:SDK库目录配置错误,重新检查"附加库目录"的路径;
-
排查2:"附加依赖项"是否输入了"GxIAPICPPEx.lib",是否多字少字,是否不符合当前的版本64位/32位。
-
9. SDK配置常见错误及解决方法
新手最容易在SDK配置上出错,这里汇总最常见的3个错误,直接对照解决:
-
错误1:fatal error C1083: 无法打开包括文件:"GalaxyIncludes.h": No such file or directory
- 解决方法:重新配置"附加包含目录",确保路径正确(比如64位系统:C:\Program Files\Daheng Imaging\GalaxySDK\Development\C++ SDK\inc),配置完成后重启VS。
-
错误2:error LNK2019: 无法解析的外部符号 "public: static class IGXFactory & __cdecl IGXFactory::GetInstance(void)"
- 解决方法:重新配置"附加库目录"和"附加依赖项",确保库目录路径正确,附加依赖项输入"GxIAPICPPEx.lib"。
-
错误3:error C2664: "void __cdecl std::basic_ostream<char,struct std::char_traits>::operator<<(void const *)": 无法将参数 1 从"const wchar_t *"转换为"void const *"
- 解决方法:项目字符集设置错误,重新设置为"使用多字节字符集",步骤见"3. 步骤4"。
10. 注意事项(避坑指南)
-
必须以管理员身份运行VS2010,否则会出现"权限不足,无法打开相机"的错误。
-
项目字符集必须设置为"使用多字节字符集",否则会出现字符转换错误。
-
SDK配置的路径必须正确,64位系统和32位系统的lib目录路径不同,不要混淆。
-
程序退出前,必须调用ObjDevicePtr->Close()和IGXFactory::GetInstance().Uninit(),否则会导致相机占用,下次无法打开。
-
如果是GigE相机,必须确保相机IP和电脑IP在同一网段(比如电脑IP:192.168.0.5,相机IP:192.168.0.10),可通过GalaxyView软件修改相机IP。
-
代码中不要随意删除或修改核心语句(比如SDK初始化、释放资源的语句),否则会导致程序报错或相机异常。
配套资源下载(VS工程直接用)
本文配套完整VS2010控制台工程,已配置好SDK,无需手动配置,下载后直接用VS2010打开,编译运行即可。
资源包含:
-
完整VS2010项目文件(.vcxproj、.sln等)
-
main.cpp(已粘贴完整代码)
-
SDK配置说明文档(备用)
下载地址: 【C++ 大恒相机】设备枚举 + 打开 + 开始采集 + 停止采集(完整控制台源码)
总结
本文实现了大恒相机最基础的设备枚举与打开关闭功能,纯控制台无界面,适合二次开发集成,全程详细讲解了从新建项目、SDK配置到运行测试的每一步,新手也能轻松上手。
后续将持续更新大恒相机C++控制台系列教程,涵盖取图、触发、参数设置等核心功能,关注我,后续内容不迷路!
如果运行过程中遇到问题,可在评论区留言,看到会第一时间回复解答。