Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用,本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理,帮助开发者快速理解如何通过代码控制相机,实时采集并处理图像数据。***
在这里插入图片描述

在这里插入图片描述

1. 搜索并枚举相机设备

这个部分主要是枚举所有连接的相机设备,并在界面上显示设备的序列号,供用户选择。

void MainWindow::on_btnSeachCamera_clicked() {ui->listWidget->clear();  // 清空当前相机列表int nRet = MV_OK;bool isGige = ui->radioGIGE->isChecked();  // 判断选择的是 GIGE 还是 USB 连接// 枚举相机if (isGige) {nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE, &cameraList);if (nRet != MV_OK) {setLastErrorMsg(tc("C10: 未找到可用网口相机, 错误码: %1").arg(nRet));}} else {nRet = MV_CC_EnumDevices(MV_USB_DEVICE, &cameraList);if (nRet != MV_OK) {setLastErrorMsg(tc("C10: 未找到可用 USB 相机, 错误码: %1").arg(nRet));return;}}// 如果没有找到相机,返回提示if (cameraList.nDeviceNum == 0) {setLastErrorMsg(tc("C10: 未找到任何可用相机"));return;}// 将找到的相机序列号添加到 UI 列表中for (int i = 0; i < cameraList.nDeviceNum; i++) {const char *serial = isGige? reinterpret_cast<char *>(cameraList.pDeviceInfo[i]->SpecialInfo.stGigEInfo.chSerialNumber): reinterpret_cast<char *>(cameraList.pDeviceInfo[i]->SpecialInfo.stUsb3VInfo.chSerialNumber);ui->listWidget->addItem(serial);}
}
  • 主要功能:枚举设备,根据用户选择的接口类型(GIGE或USB),调用 MV_CC_EnumDevices 获取连接到计算机的相机列表。
  • UI 更新:将所有找到的设备序列号添加到列表控件中供用户选择。

2. 创建设备句柄并连接设备

用户在选择相机并点击“连接”按钮后,程序会为选定的相机创建句柄,并尝试连接设备。

void MainWindow::on_btnconnect_clicked() {MV_CC_DEVICE_INFO cameraInfo;int nRet = MV_OK;unsigned int i = 0;  // 假设选择了第一个相机// 创建设备句柄memcpy(&cameraInfo, cameraList.pDeviceInfo[i], sizeof(MV_CC_DEVICE_INFO));nRet = MV_CC_CreateHandle(&m_handle, &cameraInfo);if (nRet != MV_OK) {setLastErrorMsg(tc("C12: 相机 #%1 初始化失败, 错误码: %2").arg(i).arg(nRet));return;}// 打开设备nRet = MV_CC_OpenDevice(m_handle, MV_ACCESS_Exclusive);if (nRet != MV_OK) {setLastErrorMsg(tc("C14: 相机 #%1 打开失败, 错误码: %2").arg(i).arg(nRet));return;}m_fram = (cameraInfo.nTLayerType == MV_GIGE_DEVICE) ? 0 : -1;
}
  • 创建句柄MV_CC_CreateHandle 函数使用选中的设备信息 cameraInfo 创建相机句柄 m_handle
  • 打开设备:通过 MV_CC_OpenDevice 打开相机,并指定独占模式(MV_ACCESS_Exclusive),避免其他进程访问该设备。
  • 帧计数初始化:如果是网口设备(GIGE),初始化帧计数器 m_fram 为 0;否则设为 -1,表示未初始化。

3. 设置相机触发模式

用户可以通过界面选择不同的触发模式,包括连续采集、软件触发和硬件触发。相机的触发模式会影响图像采集的方式。

