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之前滤清思路
- 遍历后显示相机的地方,也就是list
- 记录相机个数如ID,IP,以及
- 遍历相机赋值
一.搜寻遍历工作
调用#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协议的相机进行二次开发,完成非标项目。