当前位置: 首页 > news >正文

Gige协议 Qt版使用文档仅供个人使用

首先建立Vs的Qt程序,直接通过button和widge来显示图像;通过调用Gige的API来实现相机的控制,后面通过直接调用源码来控制,相信写完后对二次开发和Gige会有新的理解。

QT的开发方面转到这篇文章Qt 前端开发-CSDN博客

首先将相关的Gige放入到项目工程文件的同级目录,输出目录为../Release/DLL/Debug

需要将GigeAravis.lib放入同级目录下,之后如果调用的是Gige的库则不需要设立头文件例如

//#include <QImage>
//#include "../GigeProg/GigeMan.h"  
//#include "../GigeProg/ImageFile.h"
需要包含#include "GigeAravis.h"头文件放入sln目录下

开始调用调用Gige之前滤清思路

  1. 遍历后显示相机的地方,也就是list
  2. 记录相机个数如ID,IP,以及
  3. 遍历相机赋值

一.搜寻遍历工作

调用#include "GigeAravis.h"中的OpenGigeDevice();接口来获取活跃的相机个数,通过for循环遍历活跃相机,将找到的相机ID相连接,显示在操作的列表上以便于后续操作。

上面就结束了对于相机gige的寻找工作,部署完后会发现,软件界面不够清晰,在前端仅靠printf来查看操作不够现实,我们需要部署一份日志功能来对后面的操作进行查看,该项工作在操作Gige前完成更好。

private slots:
        void onLogMessage(const QString& message);

声明私有槽函数用于接收和处理信号。

private:
    QListWidget* logListWidget;   // 添加日志列表控件声明

    // 日志级别枚举
    enum class LogLevel { Info, Warning, Error, Critical };目的是评估日志的等级

    // 成员函数
    void addLog(const QString& message, LogLevel level); 

实现:

void Qt_GigeDemo::addLog(const QString& message, LogLevel level) {

    QListWidgetItem* item= new QListWidgetItem(treeB);
    QString levelText;
    QColor textColor;

    switch (level) {
    case LogLevel::Info:
        textColor = QColor(0, 120, 215); // 蓝色
        levelText = "INFO";
        break;
    case LogLevel::Warning:
        textColor = QColor(245, 128, 37); // 橙色
        levelText = "WARN";
        break;
    case LogLevel::Error:
        textColor = QColor(215, 40, 40); // 红色
        levelText = "ERROR";
        break;
    case LogLevel::Critical:
        textColor = QColor(192, 0, 0); // 深红色
        levelText = "CRITICAL";
        break;
    }

    item->setForeground(QBrush(textColor));

    // 添加时间戳和消息
    QString timeStr = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
    item->setText(QString("[%1] [%2] %3").arg(timeStr, levelText, message));


    treeB->addItem(item);
    treeB->scrollToBottom();

}

void Qt_GigeDemo::onLogMessage(const QString& message) {

    addLog(message, LogLevel::Info);

}

采集可观察到的日志已经有了,后面开始进行相机的打开的操作

打开方式选中,那么顺序是init后搜寻到相机,选中后选择打开


二.Open操作

首先先创建Qt自带的信号槽关联函数

void Qt_GigeDemo::on_treeA_currentRowChanged(int currentRow)

该函数用来确认我选择的具体相机,

函数的实现

void MainWindow::on_list_Gige_currentRowChanged(int currentRow)
{
    m_nCurIndex = currentRow;
}

m_nCurIndex该int用来记录选中的相机是第几个,我们初始化设置为-1;

之后就是遍历整个列表的个数我们设定为m_nCurCount,初始化为0

open解析

当选中列表中的相机后,m_nGigeIndex变为选中的相机标号,之后因为列表里已经有了相机个数不为0进入循环,将具体的编号给SetCurCamera进行相机的内部设定。

当前相机内部已经选择了所选中的相机,下一步进行里面内容的读取后面来改相机的参数

读取对应的相机内部信息。

打开相机就成功了,下面是相机的拍照


三.拍照

Qt已经部署好相关的显示和信号连接,接下来部署Gige相关的APi