void MainWindow::on_comboBox_activated(int index) {ui->btn_Grab->setVisible(index == OpenSoftWare);  // 仅在软件触发模式下显示抓拍按钮int nRet = MV_OK;// 设置触发模式switch (index) {case OpenContinue:  // 连续采集模式nRet = MV_CC_SetEnumValue(m_handle, "TriggerMode", 0);break;case OpenSoftWare:  // 软件触发模式nRet = MV_CC_SetEnumValue(m_handle, "TriggerMode", 1);if (nRet == MV_OK) nRet = MV_CC_SetEnumValue(m_handle, "TriggerSource", 7);  // 设置触发源为软件break;case OpenHardWare:  // 硬件触发模式nRet = MV_CC_SetEnumValue(m_handle, "TriggerMode", 1);if (nRet == MV_OK) nRet = MV_CC_SetEnumValue(m_handle, "TriggerSource", 0);  // 触发源为硬件if (nRet != MV_OK) nRet = MV_CC_SetEnumValue(m_handle, "TriggerSource", 1);if (nRet == MV_OK) nRet = MV_CC_SetEnumValue(m_handle, "TriggerActivation", 0);  // 触发激活为上升沿break;}if (nRet != MV_OK) {setLastErrorMsg(tc("C24: 设置触发模式失败, 错误码: %1").arg(nRet));}
}
  • 连续采集:设置触发模式为 0(关闭触发模式),相机会自动连续采集图像。
  • 软件触发:设置触发模式为 1,并将触发源设置为软件触发源(值为 7),之后可以通过代码发送触发命令来抓取图像。
  • 硬件触发:设置触发模式为 1,触发源为硬件触发通道 0 或 1(如硬件引脚输入触发信号)。

4. 图像采集回调函数 - ImageCallBack

每当相机采集到一帧图像时,都会触发 ImageCallBack 回调函数。该函数负责将图像数据转换为 Halcon 格式并显示在 UI 界面中。

void ImageCallBack(unsigned char *pData, MV_FRAME_OUT_INFO_EX *pFrameInfo, void *pUser) {clock_t EnterTime = clock();MainWindow *camera = static_cast<MainWindow *>(pUser);// 更新相机图像参数信息到 UI 显示camera->ui->lab_W->setText(QString::number(pFrameInfo->nWidth));camera->ui->lab_H->setText(QString::number(pFrameInfo->nHeight));camera->ui->lab_P->setText(QString::number(pFrameInfo->nFrameNum));camera->ui->lab_tri->setText(QString::number(pFrameInfo->nTriggerIndex));try {HalconCpp::HObject ho_Image;int ImageWidth = pFrameInfo->nWidth;int ImageHeight = pFrameInfo->nHeight;// 根据像素格式生成 Halcon 图像对象switch (pFrameInfo->enPixelType) {case PixelType_Gvsp_Mono8:HalconCpp::GenImage1(&ho_Image, "byte", ImageWidth, ImageHeight, reinterpret_cast<Hlong>(pData));break;case PixelType_Gvsp_RGB8_Packed:HalconCpp::GenImageInterleaved(&ho_Image, reinterpret_cast<Hlong>(pData), "rgb",ImageWidth, ImageHeight, -1, "byte", 0, 0, 0, 0, -1, 0);break;case PixelType_Gvsp_BayerRG8:HalconCpp::GenImage1(&ho_Image, "byte", ImageWidth, ImageHeight, reinterpret_cast<Hlong>(pData));HalconCpp::CfaToRgb(ho_Image, &ho_Image, "bayer_rg", "bilinear");break;default:HalconCpp::GenImageConst(&ho_Image, "byte", ImageWidth, ImageHeight);break;}// 显示图像camera->detect(ho_Image);} catch (const HalconCpp::HException &) {camera->setLastErrorMsg(tc("C25: 相机图像数据格式转换失败"));}
}
  • 图像数据转换:根据 pFrameInfo->enPixelType 中的像素类型,调用 Halcon 库的不同函数将图像数据 pData 转换

为 Halcon 图像对象 ho_Image

  • 图像显示:调用 camera->detect(ho_Image); 将转换后的图像显示在 UI 窗口中。
  • 异常处理:若图像数据转换失败,则会记录错误信息。

5. 异常处理回调函数 - ExceptionCallBack

当设备连接断开或发生其他异常情况时,SDK 会调用该异常回调函数。我们可以在此函数中记录并显示错误信息,提示用户相机状态异常。

void ExceptionCallBack(unsigned int nMsgType, void *pUser) {if (nMsgType == MV_EXCEPTION_DEV_DISCONNECT) {MainWindow *camera = static_cast<MainWindow *>(pUser);camera->setLastErrorMsg(tc("C26: 相机连接断开"));}
}
  • 主要功能:判断消息类型 nMsgType 是否为设备断开事件 MV_EXCEPTION_DEV_DISCONNECT。若设备断开,程序会调用 setLastErrorMsg 显示错误信息。

