本文将基于海康3D相机SDK的回调模式,通过具体代码讲解如何完成从设备初始化到图像采集的完整流程。以下是标准的流程图和具体的开发步骤。
一、开发流程概述
流程分为以下几个关键步骤:
- 运行环境初始化 :调用
MV3D_LP_Initialize()
,初始化SDK运行环境。 - 设备发现 :调用
MV3D_LP_GetDeviceNumber()
和MV3D_LP_GetDeviceList()
,获取设备数量和设备列表。 - 设备连接 :通过
MV3D_LP_OpenDeviceBySN()
或MV3D_LP_OpenDeviceByIp()
连接设备。 - 参数管理 (可选):通过
MV3D_LP_GetParam()
获取参数,或通过MV3D_LP_SetParam()
设置参数。 - 注册回调:注册异常消息和图像数据的回调函数。
- 采集启动与停止 :调用
MV3D_LP_StartMeasure()
和MV3D_LP_StopMeasure()
,控制设备工作。 - 关闭设备与环境释放 :调用
MV3D_LP_CloseDevice()
和MV3D_LP_Finalize()
完成设备关闭与资源释放。
流程图如下:
二、完整开发代码详解
1. 初始化运行环境
在应用启动时,首先调用MV3D_LP_Initialize()
进行SDK环境的初始化。如果初始化失败,需要及时退出并提示用户。
cpp
if (MV3D_LP_Initialize() != MV3D_LP_OK) {
qDebug() << "SDK运行环境初始化失败";
return;
}
qDebug() << "SDK运行环境初始化成功";
2. 获取设备列表
通过MV3D_LP_GetDeviceNumber()
获取设备数量,然后调用MV3D_LP_GetDeviceList()
获取设备的详细信息,并在界面显示。
cpp
MV3D_LP_DEVICE_INFO deviceInfos[16];
uint32_t deviceCount = 0;
// 获取设备数量和列表
if (MV3D_LP_GetDeviceList(deviceInfos, 16, &deviceCount) == MV3D_LP_OK) {
qDebug() << "发现设备数量:" << deviceCount;
for (uint32_t i = 0; i < deviceCount; i++) {
qDebug() << "设备序号:" << i
<< "型号:" << deviceInfos[i].chModelName
<< "序列号:" << deviceInfos[i].chSerialNumber;
}
} else {
qDebug() << "获取设备列表失败";
}
3. 打开设备
支持两种方式连接设备:
- 通过序列号打开 :使用
MV3D_LP_OpenDeviceBySN()
。 - 通过IP地址打开 :使用
MV3D_LP_OpenDeviceByIp()
。
代码示例:
cpp
char* deviceSN = "输入设备序列号";
MV3D_LP_HANDLE handle;
// 通过序列号打开设备
if (MV3D_LP_OpenDeviceBySN(&handle, deviceSN) != MV3D_LP_OK) {
qDebug() << "设备打开失败";
return;
}
qDebug() << "设备打开成功";
4. 注册回调函数
- 异常消息回调 :通过
MV3D_LP_RegisterExceptionCallBack()
,实时监控设备异常。 - 图像数据回调 :通过
MV3D_LP_RegisterImageDataCallBack()
,处理图像数据。
示例代码:
cpp
// 注册异常回调
if (MV3D_LP_RegisterExceptionCallBack(handle, ExceptionCallBackFunc, nullptr) != MV3D_LP_OK) {
qDebug() << "注册异常回调失败";
}
// 注册图像数据回调
if (MV3D_LP_RegisterImageDataCallBack(handle, ImageCallBackFunc, this) != MV3D_LP_OK) {
qDebug() << "注册图像回调失败";
}
5. 启动采集
启动采集调用MV3D_LP_StartMeasure()
,停止采集调用MV3D_LP_StopMeasure()
。
采集启动代码:
cpp
if (MV3D_LP_StartMeasure(handle) != MV3D_LP_OK) {
qDebug() << "采集启动失败";
} else {
qDebug() << "采集启动成功";
}
采集停止代码:
cpp
if (MV3D_LP_StopMeasure(handle) != MV3D_LP_OK) {
qDebug() << "停止采集失败";
} else {
qDebug() << "停止采集成功";
}
6. 回调函数实现
图像数据回调 :
在回调中处理采集的图像数据,并使用Halcon生成图像对象:
cpp
void __stdcall ImageCallBackFunc(MV3D_LP_IMAGE_DATA* imageData, void* user) {
if (!imageData || !imageData->bValid) {
qDebug() << "无效的图像数据";
return;
}
HObject hImage;
try {
// 根据图像类型生成Halcon图像对象
if (imageData->enImageType == ImageType_Mono8) {
HalconCpp::GenImage1(&hImage, "byte", imageData->nWidth, imageData->nHeight, reinterpret_cast<Hlong>(imageData->pData));
} else if (imageData->enImageType == ImageType_RGB24_Packed) {
HalconCpp::GenImageInterleaved(&hImage, reinterpret_cast<Hlong>(imageData->pData), "rgb", imageData->nWidth, imageData->nHeight, -1, "byte", 0, 0, 0, 0, -1, 0);
}
// 在界面显示图像
emit static_cast<MainWindow*>(user)->dispImage(hImage, "图像数据");
} catch (HException& e) {
qDebug() << "图像处理失败:" << e.ErrorMessage().Text();
}
}
7. 关闭设备与释放环境
在程序退出时,必须关闭设备并释放运行环境:
cpp
if (MV3D_LP_CloseDevice(&handle) != MV3D_LP_OK) {
qDebug() << "设备关闭失败";
} else {
qDebug() << "设备关闭成功";
}
MV3D_LP_Finalize(); // 释放SDK环境
qDebug() << "SDK资源释放完成";
三、资源下载
为了方便开发者快速上手,我们提供了完整的工程源码和开发手册,包含以下内容:
- 工程源码:基于Qt + Halcon + 海康3D相机SDK的完整项目代码。
- 开发手册:海康3D相机的官方开发文档,详细描述SDK API的使用方法及示例。
您可以通过以下网盘链接下载:
- 下载链接 :海康3D相机(3DMVS+HALCON)工程源码及开发手册
https://pan.baidu.com/s/1_Rzx_P5E8TcQTRSe9I1Z1g?pwd=jkcf - 提取码 :
jkcf