前言
工业相机在现代制造和工业自动化中扮演了至关重要的角色,尤其是在高精度、高速度检测中。海康威视工业相机以其性能稳定、图像质量高、兼容性强而受到广泛青睐。特别是搞机器视觉的小伙伴们跟海康打交道肯定不在少数,笔者在平常项目中跟海康相关人员对接也是比较多。
那么,本文将全面介绍如何基于海康工业相机的 SDK,使用 Visual Studio 和 Qt 构建上位机程序,逐步实现工业相机的图像采集、显示以及参数配置。
以下是巴斯勒相机开发
巴斯勒工业相机SDK二次开发(VS+QT+巴斯勒SDK+C++)-CSDN博客
一、海康工业相机简介
1. 工业相机的主要功能
- 图像采集:捕获高速、高清的静态或动态图像。
- 高速传输:通过 GigE 或 USB 接口将图像传输到上位机。
- 稳定运行:设计用于工业环境,具有高可靠性。
2. 海康工业相机优势
- 高分辨率:支持从 0.3MP 到 50MP 的分辨率。
- 多接口:支持 USB 3.0、GigE、Camera Link 等多种接口。
- 全面 SDK 支持:提供多平台(Windows、Linux)的 SDK,支持 C++、C#、Python 等多种语言。
3. 常见型号
包含USB以及GigE 系列:
- MV-CA060-10GC:分辨率 0.6MP,帧率 100fps。
- MV-CH120-20UC:分辨率 12MP,帧率 20fps。
二、海康工业相机SDK下载
1.客户端下载
海康工业相机的sdk是跟随其上位机一起打包安装,我们只需要下载客户端安装即可。进入海康机器人官网,下载中心可以看到包括工业相机、读码器系列产品的客户端程序。我们选择下载最新4.40版本的客户端,按照默认步骤安装即可。
2.SDK浅析
安装完客户端后,打开安装目录。在Development文件内可以看见这几个文件夹,其中includes以及Libraries就包含了我们二次开发所需要用到的头文件、库文件以及附加依赖项。
简要说明:
Bin:已封装的可执行程序exe,包括win32、win64
Documentations:开发指南说明
DotNet:.NET Framework框架
Includes:头文件
Libraries:库文件
MVFG:采集卡
Samples:例程,包含c#、python、halcon、c++等多种语言
ThirdPartyPlatformAdapter:第三方平台
三、项目创建与配置
开发环境
- 操作系统:Windows
- 开发工具:Visual Studio 2022
- 图形界面库:Qt 5.14
- 图像处理库:OpenCV 4.10
- 其他:C++编程语言
1. 新建 Qt 项目
在 Visual Studio 中创建基于 Qt 的 C++ 项目:
- 打开 Visual Studio,点击
新建项目
。 - 选择
Qt Widgets Application
,设置项目名称和路径。
2. 添加海康 SDK以及OpenCV
(1) 添加头文件路径
在项目属性中:
- 右键项目,选择
属性
>C/C++
>常规
>附加包含目录
。 - 添加 SDK 的
Include
目录路径。
(2) 链接库文件
在项目属性中:
- 进入
链接器
>常规
>附加库目录
,添加 SDK 的Lib
目录。 - 在
链接器
>输入
>附加依赖项
中添加库文件:
四、系统实现
1.ui设计
ui界面仿照bin文件夹里面已经打包好的exe程序设计,实现相关功能。
包括:
QLabel:显示相机图像
QComboBox:显示搜索到的设备列表
QPushButton:搜索设备、开关设备、设置参数等功能
QRadioButton:切换图像采集模式
QCheckBox:软触发使能
2.主要功能实现
海康工业相机SDK主动取流流程如下所示:
详细步骤:
- 调用 MV_CC_Initialize() 初始化该SDK的运行环境,以便于提前申请和分配所必须的系统资源。
- (可选)调用 MV_CC_EnumDevices() 枚举子网内指定传输协议对应的所有设备。 可通过nTLayerType在结构 MV_CC_DEVICE_INFO() 中获取设备信息。
- (可选)打开指定设备前,调用 MV_CC_IsDeviceAccessible() 检查指定设备是否可访问。
- 调用 MV_CC_CreateHandle() 创建设备句柄。
- 调用 MV_CC_OpenDevice() 打开设备。
- (可选)执行以下一个或多个操作以获取/设置相机不同类型的参数。
- 获取/设置Int类型节点值:调用 MV_CC_GetIntValue() / MV_CC_SetIntValue()
- 获取/设置Float类型节点值:调用 MV_CC_GetFloatValue() / MV_CC_SetFloatValue()
- 获取/设置Enum类型节点值:调用 MV_CC_GetEnumValue() / MV_CC_SetEnumValue()
- 获取/设置Bool类型节点值:调用 MV_CC_GetBoolValue() / MV_CC_SetBoolValue()
- 获取/设置String类型节点值:调用 MV_CC_GetStringValue() / MV_CC_SetStringValue()
- 设置Command类型节点值:调用 MV_CC_SetCommandValue()
- 图像采集:
- (可选)调用 MV_CC_SetImageNodeNum() 设置图像缓存节点个数。当获取的图像数超过这个设定值,最早的图像数据会被自动丢弃。
- 调用 MV_CC_StartGrabbing() 开始取流。
- 对于原始图像数据,可调用 MV_CC_ConvertPixelTypeEx() 转换图像的像素格式,也可调用 MV_CC_SaveImageEx3() 转换成JPEG或BMP格式的图片,并保存成图片文件。
- 在应用程序层中重复调用 MV_CC_GetOneFrameTimeout() 来获取图片数据。
- 调用 MV_CC_StopGrabbing() 停止采集。
- 调用 MV_CC_CloseDevice() 关闭设备。
- 调用 MV_CC_DestroyHandle() 销毁句柄并释放资源。
- 调用 MV_CC_Finalize() 释放SDK资源。
①初始化SDK
nRet = MV_CC_Initialize();
if (MV_OK != nRet)
{
printf("Initialize SDK fail! nRet [0x%x]\n", nRet);
break;
}
②枚举设备
// ch:枚举设备 | en:Enum device
MV_CC_DEVICE_INFO_LIST stDeviceList;
memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE | MV_GENTL_CAMERALINK_DEVICE | MV_GENTL_CXP_DEVICE | MV_GENTL_XOF_DEVICE, &stDeviceList);
if (MV_OK != nRet)
{
printf("Enum Devices fail! nRet [0x%x]\n", nRet);
break;
}
if (stDeviceList.nDeviceNum > 0)
{
for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++)
{
printf("[device %d]:\n", i);
MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];
if (NULL == pDeviceInfo)
{
break;
}
PrintDeviceInfo(pDeviceInfo);
}
}
else
{
printf("Find No Devices!\n");
break;
}
③创建设备句柄
// ch:选择设备并创建句柄 | en:Select device and create handle
nRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);
if (MV_OK != nRet)
{
printf("Create Handle fail! nRet [0x%x]\n", nRet);
break;
}
④打开设备
// ch:打开设备 | en:Open device
nRet = MV_CC_OpenDevice(handle);
if (MV_OK != nRet)
{
printf("Open Device fail! nRet [0x%x]\n", nRet);
break;
}
⑤图像取流
// ch:开始取流 | en:Start grab image
nRet = MV_CC_StartGrabbing(handle);
if (MV_OK != nRet)
{
printf("Start Grabbing fail! nRet [0x%x]\n", nRet);
break;
}
五、系统效果
1.搜索设备显示在QComboBox并点击打开。
查找打开设备
2.连续、触发模式实现图像采集
连续、触发采集
3.修改曝光、增益等出图参数
参数修改
4.保存图片为jpg、bmp等格式
图片保存
顺带说一嘴,这个蜂蜜雀氏不错,冬天泡水喝暖暖的很贴心哈哈哈哈哈。 决非广告,但是背景太假哥给我打钱也不是不阔以!!!
六、总结
通过本文,完成了从环境配置到功能实现的完整开发流程。在此基础上,可以扩展更多功能,如多相机支持、图像处理、结合halcon、opencv检测等。
如有问题,欢迎评论区讨论!如果本文对您有帮助,请点赞支持!
可以关注我一下子,敬请期待后续功能实现~