【大恒相机】C++ 设备枚举+打开关闭+启停采集(基础入门)

【大恒相机】C++ 设备枚举+打开关闭+启停采集(基础入门))

本文适合:大恒相机新手、VS2010使用者、工业视觉二次开发工程师,全程图文+步骤,从新建项目到运行成功,每一步都详细说明,零基础也能上手,纯控制台无界面,适合项目集成。

文章目录

1. 前言

大恒相机是工业视觉、机器视觉领域非常常用的相机品牌,这篇文章是大恒相机入门第一篇,代码极简、注释超详细、无报错、可直接运行。

本文基于大恒相机GalaxySDK,实现工业视觉开发最基础、最核心的完整流程------设备枚举、相机打开、采集启停、相机关闭,采用纯控制台实现(无任何界面),可直接复制到项目中二次开发,也可作为新手入门的第一个大恒相机实操案例。

适用场景:工业项目集成、相机调试、批量设备检测,适合大恒自产GigE/USB/CXP全系列相机。

适合:

✅ 刚接触大恒 SDK 的新手

✅ 想快速跑通基础流程

✅ 做课程设计 / 毕业设计

✅ VS2010 / VS2019 / VS2022 通用

实现功能

本程序实现大恒相机最核心的完整流程

  1. 初始化 SDK
  2. 枚举所有已连接相机
  3. 打印相机信息(SN、型号、IP)
  4. 打开第一个相机
  5. 自动开启图像采集
  6. 自动停止图像采集
  7. 安全关闭设备、释放资源
  8. 异常捕获,报错不闪退

2. 开发环境准备(提前必看)

在开始操作前,必须准备好以下环境,否则会导致项目报错、无法运行:

  1. 操作系统:Windows 7/10/11(32位/64位均可,建议64位)

  2. IDE:Visual Studio 2010(本文以VS2010为例,其他版本操作一致)

  3. SDK:大恒GalaxySDK(必须安装,建议安装最新版本,安装路径默认即可)

  4. 硬件:大恒工业相机(GigE/USB均可),已正常连接电脑相机灯是绿色(USB相机直接插USB口,GigE相机确保IP与电脑在同一网段)

  5. 权限:电脑以管理员身份运行VS2010(避免权限不足,导致无法打开相机)

补充:GalaxySDK下载地址( 大恒官网):(进入官网下载中心→软件下载→windows第一个就行),安装时一路下一步,默认安装路径为:C:\Program Files\Daheng Imaging\GalaxySDK(64位系统)。

3. VS2010新建控制台项目(一步一步来)

全程步骤如下:

步骤1:打开VS2010

点击电脑开始菜单→找到"Microsoft Visual Studio 2010"→右键"以管理员身份运行"(重点!必须管理员身份,否则后续打开相机可能报错)。

步骤2:新建项目

  1. 打开VS2010后,点击左上角【文件】→【新建】→【项目】(快捷键:Ctrl+Shift+N);

  2. 在弹出的"新建项目"窗口中,左侧选择【Visual C++】→【Win32控制台应用程序】→"名称"处输入项目名:CPP_Daheng_Enum_Open;

  3. "位置"处选择自己的项目保存路径(建议新建一个"大恒相机C++项目"文件夹,统一存放,避免混乱);

  4. "解决方案名称"默认和项目名一致即可,取消勾选"创建目录用于解决方案"(可选,勾选也不影响);

5.选择 【下一步】

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

  1. 点击【确定】,完成空项目创建。

步骤3:新建源文件(main.cpp)

  1. 项目创建完成后,在VS左侧"解决方案资源管理器"中,右键点击【源文件】→【添加】→【新建项】;

  2. 在弹出的"添加新项"窗口中,左侧选择【Visual C++】→【C++文件(.cpp)】;

  3. 右侧"名称"处输入:main.cpp(必须是main.cpp,否则程序无法运行);

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

步骤4:设置项目字符集(关键步骤)

  1. 右键点击项目名称"CPP_Daheng_Enum_Open"→【属性】(快捷键:Alt+F7);

  2. 在弹出的"项目属性"窗口中,左侧选择【配置属性】→【常规】;

  3. 右侧找到"字符集",点击下拉框,选择【使用多字节字符集】(重点!如果选择"使用 Unicode 字符集",会导致SDK相关函数报错);

  4. 点击窗口右下角【应用】→【确定】,完成字符集设置。