总结

这段代码实现了通过海康 SDK 控制工业相机的主要功能,包括设备搜索、创建句柄、设置触发模式、图像采集和异常处理。该流程在实际的机器视觉应用中很常见,适用于产品质量检测、生产线监控等场景。流程概括如下:

  1. 设备枚举:找到并列出所有连接的相机设备,供用户选择。
  2. 创建句柄和连接设备:为选定设备创建句柄并连接设备。
  3. 触发模式设置:支持多种采集模式(如连续采集、软件触发、硬件触发),用户可以根据实际需求选择。
  4. 图像采集回调:采集到图像后触发回调,将图像数据转换为 Halcon 格式并显示。
  5. 异常处理:实时监控设备状态,当设备断开时触发异常回调并记录提示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60440.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDLBIts习题(5):移位寄存器

&#xff08;1&#xff09;易错习题1&#xff1a;109题&#xff08;shift18&#xff09; 对算数左移和算数右移概念不清&#xff0c;不知道该如何计算。 逻辑左移和算术左移之间没有区别。&#xff08;无论是有符号位数据还是无符号位数据&#xff0c;右侧补0&#xff09; 逻辑…

想要成为独立游戏作者 :通关!游戏设计之道 2-2 关卡设计

本文通过ai辅助总结加个人微调,不喜勿喷 前篇如下&#xff1a; 想要成为独立游戏作者 &#xff1a;通关&#xff01;游戏设计之道 2-1 HUD-CSDN博客 1.关卡的多重定义 在电子游戏行业里 “关卡” 有多种含义&#xff0c;如游戏行为发生的环境、分割的游戏体验单元、量…

【深圳大学】数据结构A+攻略(计软版)

1. 考试 1.1 形式 分为平时&#xff0c;笔试&#xff0c;机试三部分。其中&#xff1a; 平时占30%&#xff0c;包含平时OJ测验和课堂练习&#xff0c;注意这个可能会因老师的不同和课题组的新策略而改变。笔试占60%&#xff0c;是分值占比的主要部分。机试占10%。 1.2 题型…

Springboot 启动端口占用如何解决

Springboot 启动端口占用如何解决 1、报错信息如下 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 9010 was already in use.Action:Identify and stop the process thats listening o…

H.264/H.265播放器EasyPlayer.js RTSP播放器关于webcodecs硬解码H265的问题

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方式&#xff0c…

集合类源码浅析のJDK1.8ConcurrentHashMap(上篇)

文章目录 前言一、概述二、CHM的属性1、属性 三、新增方法1、put2、initTable 四、分段计数1、addCount2、fullAddCount3、sumCount 总结 前言 本篇是JDK1.8的ConcurrentHashMap源码个人学习笔记&#xff0c;ConcurrentHashMap&#xff08;笔记中简称CHM&#xff09;是一种线程…

Linux权限和开发工具(3)

文章目录 1. 简单理解版本控制器Git1. 如何理解版本控制 2. Git的操作2.1 Git安装2.2 Git提交身份2.3 Git提交命令2.4 Git版本管理2.5 Git下的同步 3. gdb命令3.1解决gdb的难用问题3.2 gdb/cgdb的使用 1. 简单理解版本控制器Git 1. 如何理解版本控制 我们在做项目的时候可能会…

抓包工具WireShark使用记录

目录 网卡选择&#xff1a; 抓包流程&#xff1a; 捕获过滤器 常用捕获过滤器&#xff1a; 抓包数据的显示 显示过滤器&#xff1a; 常用的显示过滤器&#xff1a; 实际工作中&#xff0c;在平台对接&#xff0c;设备对接等常常需要调试接口&#xff0c;PostMan虽然可以进…

腾讯云双十一重磅福利----下一代CDN-EdgeOne

&#x1f34b;引言 随着全球互联网的快速发展和网络安全威胁的不断升级&#xff0c;传统的内容分发网络&#xff08;CDN&#xff09;已逐渐无法满足高效、安全、灵活的需求。腾讯云的下一代CDN产品—EdgeOne应运而生&#xff0c;凭借其全球化边缘节点架构&#xff0c;为客户提供…

Unity Coroutine

