V20251030-2.1.1

修复相机取流崩溃的bug。
加快海康相机初始化的速度。
This commit is contained in:
2025-10-30 15:21:58 +08:00
parent 6ab9c1b597
commit d76078959f
10 changed files with 129 additions and 684 deletions
@@ -25,6 +25,16 @@ bool ifRunning = false;
MV_CC_DEVICE_INFO_LIST m_stDevList; // ch:设备信息列表结构体变量,用来存储设备列表
//MV_GENTL_IF_INFO_LIST m_stIFList;
void CloseDevice();
static MV_CC_DEVICE_INFO_LIST QByteArrayToMV_CC_DeviceInfoList(const QByteArray& byteArray) {
MV_CC_DEVICE_INFO_LIST deviceInfoList;
if (byteArray.size() == sizeof(MV_CC_DEVICE_INFO_LIST)) {
memcpy(&deviceInfoList, byteArray.constData(), sizeof(MV_CC_DEVICE_INFO_LIST));
}
else {
qDebug() << "Invalid size of QByteArray for MV_CC_DEVICE_INFO_LIST!";
}
return deviceInfoList;
}
QString byteArrayToUnicode(const QByteArray array) {
// state用于保存转换状态,它的成员invalidChars,可用来判断是否转换成功
@@ -93,9 +103,15 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
//搜索所有设备
int SearchDevice()
{
memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
// ch:枚举子网内所有设备 | en:Enumerate all devices within subnet
int nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &m_stDevList);
if (m_stDevList.nDeviceNum == 0) {
memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
// ch:枚举子网内所有设备 | en:Enumerate all devices within subnet
int nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &m_stDevList);
if (MV_OK != nRet)
{
return 0;
}
}
for (int i = 0; i < m_stDevList.nDeviceNum; i++)
{
//SN
@@ -109,10 +125,6 @@ int SearchDevice()
break;
}
}
if (MV_OK != nRet)
{
return 0;
}
return -1;
}
@@ -246,13 +258,13 @@ void _stdcall ExceptionCB(unsigned int nMesgType, void* pUser) {
}
Hd_CameraModule_HIK_hard_PCIE* create()
Hd_CameraModule_HIK_soft_GIGE* create()
{
qDebug() << "[INFO] " << "Hd_CameraModule_HIK create success!";
return new Hd_CameraModule_HIK_hard_PCIE;
return new Hd_CameraModule_HIK_soft_GIGE;
}
void destory(Hd_CameraModule_HIK_hard_PCIE* ptr)
void destory(Hd_CameraModule_HIK_soft_GIGE* ptr)
{
if (ptr)
{
@@ -348,12 +360,12 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
<< "--CameraName:" << QString::fromStdString(Username) << " imgIndex:" << imgCnt << "nFrameNum : " << frameNum;
}
Hd_CameraModule_HIK_hard_PCIE::Hd_CameraModule_HIK_hard_PCIE()
Hd_CameraModule_HIK_soft_GIGE::Hd_CameraModule_HIK_soft_GIGE()
{
//m_thread = new MyThread;
//m_mutex = new QMutex();
}
Hd_CameraModule_HIK_hard_PCIE::~Hd_CameraModule_HIK_hard_PCIE()
Hd_CameraModule_HIK_soft_GIGE::~Hd_CameraModule_HIK_soft_GIGE()
{
CloseDevice();
if (n_mutex)
@@ -365,7 +377,7 @@ Hd_CameraModule_HIK_hard_PCIE::~Hd_CameraModule_HIK_hard_PCIE()
qDebug() << "[INFO] " << " delete success!";
}
//从类中读数据到实例对象
bool Hd_CameraModule_HIK_hard_PCIE::readData(std::vector<cv::Mat>& mat, QByteArray& data)
bool Hd_CameraModule_HIK_soft_GIGE::readData(std::vector<cv::Mat>& mat, QByteArray& data)
{
if (queuepic.isEmpty())
{
@@ -382,9 +394,16 @@ bool Hd_CameraModule_HIK_hard_PCIE::readData(std::vector<cv::Mat>& mat, QByteArr
}
//实例对象把数据写入到类;加载模型后会运行此函数
bool Hd_CameraModule_HIK_hard_PCIE::writeData(std::vector<cv::Mat>& mat, QByteArray& data)
bool Hd_CameraModule_HIK_soft_GIGE::writeData(std::vector<cv::Mat>& mat, QByteArray& data)
{
Q_UNUSED(mat);
if (data.contains("deviceList")) {
auto result = QByteArrayToMV_CC_DeviceInfoList(data.mid(10));
if (result.nDeviceNum != 0) {
m_stDevList = result;
return true;
}
}
QStringList dataList = QString::fromUtf8(data).split("_");
//2024.02.18更新,相机对应的读SN信号时,表示新产品进入,设置初始值
if (data == "rest_newProductIn")
@@ -430,7 +449,7 @@ bool Hd_CameraModule_HIK_hard_PCIE::writeData(std::vector<cv::Mat>& mat, QByteAr
return true;
}
//传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1...
bool Hd_CameraModule_HIK_hard_PCIE::initParas(QByteArray& initData)
bool Hd_CameraModule_HIK_soft_GIGE::initParas(QByteArray& initData)
{
QByteArrayList valueList = initData.split('+');
Username = valueList[0];
@@ -512,7 +531,7 @@ bool Hd_CameraModule_HIK_hard_PCIE::initParas(QByteArray& initData)
return ifOk;
}
bool Hd_CameraModule_HIK_hard_PCIE::run()
bool Hd_CameraModule_HIK_soft_GIGE::run()
{
//queuepic.clear();
qDebug() << "[INFO] " << " run start" << QString::fromStdString(Username);
@@ -571,7 +590,7 @@ bool Hd_CameraModule_HIK_hard_PCIE::run()
}
//相机连接状态:正常连接或断开
bool Hd_CameraModule_HIK_hard_PCIE::checkStatus()
bool Hd_CameraModule_HIK_soft_GIGE::checkStatus()
{
//status = moduleStatus;
return moduleStatus;
@@ -1,5 +1,5 @@
#ifndef Hd_CameraModule_HIK_hard_PCIE_H
#define Hd_CameraModule_HIK_hard_PCIE_H
#ifndef Hd_CameraModule_HIK_soft_GIGE_H
#define Hd_CameraModule_HIK_soft_GIGE_H
#include <QtCore/qglobal.h>
#include <MvCameraControl.h>
#include <CameraParams.h>
@@ -14,11 +14,11 @@
using namespace cv;
#pragma execution_character_set("utf-8")
class Hd_CameraModule_HIK_hard_PCIE :public dsModuleBase
class Hd_CameraModule_HIK_soft_GIGE :public dsModuleBase
{
public:
Hd_CameraModule_HIK_hard_PCIE();
virtual ~Hd_CameraModule_HIK_hard_PCIE();
Hd_CameraModule_HIK_soft_GIGE();
virtual ~Hd_CameraModule_HIK_soft_GIGE();
//从类中读数据到实例对象
bool readData(std::vector<cv::Mat>& mat, QByteArray& data);
//实例对象把数据写入到类
@@ -35,9 +35,9 @@ private:
extern "C"
{
Q_DECL_EXPORT Hd_CameraModule_HIK_hard_PCIE * create();
Q_DECL_EXPORT void destory(Hd_CameraModule_HIK_hard_PCIE * ptr);
Q_DECL_EXPORT Hd_CameraModule_HIK_soft_GIGE * create();
Q_DECL_EXPORT void destory(Hd_CameraModule_HIK_soft_GIGE * ptr);
}
#endif // Hd_CameraModule_HIK_hard_H
//Hd_CameraModule_HIK_hard_PCIE
//Hd_CameraModule_HIK_soft_GIGE