4. 大恒GalaxySDK配置(关键步骤,必看)

SDK配置是核心,配置错误会导致"找不到头文件""链接失败"等问题,全程按步骤来,不要漏一步:

步骤1:配置包含目录(让VS找到SDK头文件)

  1. 右键点击项目名称"CPP_Daheng_Enum_Open"→【属性】→【配置属性】→【C/C++】→【常规】;

  2. 右侧找到"附加包含目录",点击右侧的"..."按钮;

  3. 在弹出的"附加包含目录"窗口中,点击【添加】,然后粘贴SDK的inc目录路径:

------ 64位系统默认路径:C:\Program Files\Daheng Imaging\GalaxySDK\Development\C++ SDK\inc

  1. 粘贴完成后,点击【确定】→【应用】,包含目录配置完成。

步骤2:配置库目录(让VS找到SDK库文件)

  1. 还是在"项目属性"窗口中,【配置属性】→【链接器】→【常规】;

  2. 右侧找到"附加库目录",点击"..."按钮;

  3. 点击【添加】,粘贴SDK的lib目录路径(根据自己的系统选择32位或64位):

------ 64位系统:C:\Program Files\Daheng Imaging\GalaxySDK\Development\C++ SDK\lib\x64

  1. 点击【确定】→【应用】,库目录配置完成。

步骤3:配置链接器输入(添加SDK库文件)

  1. 继续在"项目属性"窗口中,【配置属性】→【链接器】→【输入】;

  2. 右侧找到"附加依赖项",点击右侧的"..."按钮;

  3. 在弹出的窗口中,输入:GxIAPICPPEx.lib(大恒SDK核心库文件,必须输入正确,不能多字少字);

  4. 点击【确定】→【应用】→【确定】,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. 代码关键步骤讲解(超详细)

  1. 初始化 SDK
cpp 复制代码
IGXFactory::GetInstance().Init();

必须第一个调用,用于初始化相机底层库。

  1. 枚举设备
cpp 复制代码
gxdeviceinfo_vector vectorDeviceInfo;
IGXFactory::GetInstance().UpdateDeviceList(1000, vectorDeviceInfo);

扫描所有连接的相机,存入列表。

  1. 打印设备信息

可以看到:

  • 设备索引
  • SN 码(唯一)
  • 相机型号
  • IP 地址(GigE 相机)
  1. 打开相机(通过 SN 打开)
cpp 复制代码
CGXDevicePointer ObjDevicePtr = IGXFactory::GetInstance().OpenDeviceBySN(...)

稳定、安全、不会打开错设备。

  1. 开启采集(最重要)
cpp 复制代码
ObjStreamPtr->StartGrab();
ObjFeatureControlPtr->GetCommandFeature("AcquisitionStart")->Execute();

这两句必须一起调用:

StartGrab ():开启流通道

AcquisitionStart:让相机开始发图

  1. 停止采集
cpp 复制代码
ObjFeatureControlPtr->GetCommandFeature("AcquisitionStop")->Execute();
ObjStreamPtr->StopGrab();

顺序不能反,否则会报错。

  1. 释放资源
cpp 复制代码
//释放资源
//关闭流
ObjStreamPtr->Close();
// 关闭设备
ObjDevicePtr->Close();
 //反初始化库
 IGXFactory::GetInstance().Uninit();

7.运行程序

  1. 在VS2010中,点击顶部菜单栏【调试】→【开始执行(不调试)】(快捷键:Ctrl+F5);

  2. 如果配置正确、相机连接正常,会弹出控制台窗口,显示运行结果。

8. 常见运行失败及排查方法

  1. 报错"未扫描到任何大恒相机设备":

    • 排查1:相机是否正常连接电脑,相机灯是否为绿色(USB线是否插紧,网线是否插好);

    • 排查2:GigE相机是否和电脑在同一网段(可通过大恒SDK自带的"GalaxyView"软件查看相机IP);

    • 排查3:是否安装了正确的GalaxySDK,且SDK版本和相机型号匹配。

  2. 报错"打开索引0的相机失败":

    • 排查1:是否以管理员身份运行VS2010;

    • 排查2:相机是否被其他软件占用(比如GalaxyView软件,关闭其他占用相机的软件);

    • 排查3:相机索引是否正确(比如扫描到1台相机,索引只能是0,不能是1)。

    1. 开始采集失败
    • 没开流通道
    • 相机参数异常
    • 带宽不足
  3. 停止采集报错

    • 顺序错误
    • 设备已关闭
  4. 报错"找不到GalaxyIncludes.h":

    • 排查:SDK包含目录配置错误,重新检查"附加包含目录"的路径是否正确,是否粘贴了正确的inc目录。
  5. 报错"无法解析的外部符号":

    • 排查1:SDK库目录配置错误,重新检查"附加库目录"的路径;

    • 排查2:"附加依赖项"是否输入了"GxIAPICPPEx.lib",是否多字少字,是否不符合当前的版本64位/32位。