QT的具体部署文章看下面跳转

Qt 图像显示-CSDN博客

显示相机,相机拍照要先理清概念,我们需要获得的几个数据才可以显示

1,图像的宽度和高度,也就是相机图像的尺寸

int nWidth = GetGigeWidth(m_nCurIndex);    // 获取当前相机的图像宽度
int nHeight = GetGigeHeight(m_nCurIndex);  // 获取当前相机的图像高度

2,计算内存对齐后的宽度

int nWidth = 65;  // 原始图像宽度(像素)
int alignBytes = 4;  // 按4字节对齐(常见于32位系统)
int nSaveWidth = alignBytes * ((nWidth + alignBytes - 1) / alignBytes);
// 计算结果:nSaveWidth = 4 * ((65 + 3) / 4) = 4 * 17 = 68

3,分配内存并获取原始图像数据

int nSize = nHeight * nSaveWidth; // 计算图像数据大小(字节数)
LPBYTE lpData = new BYTE[nSize];   // 分配原始图像数据内存
memset(lpData, 0, nSize);          // 初始化内存为0
GetGigeMatrix(lpData, m_nCurIndex); // 从相机获取原始图像数据

4.通过API来获取图像

GetGigeMatrix(lpData, m_nGigeIndex);

5.因为是要在Qt中显示,我们需要将获取的图像来做一个Qt识别的转化

之后就可以显示了,看一下效果


四.视频

视频与拍照不通,视频需要一个视频流作为反馈,需要建立处理底层窗口系统消息的虚函数nativeEvent

作用是监听特定的图像消息,当图像有更新时触发相应的显示操作。

GIGE_IMAGE_MSG 以及 wParam/lParam 的参数约定是由相机 SDK 预先定义好的,直接调用即可。

当系统监听到图像有变换时,触发_ShowVideoImage(idx)函数。

查看效果


五.下载

下载对比前面的工作就要简单很多,我们只需要加一个 QImage m_currentImage,用来在触发拍照时copy给他就可以

就可以达到保存相册的目的


六.关闭相机

调用固定的APi就可以


上述可以完成支持Gige协议的相机进行二次开发,完成非标项目。

http://www.lryc.cn/news/578325.html

相关文章:

  • Mac中如何Chrome禁用更新[update chflags macos]
  • RabbitMQ简单消息发送
  • Qt自定义外观详解
  • 大麦基于HarmonyOS星盾安全架构,打造全链路安全抢票方案
  • MySQL 中 InnoDB 存储引擎与 MyISAM 存储引擎的区别是什么?
  • PDFBox + Tess4J 从PDF中提取图片OCR识别文字
  • 发票PDF处理工具,智能识别合并一步到位
  • [特殊字符] 分享裂变新姿势:用 UniApp + Vue3 玩转小程序页面分享跳转!
  • .netcore+ef+redis+rabbitmq+dotcap先同步后异步再同步的方法,亲测有效
  • 植物small RNA靶基因预测软件,psRobot
  • 网络的相关概念
  • Java ArrayList顺序表 + 接口实现 + 底层
  • jQuery UI 安装使用教程
  • Electron 进程间通信(IPC)深度优化指南
  • mysql 双主集群故障修复
  • TensorFlow源码深度阅读指南
  • 清理 Docker 缓存占用
  • 第 1 课:Flask 简介与环境配置(Markdown 教案)
  • 深度解析基于贝叶斯的垃圾邮件分类
  • 如何让宿主机完全看不到Wi-Fi?虚拟机独立联网隐匿上网实战!
  • 基础算法合集-图论
  • 我认知的AI宇宙系列第三期
  • 贪心算法在C++中的应用与实践
  • 论文中用matplotlib画的图,如何保持大小一致。
  • 「Java案例」计算矩形面积
  • 嵌入式原理与应用篇---常见基础知识(10)
  • 湖北理元理律师事务所债务解法:从法律技术到生活重建
  • 大根堆加小根堆查找中位数o(N)时间复杂度
  • 【Springai】项目实战进度和规划
  • DFMEA检查表模板下载