调用函数时&#xff0c;函数将运行到完成状态&#xff0c;然后返回。这实际上意味着在函数中发生的任何动作都必须在单帧更新内发生&#xff1b;函数调用不能用于包含程序性动画或随时间推移的一系列事件。例如&#xff0c;假设需要逐渐减少对象的 Alpha&#xff08;不透明度&a…

qt QGraphicsProxyWidget详解

1. 概述 QGraphicsProxyWidget 类是 Qt 图形视图框架中的一个关键类&#xff0c;它允许 QWidget 组件被嵌入到 QGraphicsScene 中。QGraphicsProxyWidget 作为一个代理&#xff0c;它在 QGraphicsScene 和 QWidget 之间建立了桥梁&#xff0c;使得 QWidget 可以在 QGraphicsVi…

【数据集】GPM IMERG Daily Precipitation Dataset

目录 数据集概述时空分辨率:数据下载参考数据集概述 Global Precipitation Measurement (GPM) IMERG Daily Precipitation Dataset 简介 Global Precipitation Measurement (GPM) 是由美国国家航空航天局(NASA)和日本宇宙航空研究开发机构(JAXA)联合发起的一项全球降水观…

MySQL 迁移 dm

参考链接 此处为语雀内容卡片&#xff0c;点击链接查看&#xff1a;MySQL 5.7.27 迁移 DM 8 语雀 迁移前准备 以下中的命名&#xff0c;密码都是可修改的&#xff0c;这里给出的就只是一个例子 创建表空间 # 创建表空间名为 dbTest&#xff0c;路径为 Z:\fei\data\dm\dbT…

新版IJidea 如何打开数据库窗口(2024.2.4 版)(连接数据库)

新版IJidea 2024.2.4 如何打开数据库窗口&#xff1f; 方式&#xff1a;使用插件&#xff0c;Database Navigator 1.安装插件&#xff0c;步骤如下&#xff1a; 打开 Settings/Preferences 对话框&#xff08;快捷键 CtrlAltS&#xff09;。前往 Plugins 菜单项。在搜索框中…

MySQL:left join后用on与where的区别

一、前言 前几天项目中&#xff0c;写SQL时本想通过 A left B join on and 后面的条件来使查出的两条记录变成一条&#xff0c;奈何发现还是有两条。在此记录一下&#xff0c;on与where的区别。 二、ON 原始数据展示 SELECT t1.*,t2.* FROM t_test_staff t1 left join t_te…

Spark 核心概念与宽窄依赖的详细解析

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

【树莓派raspberrypi烧录Ubuntu远程桌面登入树莓派】

提示&#xff1a;本文利用的是Ubuntu主机和树莓派4B开发板&#xff0c;示例仅供参考 文章目录 一、树莓派系统安装下载前准备工作下载安装树莓派的官方烧录软件imagerimager的使用方法 二、主机与树莓SSH连接查看数梅派IP地址建立ssh连接更新树莓派源地址 三、主机端远程桌面配…

MySQL数据库专栏(四)MySQL数据库链接操作C#篇

摘要 本篇文章主要介绍C#链接MySQL数据库的接口介绍&#xff0c;使用实例及注意事项&#xff0c;辅助类的封装及调用实例&#xff0c;可以直接移植到项目里面使用。 目录 1、添加引用 2、接口介绍 2.1、MySqlConnection 2.2、MySqlCommand 2.3、MySqlDataReader…

百度世界2024:AI应用的浪潮时刻

百度AI公式&#xff1a;“技术商业社会”。 作者|金豫 编辑|杨舟 互联网行业正迈入增长瓶颈期&#xff0c;这一点从主要科技巨头&#xff0c;如Meta、Alphabet、腾讯等近年来的表现中可见端倪&#xff1a;广告收入增速放缓&#xff0c;市场渗透率接近饱和。 单纯依赖流量获取…

Linux 通过nmcli配置网络并配置bond(网卡绑定)

Linux 通过nmcli配置网络并配置bond Linux 通过nmcli配置网络并配置bond1. 什么是 Bond 网卡绑定2. Bond 网卡绑定的常见模式3. 通过nmcli配置网络并做网卡绑定 Linux 通过nmcli配置网络并配置bond 1. 什么是 Bond 网卡绑定 Bond 网卡绑定&#xff08;或 NIC Bonding&#xff…