9. SDK配置常见错误及解决方法

新手最容易在SDK配置上出错,这里汇总最常见的3个错误,直接对照解决:

  1. 错误1:fatal error C1083: 无法打开包括文件:"GalaxyIncludes.h": No such file or directory

    • 解决方法:重新配置"附加包含目录",确保路径正确(比如64位系统:C:\Program Files\Daheng Imaging\GalaxySDK\Development\C++ SDK\inc),配置完成后重启VS。
  2. 错误2:error LNK2019: 无法解析的外部符号 "public: static class IGXFactory & __cdecl IGXFactory::GetInstance(void)"

    • 解决方法:重新配置"附加库目录"和"附加依赖项",确保库目录路径正确,附加依赖项输入"GxIAPICPPEx.lib"。
  3. 错误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. 注意事项(避坑指南)

  1. 必须以管理员身份运行VS2010,否则会出现"权限不足,无法打开相机"的错误。

  2. 项目字符集必须设置为"使用多字节字符集",否则会出现字符转换错误。

  3. SDK配置的路径必须正确,64位系统和32位系统的lib目录路径不同,不要混淆。

  4. 程序退出前,必须调用ObjDevicePtr->Close()和IGXFactory::GetInstance().Uninit(),否则会导致相机占用,下次无法打开。

  5. 如果是GigE相机,必须确保相机IP和电脑IP在同一网段(比如电脑IP:192.168.0.5,相机IP:192.168.0.10),可通过GalaxyView软件修改相机IP。

  6. 代码中不要随意删除或修改核心语句(比如SDK初始化、释放资源的语句),否则会导致程序报错或相机异常。

配套资源下载(VS工程直接用)

本文配套完整VS2010控制台工程,已配置好SDK,无需手动配置,下载后直接用VS2010打开,编译运行即可。

资源包含:

  • 完整VS2010项目文件(.vcxproj、.sln等)

  • main.cpp(已粘贴完整代码)

  • SDK配置说明文档(备用)

下载地址: 【C++ 大恒相机】设备枚举 + 打开 + 开始采集 + 停止采集(完整控制台源码)

总结

本文实现了大恒相机最基础的设备枚举与打开关闭功能,纯控制台无界面,适合二次开发集成,全程详细讲解了从新建项目、SDK配置到运行测试的每一步,新手也能轻松上手。

后续将持续更新大恒相机C++控制台系列教程,涵盖取图、触发、参数设置等核心功能,关注我,后续内容不迷路!

如果运行过程中遇到问题,可在评论区留言,看到会第一时间回复解答。

相关推荐
6Hzlia4 小时前
【Hot 100 刷题计划】 LeetCode 131. 分割回文串 | C++ 回溯算法基础切割法
c++·算法·leetcode
山栀shanzhi4 小时前
FFmpeg编码封装流程骨架
c++·ffmpeg
6Hzlia4 小时前
【Hot 100 刷题计划】 LeetCode 1143. 最长公共子序列 | C++ 二维DP 与 哨兵技巧
c++·算法·leetcode
Hical_W4 小时前
告别回调地狱:在 C++ Web 框架中全面拥抱协程
c++·github
炘爚5 小时前
C++多线程编程:join与detach的致命陷阱
c++
51camera5 小时前
工业视觉系统中工业相机的选型维度
工业相机
小樱花的樱花5 小时前
4 文件选择对话框 QFileDialog
开发语言·c++·ui
leaves falling5 小时前
深入浅出 C++ STL list:从入门到精通
开发语言·c++
史迪仔01126 小时前
[QML] 交互事件深度解析:鼠标、键盘、拖拽
前端·c++·qt