升级到c++11,在存图文件夹不存在时自动创建,修复大量以byte为变量名的问题

This commit is contained in:
rci
2024-09-30 15:36:39 +08:00
parent ddde443cc9
commit a90d0d2471
45 changed files with 833 additions and 203 deletions
@@ -138,23 +138,23 @@ void Hd_CameraModule_3DKeyence::LJXA_ACQ_CloseDevice(int lDeviceId)
}
bool Hd_CameraModule_3DKeyence::decodeInitData(QByteArray byte,QVector<QByteArray> &vector_data)
bool Hd_CameraModule_3DKeyence::decodeInitData(QByteArray byteArray,QVector<QByteArray> &vector_data)
{
while (!byte.isEmpty())
while (!byteArray.isEmpty())
{
int type = 0;
QByteArray m_type = byte.mid(0,4);
QByteArray m_type = byteArray.mid(0,4);
memcpy((void*)&type,(void*)m_type.data(), 4);
byte.remove(0,4);
byteArray.remove(0,4);
int len = 0;
QByteArray m_len = byte.mid(0,4);
QByteArray m_len = byteArray.mid(0,4);
memcpy((void*)&len,(void*)m_len.data(), 4);
byte.remove(0,4);
byteArray.remove(0,4);
QByteArray mm_data = byte.mid(0,len);
QByteArray mm_data = byteArray.mid(0,len);
vector_data.append(mm_data);
byte.remove(0,len);
byteArray.remove(0,len);
}
return true;
}
@@ -59,7 +59,7 @@ public:
//int LJXA_ACQ_AcquireAsync(int lDeviceId, unsigned short* heightImage, unsigned short* luminanceImage, LJXA_ACQ_SETPARAM* setParam, LJXA_ACQ_GETPARAM* getParam);
void LJXA_ACQ_CloseDevice(int lDeviceId);
bool decodeInitData(QByteArray byte,QVector<QByteArray> &vector_data);
bool decodeInitData(QByteArray byteArray,QVector<QByteArray> &vector_data);
bool InitHighSpeed();
private:
//int LJXA_ACQ_Acquire(int lDeviceId, unsigned short* heightImage, unsigned short* luminanceImage, LJXA_ACQ_SETPARAM* setParam, LJXA_ACQ_GETPARAM* getParam);
@@ -1,6 +1,6 @@
#include "Hd_CameraModule_HIK_hard.h"
#include <QDebug>
using namespace std;
#include <QTextCodec>
QByteArray mv_Status = "connected";//0106 新增相机断联报警
long long index = 0; //相机序号
@@ -12,7 +12,6 @@
#include "base.h"
using namespace cv;
using namespace std;
#pragma execution_character_set("utf-8")
class Hd_CameraModule_HIK_hard :public Base
@@ -1,6 +1,6 @@
#include "Hd_CameraModule_HIK_hard_GenTL.h"
#include <QDebug>
using namespace std;
#include <QTextCodec>
QByteArray mv_Status = "connected";//0106 新增相机断联报警
long long index = 0; //相机序号
@@ -12,7 +12,6 @@
#include "base.h"
using namespace cv;
using namespace std;
#pragma execution_character_set("utf-8")
class Hd_CameraModule_HIK_hard_GenTL :public Base
@@ -1,5 +1,5 @@
#include "Hd_CameraModule_HIK_soft.h"
using namespace std;
#include <QThread>
#include <QQueue>
#include <QMutex>
@@ -18,7 +18,6 @@
#include "base.h"
using namespace cv;
using namespace std;
#pragma execution_character_set("utf-8")
@@ -1,5 +1,5 @@
#include "Hd_CameraModule_readImage.h"
using namespace std;
#include <QTextCodec>
//data == "rest_newProductIn"时要结束run;机台报警,取图超时,复位后重新拍的情况。
bool ifBreak = false;
@@ -192,23 +192,23 @@ bool Hd_CameraModule_readImage::writeData(std::vector<cv::Mat> &mat,QByteArray &
}
//数据解析,
bool Hd_CameraModule_readImage::decodeInitData(QByteArray byte, QVector<QByteArray>& vector_data)
bool Hd_CameraModule_readImage::decodeInitData(QByteArray byteArray, QVector<QByteArray>& vector_data)
{
/*while (!byte.isEmpty())
/*while (!byteArray.isEmpty())
{
int type = 0;
QByteArray m_type = byte.mid(0, 4);
QByteArray m_type = byteArray.mid(0, 4);
memcpy((void*)&type, (void*)m_type.data(), 4);
byte.remove(0, 4);
byteArray.remove(0, 4);
int len = 0;
QByteArray m_len = byte.mid(0, 4);
QByteArray m_len = byteArray.mid(0, 4);
memcpy((void*)&len, (void*)m_len.data(), 4);
byte.remove(0, 4);
byteArray.remove(0, 4);
QByteArray mm_data = byte.mid(0, len);
QByteArray mm_data = byteArray.mid(0, len);
vector_data.append(mm_data);
byte.remove(0, len);
byteArray.remove(0, len);
}*/
return true;
}
@@ -17,7 +17,6 @@
#include "base.h"
using namespace cv;
using namespace std;
#pragma comment(lib, "winmm.lib")
#pragma execution_character_set("utf-8")
@@ -42,7 +41,7 @@ public:
//初始化
bool initParas(QByteArray&);
bool run();
bool decodeInitData(QByteArray byte, QVector<QByteArray>& vector_data);
bool decodeInitData(QByteArray byteArray, QVector<QByteArray>& vector_data);
bool checkStatus();
private:
int timeout_ms = 5000;
@@ -246,9 +246,9 @@ void Hd_LogicDll_module::processtask_sendTcpStatus(bool flag)
{
emit Logic_sendTcpStatus(flag);
}
void Hd_LogicDll_module::processtask_writeData(QString key, QString cameraName, QString snInfo, QByteArray byte)
void Hd_LogicDll_module::processtask_writeData(QString key, QString cameraName, QString snInfo, QByteArray byteArray)
{
emit Logic_writeData(key, cameraName, snInfo, byte);
emit Logic_writeData(key, cameraName, snInfo, byteArray);
}
void Hd_LogicDll_module::processtask_cameraDisconnect(QString msg, bool status)
{
@@ -56,7 +56,7 @@ signals:
void Logic_CommunicationDisconnect(QString msg, bool status);
private slots:
void processtask_sendTcpStatus(bool flag);
void processtask_writeData(QString key, QString cameraName, QString snInfo, QByteArray byte);
void processtask_writeData(QString key, QString cameraName, QString snInfo, QByteArray byteArray);
void processtask_cameraDisconnect(QString msg, bool status);
void processtask_CommunicationDisconnect(QString msg, bool status);
};
@@ -488,12 +488,12 @@ void Logic_camera_thread::setMutex(QMutex *mutex)
m_mutex = new QMutex;// mutex;
}
bool Logic_camera_thread::sendDataCommond( QString m_type,cv::Mat mat,QByteArray byte )
bool Logic_camera_thread::sendDataCommond( QString m_type,cv::Mat mat,QByteArray byteArray )
{
QMutexLocker locker(m_mutex);
dataPack m_pack;
m_pack.mat = mat;
m_pack.byte = byte;
m_pack.byteArray = byteArray;
m_pack.retFlag = m_type;
m_pack.cameraName = m_name;
@@ -17,7 +17,6 @@
#include <QQueue>
#include <QMap>
#include <QDir>
#include <Windows.h>
#include "struct.h"
#include "Logic_hdataintegration.h"
@@ -33,7 +32,7 @@ public:
void setRunFlag(bool flag){ m_stoprun = flag; }
void setMutex( QMutex *mutex);
void setSaveImage( QString save){ m_saveImage = save;}
bool sendDataCommond(QString m_type,cv::Mat mat,QByteArray byte);
bool sendDataCommond(QString m_type,cv::Mat mat,QByteArray byteArray);
bool runCameraModule();
bool saveImage(std::vector<cv::Mat> mat);
//设置相机key、取图超时、模块、拍照面描述、触发方式
@@ -315,7 +315,7 @@ bool Logic_hdataintegration::triggerConditionList()
//or检测:保存路径,拍照面描述,相机key_第几张图,SN_时间戳
//and检测:保存路径,拍照面描述,相机key_第几张图,相机key_第几张图,SN_时间戳,SN_时间戳
//汇总:保存路径,触发信号_序号列表0,,SN_时间戳
detectData.byte = reaultDir.toLocal8Bit();// encodeData(vector_byte); // 结果汇总的数据编码
detectData.byteArray = reaultDir.toLocal8Bit();// encodeData(vector_byte); // 结果汇总的数据编码
detectData.dstImageMat = vector_mats; // 不做图片汇总
detectData.Surface = Surface;
algorithmData->addDetectData(detectData);
@@ -356,7 +356,7 @@ bool Logic_hdataintegration::triggerConditionList()
if (or_conditionFlag == false)
continue;
// 提取图片和数据
QByteArray byte; // 传递算法数据的暂时做保留
QByteArray byteArray; // 传递算法数据的暂时做保留
QStringList index_list;
HCameraData* camera_ptr = station_list.value(m_stationKey)->getCameraData(key);
/* stop = clock();
@@ -414,7 +414,7 @@ bool Logic_hdataintegration::triggerConditionList()
else
reaultDir += ",errSN_errDataTime";
detectData.byte = reaultDir.toLocal8Bit();// encodeSnData(vec_snData); //type:3;len:数据长度;data:数据内容(SN+时间戳)
detectData.byteArray = reaultDir.toLocal8Bit();// encodeSnData(vec_snData); //type:3;len:数据长度;data:数据内容(SN+时间戳)
//detectData.SN_dataTime = vec_snData; //可以用.byte来解析
detectData.Surface = m_cameraData.Surface;
algorithmData->addDetectData(detectData);
@@ -463,7 +463,7 @@ QByteArray HAlgorithmData::getAlgorithmData(QString SNdataTime,QString cameraNam
{
Algorithm_Result_Data value = algorithm_resultData_S[i];
algorithm_resultData_S.removeAt(i);
return value.byte;
return value.byteArray;
}
}
}
@@ -485,7 +485,7 @@ QByteArray HAlgorithmData::getAlgorithmData(QString SNdataTime,QString cameraNam
QByteArray HAlgorithmData::getIndexData(Algorithm_Result_Data result_data, int result_index, QString algorithm_result_index)
{
//qDebug() << __FUNCTION__ << " line: " << __LINE__ << " algorithmKey:" << algorithmKey << " cameraName_and_index: " << cameraName_and_index << " result_data.byte len:" << result_data.byte.length();
//qDebug() << __FUNCTION__ << " line: " << __LINE__ << " algorithmKey:" << algorithmKey << " cameraName_and_index: " << cameraName_and_index << " result_data.byteArray len:" << result_data.byteArray.length();
Algorithm_Result_Data_index index_pack;
if (map_delete_Result_index.keys().contains(result_data.key_index))
@@ -503,10 +503,10 @@ QByteArray HAlgorithmData::getIndexData(Algorithm_Result_Data result_data, int r
QString cameraName = list.at(0);
QString task_index = list.at(1);
//Logic_taskthread运行算法/汇总模块后,返回的数据
QByteArray byte = result_data.byte;
QByteArray byteArray = result_data.byteArray;
//result_data.byte转
QByteArrayList vec_Data;
vec_Data = byte.split('#');
vec_Data = byteArray.split('#');
if (vec_Data.isEmpty())
{
@@ -520,7 +520,7 @@ QByteArray HAlgorithmData::getIndexData(Algorithm_Result_Data result_data, int r
return index_byte;
}
index_byte = vec_Data[algorithm_result_index.toInt()];// byte;// QByteArray::fromStdString(sendMsg);
index_byte = vec_Data[algorithm_result_index.toInt()];// byteArray;// QByteArray::fromStdString(sendMsg);
// 删除map中的数据
if (vec_Data.size() == 1)
@@ -619,7 +619,7 @@ bool HAlgorithmExecData::getDetectData(testData& picVec)
picVec.cameraName = picVec1.cameraName; // 提取名称
picVec.task_index = picVec1.task_index; // 任务下标
picVec.byte = picVec1.byte;
picVec.byteArray = picVec1.byteArray;
for (int i = 0; i < m_detectData.head().dstImageMat.size(); i++)
{
cv::Mat img = cv::Mat();
@@ -810,7 +810,7 @@ void HStationData::addAlgorithmResultData(QString algorithmKey, QString index, Q
}
}
Algorithm_Result_Data result_data;
result_data.byte = NG_data;
result_data.byteArray = NG_data;
result_data.SN_dataTime = SN_datatime;
if (algorithm_ptr)
@@ -22,7 +22,7 @@ typedef struct
//or检测:保存路径,拍照面描述,相机key_第几张图,SN_时间戳
//and检测:保存路径,拍照面描述,相机key_第几张图,相机key_第几张图,SN_时间戳,SN_时间戳
//汇总:保存路径,触发信号_序号列表0,,SN_时间戳
QByteArray byte;
QByteArray byteArray;
std::vector<cv::Mat> dstImageMat;
//拍照面描述
QString Surface;
@@ -72,7 +72,7 @@ typedef struct
{
QString SN_dataTime; //SN+时间戳
QString key_index; //示例:key camera1_1,algorithm1
QByteArray byte; // 存储算法结果数据
QByteArray byteArray; // 存储算法结果数据
std::vector<cv::Mat> dstImageMat; // 存储算法结果图
}Algorithm_Result_Data;
@@ -201,8 +201,8 @@ void Logic_myiothread::run()
if (!m_heartCmd.isEmpty())
{// 发送心跳
////QMutexLocker locker(m_iomutex);;
QByteArray byte = m_heartCmd.toUtf8(); // 设置 从起始位开始读取的指令
if (!finstcp_ptr->writeData(vec_mat, byte))
QByteArray byteArray = m_heartCmd.toUtf8(); // 设置 从起始位开始读取的指令
if (!finstcp_ptr->writeData(vec_mat, byteArray))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error!";
}
@@ -217,8 +217,8 @@ void Logic_myiothread::run()
{
// 修改读取多个命令
//QMutexLocker locker(m_iomutex);;
QByteArray byte = readAll_cmd.toUtf8(); // 设置 从起始位开始读取的指令
if (!finstcp_ptr->writeData(vec_mat, byte))
QByteArray byteArray = readAll_cmd.toUtf8(); // 设置 从起始位开始读取的指令
if (!finstcp_ptr->writeData(vec_mat, byteArray))
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " finstcp_ptr reciveData error!";
}
@@ -296,7 +296,7 @@ void Logic_myiothread::run()
dataPack m_data;
m_data.algorithmName = "程序号";
m_data.cameraName = m_startpos;
m_data.byte = QByteArray::number(vec_value.at(trigger_index));
m_data.byteArray = QByteArray::number(vec_value.at(trigger_index));
m_data.retFlag = "algorithm";
QMutexLocker locker(sendProcess_mutex);
@@ -362,8 +362,8 @@ void Logic_myiothread::reciveCommond()
// 修改读取多个命令
//QMutexLocker locker ( m_iomutex );
m_iomutex->lock();
QByteArray byte = readAll_cmd.toUtf8(); // 设置 从起始位开始读取的指令
if ( !finstcp_ptr->writeData(vec_mat,byte) )
QByteArray byteArray = readAll_cmd.toUtf8(); // 设置 从起始位开始读取的指令
if ( !finstcp_ptr->writeData(vec_mat,byteArray) )
{
qCritical() << __FUNCTION__ << "line:"<< __LINE__ << " finstcp_ptr reciveData error!";
}
@@ -387,17 +387,17 @@ void Logic_myiothread::reciveCommond()
}
// 读取多个命令信息的解析
void Logic_myiothread::decodeCameraCMD(QByteArray byte)
void Logic_myiothread::decodeCameraCMD(QByteArray byteArray)
{
if (byte.isEmpty())
if (byteArray.isEmpty())
return;
readsnByte = byte;
readsnByte = byteArray;
vec_value.clear();
while ( !byte.isEmpty() )
while ( !byteArray.isEmpty() )
{
QByteArray retByte = byte.mid(0,2);
byte.remove(0,2);
QByteArray retByte = byteArray.mid(0,2);
byteArray.remove(0,2);
QString msg = retByte.toHex();
int number_tmp = msg.toInt(NULL,16);
@@ -426,7 +426,7 @@ void Logic_myiothread::decodeCameraCMD(QByteArray byte)
//SN逻辑
// "读SN信号"满足时,代表新料来了,安装"清理容器数据"-"相机列表"及"通道序号"清理对应的容器;
//SN保存到容器HSnData;下料的SN,根据"汇总-触发信号"、"汇总-读哪个SN"匹配Logic_hdataintegration,并保存SN到变量;
void Logic_myiothread::readSnInfo(QVector<int> vec_value, QByteArray byte)
void Logic_myiothread::readSnInfo(QVector<int> vec_value, QByteArray byteArray)
{
QStringList keys = map_sn_area_array.keys();
//重新加载用
@@ -566,7 +566,7 @@ void Logic_myiothread::readSnInfo(QVector<int> vec_value, QByteArray byte)
for (int aaa = 0; aaa < read_datatime_list.size(); aaa++)
{
//SN为""时,返回配置文件的read_sn_error_send_format值
QString datatime = getSn(read_sn_error_send_format, read_datatime_list[aaa].toString(), byte);
QString datatime = getSn(read_sn_error_send_format, read_datatime_list[aaa].toString(), byteArray);
qDebug() << __FUNCTION__ << " line: " << __LINE__ << " channel_index: " << channel_index << " read_datatime_list: " << datatime;
//sn_value = snHex(sn_value); // sn方向相反,重新做转换
@@ -638,7 +638,7 @@ void Logic_myiothread::readSnInfo(QVector<int> vec_value, QByteArray byte)
for (int aaa = 0; aaa < read_sn_list.size(); aaa++)
{
//SN为""时,返回配置文件的read_sn_error_send_format值
QString sn_value = getSn(read_sn_error_send_format, read_sn_list[aaa].toString(), byte);
QString sn_value = getSn(read_sn_error_send_format, read_sn_list[aaa].toString(), byteArray);
qDebug() << __FUNCTION__ << " line: " << __LINE__ << " channel_index: " << channel_index << " sn_value: " << sn_value;
//sn_value = snHex(sn_value); // sn方向相反,重新做转换
//异常
@@ -873,7 +873,7 @@ QString Logic_myiothread::snHex(QString sn)
return resultStr;
}
//SN为""时,返回配置文件的"读SN异常-插值"
QString Logic_myiothread::getSn(QString errorinfo,QString area,QByteArray byte)
QString Logic_myiothread::getSn(QString errorinfo,QString area,QByteArray byteArray)
{
QString m_startpos = area.split("_")[0];
QString lenght = area.split("_")[1];
@@ -881,7 +881,7 @@ QString Logic_myiothread::getSn(QString errorinfo,QString area,QByteArray byte)
int start_index = m_startpos.mid(1,m_startpos.length()-1).toInt();
start_index -= trigger_startpos;
QByteArray snByte = byte.mid(start_index*2,lenght.toInt());
QByteArray snByte = byteArray.mid(start_index*2,lenght.toInt());
QString sn = snByte;
if ( sn.contains("\n\r") )
@@ -2,6 +2,7 @@
#include "qfuture.h"
#include <QtConcurrent/qtconcurrent>
#include <qmessagebox.h>
#include <rlib/fileManager.h>s
//总相机线程类列表
QList<Logic_camera_thread*> camerathreadlist;
@@ -121,10 +122,18 @@ bool Logic_processtask::check_cmeraCfg(QJsonObject obj, QString& allMessage)
int allFailNum = 0;
//QString allMessage;
if (myQString.isEmpty())
allMessage += "第 " + QString::number(allFailNum++) + "条 :保存图片总文件夹,为空\r\n";
{
//allMessage += "第 " + QString::number(allFailNum++) + "条 :保存图片总文件夹,为空\r\n";
allMessage += "第 " + QString::number(allFailNum) + "条 :保存图片总文件夹为空但已创建\r\n";
fileManager::createDirectoryIfNotExists(myQString.toStdString());
}
QDir dir(myQString);
if (!dir.exists())
allMessage += "第 " + QString::number(allFailNum++) + "条 :保存图片总文件夹:" + myQString + " 不存在\r\n";
{
//allMessage += "第 " + QString::number(allFailNum) + "条 :保存图片总文件夹:" + myQString + " 不存在\r\n";
allMessage += "第 " + QString::number(allFailNum) + "条 :保存图片总文件夹:" + myQString + " 不存在但已创建\r\n";
fileManager::createDirectoryIfNotExists(myQString.toStdString());
}
myQString = m_jsonObj.value("数据保存天数").toString();
if (myQString.toInt() <= 0)
allMessage += "第 " + QString::number(allFailNum++) + "条 :数据保存天数,值错误\r\n";
@@ -2519,7 +2528,7 @@ void Logic_processtask::reciveImageData()
QString algorithmName = m_data.algorithmName;
QString retFlag = m_data.retFlag;
QString sendNgInfo = m_data.sendNgInfo;
QByteArray m_byte = m_data.byte;
QByteArray m_byte = m_data.byteArray;
if (snInfo.isEmpty())
Sleep(1);
// 传递图片
@@ -153,7 +153,7 @@ bool Logic_taskthread::processTask()
//汇总:保存路径,拍照面描述,触发信号_序号列表0,,SN_时间戳
//m_data.byte
//std::cout << "camera_name_index[0]::" << camera_name_index[0].toStdString() << std::endl;
AlgorithmModuleProcessData(m_module.module_key, camera_name_index, m_data.dstImageMat, m_data.byte);
AlgorithmModuleProcessData(m_module.module_key, camera_name_index, m_data.dstImageMat, m_data.byteArray);
m_ptr->deleteDetectData();
/*stop = clock();
qDebug() << "m_module.module_key::" << m_module.module_key << " Logic_taskthread cut Time ::" << stop - start ;
@@ -322,14 +322,14 @@ bool Logic_taskthread::sendDataToModule(QVector<QString> camera_name_index, std:
return true;
}
QString Logic_taskthread::getSnDataInfo ( QByteArray byte )
QString Logic_taskthread::getSnDataInfo ( QByteArray byteArray )
{
if ( byte.isEmpty() )
if ( byteArray.isEmpty() )
return nullptr;
else
{
QByteArrayList vec_ret;
if ( decodeAiValue( byte, vec_ret ) )
if ( decodeAiValue( byteArray, vec_ret ) )
{
if ( !vec_ret.isEmpty() )
{
@@ -342,7 +342,7 @@ QString Logic_taskthread::getSnDataInfo ( QByteArray byte )
//添加数据到最前面
bool Logic_taskthread::encodeAppendData(QVector<QString> append_value, QByteArray &byte)
bool Logic_taskthread::encodeAppendData(QVector<QString> append_value, QByteArray &byteArray)
{
try
{
@@ -370,13 +370,13 @@ bool Logic_taskthread::encodeAppendData(QVector<QString> append_value, QByteArra
}
resultByte = QByteArray::fromStdString(sendMsg);
if (byte.isEmpty())
if (byteArray.isEmpty())
{
byte = resultByte;
byteArray = resultByte;
}
else
{
byte = resultByte.append(byte);
byteArray = resultByte.append(byteArray);
}
}
catch (QString ev)
@@ -387,30 +387,30 @@ bool Logic_taskthread::encodeAppendData(QVector<QString> append_value, QByteArra
return true;
}
bool Logic_taskthread::decodereciveValue(QByteArray byte, QVector<QByteArray>& vec_ret)
bool Logic_taskthread::decodereciveValue(QByteArray byteArray, QVector<QByteArray>& vec_ret)
{
while (!byte.isEmpty())
while (!byteArray.isEmpty())
{
int type = 0;
QByteArray m_type = byte.mid(0, 4);
QByteArray m_type = byteArray.mid(0, 4);
memcpy((void*)&type, (void*)m_type.data(), 4);
byte.remove(0, 4);
byteArray.remove(0, 4);
int len = 0;
QByteArray m_len = byte.mid(0, 4);
QByteArray m_len = byteArray.mid(0, 4);
memcpy((void*)&len, (void*)m_len.data(), 4);
byte.remove(0, 4);
byteArray.remove(0, 4);
QByteArray mm_data = byte.mid(0, len);
QByteArray mm_data = byteArray.mid(0, len);
vec_ret.append(mm_data);
byte.remove(0, len);
byteArray.remove(0, len);
}
return false;
}
//保存算法结果数据到容器
bool Logic_taskthread::saveAlgorithmData(testData m_testdata, int index, QByteArray byte)
bool Logic_taskthread::saveAlgorithmData(testData m_testdata, int index, QByteArray byteArray)
{
//for (int i = 0; i < m_testdata.cameraName.size(); i++)
{
@@ -418,7 +418,7 @@ bool Logic_taskthread::saveAlgorithmData(testData m_testdata, int index, QByteAr
QString task_index = m_testdata.task_index[index];
Algorithm_Result_Data result_data;
result_data.byte = byte;
result_data.byteArray = byteArray;
if (m_testdata.SN_dataTime.size())
result_data.SN_dataTime = m_testdata.SN_dataTime[0]; //这里暂时只取了第一个SN;即一张图对应一个SN;一张图里有2个产品的情况,应该在回调函数放两次图
@@ -482,14 +482,14 @@ bool Logic_taskthread::sendCatchCommond(QVector<QString> camera_name_index)
}
bool Logic_taskthread::decodeAiValue(QByteArray byte, QByteArrayList &vec_ret)
bool Logic_taskthread::decodeAiValue(QByteArray byteArray, QByteArrayList &vec_ret)
{
if(byte.isEmpty())
if(byteArray.isEmpty())
{
qCritical() << __FUNCTION__ << "line:" << __LINE__ << " byte is null!";
return false;
}
vec_ret = byte.split('#');
vec_ret = byteArray.split('#');
return true;
}
@@ -566,7 +566,7 @@ bool Logic_taskthread::writeTcpData(QMap<QString,QString> key_value)
QByteArray Logic_taskthread::writeFormat(QString startPos, QVector<QString> vector_value)
{
QByteArray byte;
QByteArray byteArray;
QString write_format;
// 其他格式 按照 长度+数据写入 进行编码
@@ -584,11 +584,11 @@ QByteArray Logic_taskthread::writeFormat(QString startPos, QVector<QString> vect
write_format = startPos + "_" + sendData;
else write_format = sendData;
byte = write_format.toLocal8Bit();
return byte;
byteArray = write_format.toLocal8Bit();
return byteArray;
}
//保存结果图到容器并UI显示;发送结果数据给PLC
bool Logic_taskthread::sendDataCommond( QString m_type, QVector<QString> camera_name_index, std::vector<cv::Mat> mat,QByteArray byte )
bool Logic_taskthread::sendDataCommond( QString m_type, QVector<QString> camera_name_index, std::vector<cv::Mat> mat,QByteArray byteArray)
{
// 界面显示包
QMutexLocker locker(m_image_lock);
@@ -625,7 +625,7 @@ bool Logic_taskthread::sendDataCommond( QString m_type, QVector<QString> camera_
}
}
if (!byte.contains("null"))
if (!byteArray.contains("null"))
{
foreach(QString send_usual_result, m_send_usual_result.vector_algorithm_usual_feedback_plcpos)
{
@@ -644,15 +644,15 @@ bool Logic_taskthread::sendDataCommond( QString m_type, QVector<QString> camera_
if (save_data_flag == "true")
{
//保存算法结果数据到容器
saveAlgorithmData(m_exec_testData, ci, byte);
saveAlgorithmData(m_exec_testData, ci, byteArray);
}
// 发送检测模块的结果到PLC
if (send_data_flag == "true")
{
QString sbyte = byte;
QString sbyte = byteArray;
//发送数据给PLC
if (!writeAiCommond(m_name, camera_name_index[ci], byte))
if (!writeAiCommond(m_name, camera_name_index[ci], byteArray))
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " ---- writeAiCommond is failed!"<<" byte,"<< sbyte;
}
@@ -663,7 +663,7 @@ bool Logic_taskthread::sendDataCommond( QString m_type, QVector<QString> camera_
send_ng_info.clear();
//汇总算法删除,检测算法不删。
//获取第一组sn;//获取次数是sn容器长度的倍数时,删一个数据
bool ifdeleSn = deleteSnData(byte, sndata, send_ng_info);
bool ifdeleSn = deleteSnData(byteArray, sndata, send_ng_info);
//汇总算法
// 传递给界面用来显示产品的sn码
@@ -694,7 +694,7 @@ bool Logic_taskthread::sendDataCommond( QString m_type, QVector<QString> camera_
// cv::resize(mat[ci], mat[ci], cv::Size(), 0.5, 0.5); //图像大时(内存、cpu占用大),耗时长。
m_pack.mat = mat[ci].clone();
}
m_pack.byte = byte;
m_pack.byteArray = byteArray;
m_pack.retFlag = m_type;
if (!queue_exec_cameraName.isEmpty())
@@ -752,7 +752,7 @@ bool Logic_taskthread::getdataPack(dataPack& myDataPack)
else return false;
}
//汇总算法,删除SN,所有相机线程的snIndex减一
bool Logic_taskthread::deleteSnData ( QByteArray byte, QVector<QString>& sndata,QString &send_ng_info)
bool Logic_taskthread::deleteSnData ( QByteArray byteArray, QVector<QString>& sndata,QString &send_ng_info)
{
// 读取sn区域的位置下标;只在汇总算法有,检测算法无
QString read_sn_area_index = m_sn_set_object.value("汇总-读哪个上料通道的SN").toString();
@@ -808,9 +808,9 @@ bool Logic_taskthread::deleteSnData ( QByteArray byte, QVector<QString>& sndata,
}
// 算法结果 写入plc
bool Logic_taskthread::writeAiCommond ( QString cameraName,QString camera_name_index,QByteArray byte )
bool Logic_taskthread::writeAiCommond ( QString cameraName,QString camera_name_index,QByteArray byteArray )
{
QByteArrayList PLCvec_ret= byte.split('*'); // 存储结果的
QByteArrayList PLCvec_ret= byteArray.split('*'); // 存储结果的
if (PLCvec_ret.isEmpty() )
{
@@ -30,19 +30,19 @@ public:
bool processTask();//循环取检测数据,传到检测模块运行
bool appendPlcCmd(QJsonObject);
bool sendCatchCommond(QVector<QString> camera_name_index);
bool sendDataCommond( QString m_type, QVector<QString> camera_name_index, std::vector<cv::Mat> mat,QByteArray byte );
bool saveAlgorithmData ( testData m_testdata,int index,QByteArray byte);
bool writeAiCommond(QString cameraName,QString camera_name_index,QByteArray byte);
bool sendDataCommond( QString m_type, QVector<QString> camera_name_index, std::vector<cv::Mat> mat,QByteArray byteArray );
bool saveAlgorithmData ( testData m_testdata,int index,QByteArray byteArray);
bool writeAiCommond(QString cameraName,QString camera_name_index,QByteArray byteArray);
bool writeTcpData(QMap<QString,QString> map);
bool decodeAiValue(QByteArray byte, QByteArrayList&vec_ret);
bool AlgorithmModuleProcessData(QString key, QVector<QString> camera_name_index,std::vector<cv::Mat> camera_mat,QByteArray byte); // 处理数据
bool deleteSnData( QByteArray byte,QVector<QString> &sndata,QString &send_ng_info); // 获取sn码,然后删除容器中的SN码,第三个参数是表示是否发送界面显示NG信息
bool sendDataToModule(QVector<QString> name, std::vector<cv::Mat> vector_mat,QByteArray byte);
bool encodeAppendData(QVector<QString> append_value,QByteArray& byte);
bool decodereciveValue(QByteArray byte, QVector<QByteArray>& vec_ret);
bool decodeAiValue(QByteArray byteArray, QByteArrayList&vec_ret);
bool AlgorithmModuleProcessData(QString key, QVector<QString> camera_name_index,std::vector<cv::Mat> camera_mat,QByteArray byteArray); // 处理数据
bool deleteSnData( QByteArray byteArray,QVector<QString> &sndata,QString &send_ng_info); // 获取sn码,然后删除容器中的SN码,第三个参数是表示是否发送界面显示NG信息
bool sendDataToModule(QVector<QString> name, std::vector<cv::Mat> vector_mat,QByteArray byteArray);
bool encodeAppendData(QVector<QString> append_value,QByteArray& byteArray);
bool decodereciveValue(QByteArray byteArray, QVector<QByteArray>& vec_ret);
QVector<QString> getWriteVector(QString& startPos, QMap<QString, QString>& map);
QByteArray writeFormat(QString startPos, QVector<QString> vector_value); // 写入的起始位置,写入的内容+长度
QString getSnDataInfo(QByteArray byte);
QString getSnDataInfo(QByteArray byteArray);
bool setmySaveImagethreadIndex(int i)
{
mysaveimagethreadindex = i;
@@ -0,0 +1,393 @@
//#include<qstring.h>
#include <vector>
#include <string>
#include <qdir.h>
#include <io.h>
#include <qtimer.h>
#include <qthread.h>
#include <qdatetime.h>
#include <qstorageinfo.h>
#include <qdebug.h>
#include <iostream>
#include <qfiledialog.h>
#include <filesystem>
class fileManager
{
public:
static QString openFolderDialog()
{
QString folderPath = QFileDialog::getExistingDirectory(
nullptr,
"Select Folder",
QDir::homePath(), // 默认路径,可以根据需要更改
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
if (!folderPath.isEmpty()) {
// 用户选择了文件夹
qDebug() << "Selected Folder: " << folderPath;
}
else {
// 用户取消了选择
qDebug() << "Folder selection canceled.";
}
return folderPath;
}
/// <summary>
/// 获取所有文件夹
/// </summary>
/// <param name="folderPath"></param>
/// <param name="folderNames"></param>
static std::vector<std::string> getAllDirs(const QString& folderPath)
{
std::vector<std::string> foldersVec;
QDir folderDir(folderPath);
if (!folderDir.exists()) {
return foldersVec;
}
QStringList folders = folderDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
for (const QString& folder : folders) {
foldersVec.push_back(folder.toStdString());
}
return foldersVec;
}
/// <summary>
/// 获取文件夹下格式的文件,以vector<string>返回
/// </summary>
/// <param name="path"></param>
/// <param name="files"></param>
/// <param name="format"></param>
static void getAllFiles(std::string path, std::vector<std::string>& files, std::string format, int targetDepth = INT_MAX, int depth = 0)
{
if (depth >= targetDepth)
return;
intptr_t hFile = 0;
struct _finddata_t fileinfo;
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
depth++;
getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files, format, targetDepth ,depth);
}
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
/// <summary>
/// 获取文件夹下的图片,以vector<string>返回
/// </summary>
/// <param name="path"></param>
/// <param name="files"></param>
/// <param name="format"></param>
static void getAllImages(std::string path, std::vector<std::string>& files, std::string format, int targetDepth = INT_MAX, int depth = 0)
{
if (depth >= targetDepth)
return;
intptr_t hFile = 0;
struct _finddata_t fileinfo;
std::string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
std::string filePath = p.assign(path).append("\\").append(fileinfo.name);
if (fileManager::isImageFile(filePath) == true)
files.push_back(filePath);
depth++;
getAllImages(filePath, files, format, targetDepth, depth);
}
}
else
{
std::string filePath = p.assign(path).append("\\").append(fileinfo.name);
if (fileManager::isImageFile(filePath) == true)
files.push_back(filePath);
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
/// <summary>
/// 检查磁盘剩余空间,以GB为单位返回
/// </summary>
/// <param name="folderPath">example"E://""E://111/222"支持文件夹或者磁盘路径</param>
/// <returns></returns>
static int getDriveFreeSpaceAsGb(const QString& folderPath) {
QStorageInfo storageInfo(folderPath);
if (storageInfo.isValid() && storageInfo.isReady()) {
return storageInfo.bytesAvailable() / 1073741824;
}
return -1; // Indicate failure to retrieve disk space
}
/// <summary>
/// 检查磁盘剩余空间,以Mb为单位返回
/// </summary>
/// <param name="folderPath">example"E://""E://111/222"支持文件夹或者磁盘路径</param>
/// <returns></returns>
static int getDriveFreeSpaceAsMb(const QString& folderPath) {
QStorageInfo storageInfo(folderPath);
if (storageInfo.isValid() && storageInfo.isReady()) {
return storageInfo.bytesAvailable() / 1048576;
}
return -1; // Indicate failure to retrieve disk space
}
/// <summary>
/// 返回最老创建时间文件夹名
/// </summary>
/// <param name="folderPath"></param>
/// <returns></returns>
static QString getOldestDir(const QString& folderPath)
{
std::string oldestDir;
QDateTime oldestTime;
std::vector<std::string> files= getAllDirs(folderPath);
for (auto file : files)
{
QFileInfo fileInfo(QString::fromStdString(folderPath.toStdString() + "//" + file));
QDateTime fileTime = fileInfo.created();
QString str = fileInfo.created().toString();
std::cout << "Current date and time: " << str.toStdString() << std::endl;
if (oldestTime.isNull() || fileTime < oldestTime)
{
oldestTime = fileTime;
oldestDir = file;
}
}
return QString::fromStdString(oldestDir);
}
/// <summary>
/// 删除最老创建时间文件夹
/// </summary>
/// <param name="folderPath"></param>
/// <returns></returns>
static bool deleteOldestDir(const QString& folderPath)
{
QString oldestDir =getOldestDir(folderPath);
if (oldestDir.isEmpty())
return false;
oldestDir= folderPath+ "//" + oldestDir;
QDir dir(oldestDir);
dir.removeRecursively();
return true;
}
/// <summary>
/// 删除最老子文件夹
/// </summary>
/// <param name="folderPath"></param>
/// <returns></returns>
static bool deleteOldestSonDir(const QString& folderPath)
{
QString oldestDir = getOldestDir(folderPath);
if (oldestDir.isEmpty())
return false;
oldestDir = folderPath + "//" + oldestDir;
deleteOldestDir(oldestDir);
if (getAllDirs(oldestDir).size() == 0)//删除后文件夹为空,删除父文件夹
{
QDir dir(oldestDir);
dir.removeRecursively();
}
return true;
}
/// <summary>
/// 删除几天前的所有文件夹
/// </summary>
/// <param name="folderPath"></param>
/// <param name="day"></param>
/// <returns></returns>
static bool deleteDirBeforeDays(const QString& folderPath, int day)
{
std::vector<std::string> files=getAllDirs(folderPath);
for (auto file : files)
{
QFileInfo fileInfo(QString::fromStdString(file));
QDateTime fileTime = fileInfo.created();
QDateTime nowTime = QDateTime::currentDateTime();
if (fileTime.daysTo(nowTime) > day)
{
QDir dir(QString::fromStdString(file));
dir.removeRecursively();
}
}
return true;
}
//去除重复分割符
static QString normalizePathSeparators(const QString& path) {
QString normalizedPath = path;
// Replace backslashes with forward slashes
normalizedPath.replace('\\', '/');
// Remove consecutive forward slashes
QString doubleSlash = "//";
while (normalizedPath.contains(doubleSlash)) {
normalizedPath.replace(doubleSlash, "/");
}
return normalizedPath;
}
static bool isImageFile(const std::string& filename) {
const std::string imageExtensions[] = { ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp" };
std::string lowerFilename = filename;
std::transform(lowerFilename.begin(), lowerFilename.end(), lowerFilename.begin(), [](unsigned char c) { return std::tolower(c); });
for (const std::string& ext : imageExtensions) {
if (lowerFilename.size() >= ext.size() &&
lowerFilename.compare(lowerFilename.size() - ext.size(), ext.size(), ext) == 0) {
return true;
}
}
return false;
}
static std::string getFileName(std::string path)
{
if (path.find("\\") != std::string::npos)
return path.substr(path.find_last_of("\\") + 1, path.find_last_of(".") - path.find_last_of("\\") - 1);
return path.substr(path.find_last_of("/") + 1, path.find_last_of(".") - path.find_last_of("/") - 1);
}
static QString getFileName(const QString& path) {
int lastSlashIndex = path.lastIndexOf('/');
if (lastSlashIndex == -1) {
lastSlashIndex = path.lastIndexOf('\\');
}
int lastDotIndex = path.lastIndexOf('.');
if (lastDotIndex == -1 || lastDotIndex < lastSlashIndex) {
return path.mid(lastSlashIndex + 1);
}
else {
return path.mid(lastSlashIndex + 1, lastDotIndex - lastSlashIndex - 1);
}
}
//统一地址分隔符
static QString normalizePathStr(const QString& address, QChar targetSeparator = '/') {
QString normalizedAddress = address;
for (int i = 0; i < normalizedAddress.size(); ++i) {
if (normalizedAddress[i] == '\\' || normalizedAddress[i] == '/') {
normalizedAddress[i] = targetSeparator;
}
}
return normalizedAddress;
}
//统一地址分隔符
static std::string normalizePathStr(const std::string& address, char targetSeparator = '/') {
std::string normalizedAddress = address;
for (char& ch : normalizedAddress) {
if (ch == '\\' || ch == '/') {
ch = targetSeparator;
}
}
return normalizedAddress;
}
static void createDirectoryIfNotExists(const std::string& path) {
// 检查路径是否存在
if (!std::filesystem::exists(path)) {
// 创建路径
std::filesystem::create_directories(path);
//std::cout << "已创建文件夹: " << path << std::endl;
}
else {/*
std::cout << "文件夹已存在: " << path << std::endl;*/
}
}
static bool setFileReadOnly(const std::string& filePath, bool readOnly);
};
/// <summary>
/// 自动删除文件夹,支持按日期删除,按磁盘剩余容量删除,或者两者都是,请在主线程声明qtimer
/// </summary>
class autoDelete : public QThread
{
Q_OBJECT
public:
enum clearMode
{
dayBefore,
sizeOver,
sizeOverOrDayBefore,
};
/// <summary>
/// 构造函数
/// </summary>
/// <param name="path">文件夹路径</param>
/// <param name="mode">删除几天前的,磁盘剩余容量小于多少,两者都是</param>
/// <param name="interval">检测间隔如果只检测日期建议设大一点,如果只检测磁盘容量建议设小一点,默认十分钟</param>
autoDelete(QString path,clearMode mode,QTimer *timer)
{
detPath = path;
detMode = mode;
connect(timer, &QTimer::timeout, this, [=]() {this->run(); });
}
~autoDelete()
{
}
void run() override
{
exacute();
}
void exacute()
{
switch (detMode)
{
case dayBefore://删除几天前的
fileManager::deleteDirBeforeDays(detPath, daySet);
break;
case sizeOver://磁盘剩余容量小于多少
if (fileManager::getDriveFreeSpaceAsGb(detPath) < sizeSet)
fileManager::deleteOldestSonDir(detPath);//删除最老的文件夹
break;
case sizeOverOrDayBefore://两者都是
if (fileManager::getDriveFreeSpaceAsGb(detPath) < sizeSet)//磁盘剩余容量小于多少
fileManager::deleteOldestDir(detPath);//删除最老的文件夹
fileManager::deleteDirBeforeDays(detPath, daySet);//同时删除几天前的
break;
default:
qDebug() << "none mode det";
break;
}
}
void setDay(int day)
{
daySet = day;
}
void setSize(int size)
{
sizeSet = size;
}
private:
QString detPath;
clearMode detMode;
int daySet = 15;//天
int sizeSet = 30;//GB
int threadInterval = 0;//ms
};
#pragma once
+1 -1
View File
@@ -49,7 +49,7 @@ typedef struct {
QString snInfo = "";
QString sendNgInfo = ""; // -3 工位上检测到前面几个算法有NG后,做的反馈信息
cv::Mat mat;
QByteArray byte = "";
QByteArray byteArray = "";
}dataPack;
-2
View File
@@ -21,8 +21,6 @@
using namespace HalconCpp;
using namespace std;
cv::Mat GetOneImages(cv::Mat& oriImg, cv::Mat& oriImg2)
{
int width = oriImg.cols;
@@ -15,7 +15,6 @@
#using "../../bin/HslCommunication.dll"
using namespace HslCommunication;
using namespace std;
using namespace cli;
class Hd_SocketModule_FinsTcp :public Base
@@ -28,7 +27,7 @@ public:
bool writeData(std::vector<cv::Mat>& vec_mat, QByteArray& data); // writeData调用PLC的收发,将需要的数据发给寄存器,返回OK/NG
bool initParas(QByteArray&);
bool run();
bool decodeWriteResult(QByteArray byte, QVector<QString>& vec_ret);
bool decodeWriteResult(QByteArray byteArray, QVector<QString>& vec_ret);
bool checkStatus();
private:
gcroot<HslCommunication::Profinet::Omron::OmronFinsNet^>* m_pFinsTcpNet = new gcroot<HslCommunication::Profinet::Omron::OmronFinsNet^>;
+15 -1
View File
@@ -6,6 +6,10 @@ project(handdleai VERSION 0.1.0)
string(TIMESTAMP RUN_TIME)
message( " project start : " ${RUN_TIME})
set(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
set(CMAKE_DISABLE_SOURCE_CHANGES ON)
@@ -34,7 +38,17 @@ if(NE_DEVELOPER_DEFAULTS)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/lib")
SET(PROJECT_ROOT_PATH ${PROJECT_SOURCE_DIR})
endif()
if (MSVC_VERSION GREATER_EQUAL "1900")
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("/std:c++17" _cpp_latest_flag_supported)
if (_cpp_latest_flag_supported)
add_compile_options("/std:c++17")
else()
message(WARNING "Compiler does not support C++17 standard.")
endif()
else()
message(WARNING "MSVC version is not supported.")
endif()
##################
# 获取默认库路径
# 记录 // include // lib // 子文件夹名
+11 -5
View File
@@ -7,7 +7,9 @@ SUBDIRENAMES(OUR_LIBS ${CMAKE_CURRENT_SOURCE_DIR} "" OFF)
message("OUR_LIBS :" ${OUR_LIBS})
# 遍历子库
foreach(dll ${OUR_LIBS})
add_subdirectory(${dll})
if(EXISTS ${dll}/CMakeLists.txt)
add_subdirectory(${dll})
endif()
endforeach(dll ${})
@@ -44,7 +46,6 @@ foreach(item ${qtlist})
list(APPEND lib_list Qt5::${item})
endforeach()
FILE(GLOB HEAD_FILES "./*.h" )
FILE(GLOB SRC_FILES "./*.cpp")
FILE(GLOB UI_FILES "./*.ui")
@@ -58,18 +59,23 @@ if(ANDROID)
${HEAD_FILES}
${SRC_FILES}
${UI_FILES}
${RLIB_HEAD_FILES}
)
else()
if(CMAKE_BUILD_TYPE MATCHES "Debug")
add_executable( ${CURRENT_FOLDER}
${HEAD_FILES}
${UI_FILES}
${SRC_FILES}
${UI_FILES})
${UI_FILES}
${RLIB_HEAD_FILES}
)
else()
add_executable( ${CURRENT_FOLDER}
${HEAD_FILES}
${SRC_FILES}
${UI_FILES})
${UI_FILES}
${RLIB_HEAD_FILES}
)
endif()
endif()
+1 -1
View File
@@ -3,7 +3,7 @@
#include "qfuture.h"
#include "QtConcurrent/qtconcurrent"
#include "qmessagebox.h"
#include <base_Logic.h>
QMutex log_mutex;
void LogMsgOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg)
+1 -2
View File
@@ -1,7 +1,7 @@
#pragma once
//通用逻辑接口
#include "base_Logic.h"
#include <qobject.h>
//无法用信号槽传递图像?
//返回图片的结构体
struct showImgStruct
@@ -19,7 +19,6 @@ typedef void (*ReleaseFunction)(base_Logic* animal);
class Logic_transfer : public base_Logic
{
Q_OBJECT
public:
Logic_transfer();
~Logic_transfer();
+1 -1
View File
@@ -760,7 +760,7 @@ bool QtCameraDebug::initCamera(int cameraIndex)
}
bool QtCameraDebug::setData(int cameraIndex, const vector<cv::Mat>& ImgS, const QStringList& data)
bool QtCameraDebug::setData(int cameraIndex, const std::vector<cv::Mat>& ImgS, const QStringList& data)
{
if (queue_MyPbGlobalObject.size() <= cameraIndex + 1)
return false;
+1 -1
View File
@@ -33,7 +33,7 @@ public:
bool initCamera(int cameraIndex);
//4、设置
//参数:相机序号、图像参数(不使用)、设置的相机参数
bool setData(int cameraIndex, const vector<cv::Mat>&, const QStringList&);
bool setData(int cameraIndex, const std::vector<cv::Mat>&, const QStringList&);
//5、获取数据
//参数:相机序号、获取的图像、获取的数据(实际无)
bool data(int cameraIndex, std::vector<cv::Mat>&, QStringList&);
-1
View File
@@ -21,7 +21,6 @@
////OPT
//#include "OPTApi.h" //OPT和海康有部分名称一样,OPT时使用海康
//#pragma comment(lib,"./OPTSDK.lib")
using namespace std;
QtDefectSet::QtDefectSet(QMainWindow*parent)
: QMainWindow(parent)
{
-1
View File
@@ -9,7 +9,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <process.h>
#include <time.h>
#include "QHeaderView.h"
+3 -3
View File
@@ -1716,9 +1716,9 @@ void Qt_epWindow::showDefectData()
QStringList offLineCameraKeyS;
void Qt_epWindow::getTransferData(QString key, QString cameraName, QString snInfo, QByteArray byte)
void Qt_epWindow::getTransferData(QString key, QString cameraName, QString snInfo, QByteArray byteArray)
{
QString myByte = byte;
QString myByte = byteArray;
//ui.plainTextEdit->appendPlainText("key: " + key + " cameraName:" + cameraName + " snInfo:" + snInfo + " myByte:" + myByte + " sendNgInfo:" + sendNgInfo);
//qApp->processEvents();
@@ -2070,7 +2070,7 @@ void Qt_epWindow::getTransferData(QString key, QString cameraName, QString snInf
{
QString mycameraKey_cName_index = cameraKey_cName_surface[i][j];
QString mykey_index = mycameraKey_cName_index.split("#")[0] + "_" + mycameraKey_cName_index.split("#")[1].split("_")[1];
if (cameraName == mykey_index && !byte.contains("1"))//匹配结果,1OK,2NG
if (cameraName == mykey_index && !byteArray.contains("1"))//匹配结果,1OK,2NG
{
/*QTableWidgetItem* m_Item2 = new QTableWidgetItem;
m_Item2->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
+1 -1
View File
@@ -39,7 +39,7 @@
//struct LogListStruct
//{
// QString key, QString cameraName, QString snInfo, QByteArray byte
// QString key, QString cameraName, QString snInfo, QByteArray byteArray
//};
struct QPieSeriesData
+3 -3
View File
@@ -1,4 +1,4 @@
#ifndef __base_Logic_H__
#ifndef __base_Logic_H__
#define __base_Logic_H__
#include <iostream>
@@ -56,8 +56,8 @@ public:
virtual bool sendPLC(QString cmd) { return true; }
virtual bool reLoadJsonSetParameter(QStringList moduleKeyList) { return true; }
signals:
virtual void Logic_sendTcpStatus(bool);
virtual void Logic_writeData(QString, QString, QString, QByteArray);
virtual void Logic_sendTcpStatus(bool) ;
virtual void Logic_writeData(QString, QString, QString, QByteArray) ;
virtual void Logic_cameraDisconnect(QString msg, bool status);
virtual void Logic_CommunicationDisconnect(QString msg, bool status);
private slots:
+222
View File
@@ -0,0 +1,222 @@
/****************************************************************************
** Meta object code from reading C++ file 'base_Logic.h'
**
** Created by: The Qt Meta Object Compiler version 67 (Qt 5.14.2)
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
#include <memory>
#include "base_Logic.h"
#include <QtCore/qbytearray.h>
#include <QtCore/qmetatype.h>
#if !defined(Q_MOC_OUTPUT_REVISION)
#error "The header file 'base_Logic.h' doesn't include <QObject>."
#elif Q_MOC_OUTPUT_REVISION != 67
#error "This file was generated using the moc from 5.14.2. It"
#error "cannot be used with the include files from this version of Qt."
#error "(The moc has changed too much.)"
#endif
QT_BEGIN_MOC_NAMESPACE
QT_WARNING_PUSH
QT_WARNING_DISABLE_DEPRECATED
struct qt_meta_stringdata_base_Logic_t {
QByteArrayData data[14];
char stringdata0[255];
};
#define QT_MOC_LITERAL(idx, ofs, len) \
Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len, \
qptrdiff(offsetof(qt_meta_stringdata_base_Logic_t, stringdata0) + ofs \
- idx * sizeof(QByteArrayData)) \
)
static const qt_meta_stringdata_base_Logic_t qt_meta_stringdata_base_Logic = {
{
QT_MOC_LITERAL(0, 0, 10), // "base_Logic"
QT_MOC_LITERAL(1, 11, 19), // "Logic_sendTcpStatus"
QT_MOC_LITERAL(2, 31, 0), // ""
QT_MOC_LITERAL(3, 32, 15), // "Logic_writeData"
QT_MOC_LITERAL(4, 48, 22), // "Logic_cameraDisconnect"
QT_MOC_LITERAL(5, 71, 3), // "msg"
QT_MOC_LITERAL(6, 75, 6), // "status"
QT_MOC_LITERAL(7, 82, 29), // "Logic_CommunicationDisconnect"
QT_MOC_LITERAL(8, 112, 21), // "processtask_sendImage"
QT_MOC_LITERAL(9, 134, 7), // "cv::Mat"
QT_MOC_LITERAL(10, 142, 25), // "processtask_sendTcpStatus"
QT_MOC_LITERAL(11, 168, 21), // "processtask_writeData"
QT_MOC_LITERAL(12, 190, 28), // "processtask_cameraDisconnect"
QT_MOC_LITERAL(13, 219, 35) // "processtask_CommunicationDisc..."
},
"base_Logic\0Logic_sendTcpStatus\0\0"
"Logic_writeData\0Logic_cameraDisconnect\0"
"msg\0status\0Logic_CommunicationDisconnect\0"
"processtask_sendImage\0cv::Mat\0"
"processtask_sendTcpStatus\0"
"processtask_writeData\0"
"processtask_cameraDisconnect\0"
"processtask_CommunicationDisconnect"
};
#undef QT_MOC_LITERAL
static const uint qt_meta_data_base_Logic[] = {
// content:
8, // revision
0, // classname
0, 0, // classinfo
9, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
4, // signalCount
// signals: name, argc, parameters, tag, flags
1, 1, 59, 2, 0x06 /* Public */,
3, 4, 62, 2, 0x06 /* Public */,
4, 2, 71, 2, 0x06 /* Public */,
7, 2, 76, 2, 0x06 /* Public */,
// slots: name, argc, parameters, tag, flags
8, 2, 81, 2, 0x08 /* Private */,
10, 1, 86, 2, 0x08 /* Private */,
11, 4, 89, 2, 0x08 /* Private */,
12, 2, 98, 2, 0x08 /* Private */,
13, 2, 103, 2, 0x08 /* Private */,
// signals: parameters
QMetaType::Void, QMetaType::Bool, 2,
QMetaType::Void, QMetaType::QString, QMetaType::QString, QMetaType::QString, QMetaType::QByteArray, 2, 2, 2, 2,
QMetaType::Void, QMetaType::QString, QMetaType::Bool, 5, 6,
QMetaType::Void, QMetaType::QString, QMetaType::Bool, 5, 6,
// slots: parameters
QMetaType::Void, QMetaType::QString, 0x80000000 | 9, 2, 2,
QMetaType::Void, QMetaType::Bool, 2,
QMetaType::Void, QMetaType::QString, QMetaType::QString, QMetaType::QString, QMetaType::QByteArray, 2, 2, 2, 2,
QMetaType::Void, QMetaType::QString, QMetaType::Bool, 5, 6,
QMetaType::Void, QMetaType::QString, QMetaType::Bool, 5, 6,
0 // eod
};
void base_Logic::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
auto *_t = static_cast<base_Logic *>(_o);
Q_UNUSED(_t)
switch (_id) {
case 0: _t->Logic_sendTcpStatus((*reinterpret_cast< bool(*)>(_a[1]))); break;
case 1: _t->Logic_writeData((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2])),(*reinterpret_cast< QString(*)>(_a[3])),(*reinterpret_cast< QByteArray(*)>(_a[4]))); break;
case 2: _t->Logic_cameraDisconnect((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break;
case 3: _t->Logic_CommunicationDisconnect((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break;
case 4: _t->processtask_sendImage((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< cv::Mat(*)>(_a[2]))); break;
case 5: _t->processtask_sendTcpStatus((*reinterpret_cast< bool(*)>(_a[1]))); break;
case 6: _t->processtask_writeData((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< QString(*)>(_a[2])),(*reinterpret_cast< QString(*)>(_a[3])),(*reinterpret_cast< QByteArray(*)>(_a[4]))); break;
case 7: _t->processtask_cameraDisconnect((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break;
case 8: _t->processtask_CommunicationDisconnect((*reinterpret_cast< QString(*)>(_a[1])),(*reinterpret_cast< bool(*)>(_a[2]))); break;
default: ;
}
} else if (_c == QMetaObject::IndexOfMethod) {
int *result = reinterpret_cast<int *>(_a[0]);
{
using _t = void (base_Logic::*)(bool );
if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&base_Logic::Logic_sendTcpStatus)) {
*result = 0;
return;
}
}
{
using _t = void (base_Logic::*)(QString , QString , QString , QByteArray );
if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&base_Logic::Logic_writeData)) {
*result = 1;
return;
}
}
{
using _t = void (base_Logic::*)(QString , bool );
if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&base_Logic::Logic_cameraDisconnect)) {
*result = 2;
return;
}
}
{
using _t = void (base_Logic::*)(QString , bool );
if (*reinterpret_cast<_t *>(_a[1]) == static_cast<_t>(&base_Logic::Logic_CommunicationDisconnect)) {
*result = 3;
return;
}
}
}
}
QT_INIT_METAOBJECT const QMetaObject base_Logic::staticMetaObject = { {
QMetaObject::SuperData::link<QObject::staticMetaObject>(),
qt_meta_stringdata_base_Logic.data,
qt_meta_data_base_Logic,
qt_static_metacall,
nullptr,
nullptr
} };
const QMetaObject *base_Logic::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
}
void *base_Logic::qt_metacast(const char *_clname)
{
if (!_clname) return nullptr;
if (!strcmp(_clname, qt_meta_stringdata_base_Logic.stringdata0))
return static_cast<void*>(this);
return QObject::qt_metacast(_clname);
}
int base_Logic::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
if (_id < 9)
qt_static_metacall(this, _c, _id, _a);
_id -= 9;
} else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
if (_id < 9)
*reinterpret_cast<int*>(_a[0]) = -1;
_id -= 9;
}
return _id;
}
// SIGNAL 0
void base_Logic::Logic_sendTcpStatus(bool _t1)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))) };
QMetaObject::activate(this, &staticMetaObject, 0, _a);
}
// SIGNAL 1
void base_Logic::Logic_writeData(QString _t1, QString _t2, QString _t3, QByteArray _t4)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t2))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t3))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t4))) };
QMetaObject::activate(this, &staticMetaObject, 1, _a);
}
// SIGNAL 2
void base_Logic::Logic_cameraDisconnect(QString _t1, bool _t2)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t2))) };
QMetaObject::activate(this, &staticMetaObject, 2, _a);
}
// SIGNAL 3
void base_Logic::Logic_CommunicationDisconnect(QString _t1, bool _t2)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t2))) };
QMetaObject::activate(this, &staticMetaObject, 3, _a);
}
QT_WARNING_POP
QT_END_MOC_NAMESPACE
@@ -486,12 +486,12 @@ bool Hd_AI_empty_module::writeData(std::vector<cv::Mat>& vec_mat, QByteArray &da
//传入initParas函数,格式为:相机key+参数名1#参数值1#参数值2+参数名2#参数值1...
//初始化
bool Hd_AI_empty_module::initParas(QByteArray& byte)
bool Hd_AI_empty_module::initParas(QByteArray& byteArray)
{
QByteArrayList valueList = byte.split('+');
QByteArrayList valueList = byteArray.split('+');
QStringList valueiList;
if (byte.contains("onlySetParameter"))
if (byteArray.contains("onlySetParameter"))
{
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "onlySetParameter,valueList[0]:" << valueList[0];
if (valueList.size() > 1)
@@ -543,37 +543,37 @@ bool Hd_AI_empty_module::initParas(QByteArray& byte)
return true;
}
// 解码
bool Hd_AI_empty_module::decodeAiValue(QByteArray byte,QVector<QByteArray> &vec_ret)
bool Hd_AI_empty_module::decodeAiValue(QByteArray byteArray,QVector<QByteArray> &vec_ret)
{
if(byte.isEmpty())
if(byteArray.isEmpty())
{
qCritical() << "[Error] " << " byte is null!";
qCritical() << "[Error] " << " byteArray is null!";
return false;
}
/*******************************************/
byte.remove(0,8);
QByteArray mm_data = byte.mid(0,4);
byteArray.remove(0,8);
QByteArray mm_data = byteArray.mid(0,4);
memcpy((void*)&paramNum,(void*)mm_data.data(), 4);
qDebug() << "[INFO] " << " paramNum:" << paramNum;
byte.remove(0,4);
byteArray.remove(0,4);
/*******************************************/
while (!byte.isEmpty())
while (!byteArray.isEmpty())
{
int type = 0;
QByteArray m_type = byte.mid(0,4);
QByteArray m_type = byteArray.mid(0,4);
memcpy((void*)&type,(void*)m_type.data(), 4);
byte.remove(0,4);
byteArray.remove(0,4);
int len = 0;
QByteArray m_len = byte.mid(0,4);
QByteArray m_len = byteArray.mid(0,4);
memcpy((void*)&len,(void*)m_len.data(), 4);
byte.remove(0,4);
byteArray.remove(0,4);
QByteArray mm_data = byte.mid(0,len);
QByteArray mm_data = byteArray.mid(0,len);
vec_ret.append(mm_data);
byte.remove(0,len);
byteArray.remove(0,len);
}
return true;
}
@@ -388,16 +388,16 @@ bool Hd_AI_seg_module::writeData(std::vector<cv::Mat>& vec_mat, QByteArray &data
return true;
}
//初始化
bool Hd_AI_seg_module::initParas(QByteArray& byte)
bool Hd_AI_seg_module::initParas(QByteArray& byteArray)
{
//if(byte.isEmpty())
//if(byteArray.isEmpty())
//{
// qCritical() << "[Error] " << " byte is null!";
// qCritical() << "[Error] " << " byteArray is null!";
// return false;
//}
//QVector<QByteArray> vec_ret;
//decodeAiValue(byte,vec_ret);
//decodeAiValue(byteArray,vec_ret);
//if(vec_ret.isEmpty())
//{
// qCritical() << "[Error] " << " vec_ret is null!";
@@ -451,37 +451,37 @@ bool Hd_AI_seg_module::initParas(QByteArray& byte)
return true;
}
// 解码
bool Hd_AI_seg_module::decodeAiValue(QByteArray byte,QVector<QByteArray> &vec_ret)
bool Hd_AI_seg_module::decodeAiValue(QByteArray byteArray,QVector<QByteArray> &vec_ret)
{
if(byte.isEmpty())
if(byteArray.isEmpty())
{
qCritical() << "[Error] " << " byte is null!";
qCritical() << "[Error] " << " byteArray is null!";
return false;
}
/*******************************************/
byte.remove(0,8);
QByteArray mm_data = byte.mid(0,4);
byteArray.remove(0,8);
QByteArray mm_data = byteArray.mid(0,4);
memcpy((void*)&paramNum,(void*)mm_data.data(), 4);
qDebug() << "[INFO] " << " paramNum:" << paramNum;
byte.remove(0,4);
byteArray.remove(0,4);
/*******************************************/
while (!byte.isEmpty())
while (!byteArray.isEmpty())
{
int type = 0;
QByteArray m_type = byte.mid(0,4);
QByteArray m_type = byteArray.mid(0,4);
memcpy((void*)&type,(void*)m_type.data(), 4);
byte.remove(0,4);
byteArray.remove(0,4);
int len = 0;
QByteArray m_len = byte.mid(0,4);
QByteArray m_len = byteArray.mid(0,4);
memcpy((void*)&len,(void*)m_len.data(), 4);
byte.remove(0,4);
byteArray.remove(0,4);
QByteArray mm_data = byte.mid(0,len);
QByteArray mm_data = byteArray.mid(0,len);
vec_ret.append(mm_data);
byte.remove(0,len);
byteArray.remove(0,len);
}
return true;
}
@@ -53,7 +53,7 @@ public:
bool checkStatus();// { return true; };
bool encodeResultValue(QVector<std::string> append_value,QByteArray &resultByte);
bool decodeAiValue(QByteArray byte,QVector<QByteArray> &vec_ret);
bool decodeAiValue(QByteArray byteArray,QVector<QByteArray> &vec_ret);
//---------检测流程,根据实际项目修改---------
bool AIdetect(cv::Mat img2D, QString saveKey, QString Dir2D, QString SN, QString DataTime);
+2 -3
View File
@@ -1,11 +1,10 @@
#ifndef PBGLOBALOBJECT_H
#ifndef PBGLOBALOBJECT_H
#define PBGLOBALOBJECT_H
#include <QObject>
#include<opencv2/opencv.hpp>
#include <opencv.hpp>
using namespace std;
//type对应的相机、触发方式
#define HIK_Hard 0 //海康
@@ -39,7 +38,7 @@ public:
virtual QMap<QString,QString> parameters() = 0;
virtual bool init() { return true; }
virtual bool setData(const vector<cv::Mat> &, const QStringList &) { return true; }
virtual bool setData(const std::vector<cv::Mat> &, const QStringList &) { return true; }
virtual bool data(std::vector<cv::Mat> &, QStringList &) { return true; }
public:
//大类
+20 -20
View File
@@ -164,8 +164,8 @@ Logic_transfer::Logic_transfer()
{
showMutex = new QMutex;
ifRuntransfer = true;
//通用逻辑接口
//加载逻辑dll
//ͨ���߼��ӿ�
//�����߼�dll
QLibrary* m_lib = new QLibrary("Hd_LogicDll_module.dll");
bool flag = m_lib->load();
if (!m_lib->isLoaded())
@@ -185,20 +185,20 @@ Logic_transfer::Logic_transfer()
Logic_ptr = createFun();
destory_Logic = releaseFun;
//加载并检查配置文件:bin/camera_cfg.json
//���ز���������ļ���bin/camera_cfg.json
//m_jsonObj =load_camera_cfg();
//check_cmeraCfg();
//Logic_ptr->setJsonObject(m_jsonObj);
//信号与槽
//����
if(Logic_ptr) {
//connect(Logic_ptr, SIGNAL(Logic_sendImage(QString, cv::Mat)), this, SLOT(base_Logic_sendImage(QString, cv::Mat))); // 传递图片
connect(Logic_ptr, SIGNAL(Logic_writeData(QString, QString, QString, QByteArray, QString)), this, SLOT(base_Logic_writeData(QString, QString, QString, QByteArray, QString)));// 传递数据
//connect(Logic_ptr, SIGNAL(Logic_sendImage(QString, cv::Mat)), this, SLOT(base_Logic_sendImage(QString, cv::Mat))); // ����ͼƬ
connect(Logic_ptr, SIGNAL(Logic_writeData(QString, QString, QString, QByteArray, QString)), this, SLOT(base_Logic_writeData(QString, QString, QString, QByteArray, QString)));// ��������
QFuture<void>muf = QtConcurrent::run(this, &Logic_transfer::check_sendImgStruct);
}
}
}
Sleep(50);
//自动写Log日志功能;bin/Log
//�Զ�дLog��־���ܣ�bin/Log
qInstallMessageHandler(LogMsgOutput);
}
@@ -210,12 +210,12 @@ void Logic_transfer::check_sendImgStruct()
//if (Logic_ptr->queue_sendImgStruct.size() > 0)
if (Logic_ptr->get_sendImgStruct(myS))
{
//QMutexLocker locker(sendImgStructMutex); // 加锁
//QMutexLocker locker(sendImgStructMutex); // ����
//sendImgStruct mS;
//mS.send_Mat = myL.send_Mat;
//mS.cameraKey_index = myL.cameraKey_index;
////堆积了,只显示最新的
////�ѻ��ˣ�ֻ��ʾ���µ�
//for (int i = 0; i < queue_sendImgStruct.size(); i++)
// if (myL.cameraKey_index == queue_sendImgStruct[i].cameraKey_index)
// {
@@ -235,7 +235,7 @@ void Logic_transfer::check_sendImgStruct()
}
bool Logic_transfer::getShowQImage(QQueue< showImgStruct>& my_showImgStruct)
{
QMutexLocker locker(showMutex); // 加锁
QMutexLocker locker(showMutex); // ����
//showImgStruct mS;
if (queue_showImgStruct.size() > 0)
{
@@ -251,24 +251,24 @@ void Logic_transfer::base_Logic_sendImage(QString key, cv::Mat mtx)
try
{
if (!mtx.empty()) {
if ((mtx.dataend - mtx.datastart) != mtx.cols * mtx.rows * mtx.channels()) //尝试能否解决mtx内容异常问题
if ((mtx.dataend - mtx.datastart) != mtx.cols * mtx.rows * mtx.channels()) //�����ܷ���mtx�����쳣����
{
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " mtx.dataend - mtx.datastart err!!:";
qCritical() << __FUNCTION__ << " line:" << __LINE__ << " mtx.dataend - mtx.datastart err����:";
return;// false;
}
cv::Mat rgb;
//while (mtx.cols > 2000 || mtx.rows > 2000)
// cv::resize(mtx, mtx, cv::Size(), 0.1, 0.1); //吃cpu性能,i7 8700,4800*4800的resize耗时100ms;QImage*的scaled缩放,耗时200ms
// cv::resize(mtx, mtx, cv::Size(), 0.1, 0.1); //��cpu���ܣ�i7 8700��4800*4800��resize��ʱ100ms��QImage*��scaled���ţ���ʱ200ms
QImage* itemImage = nullptr;
if (mtx.type() == CV_8UC1)
{
rgb = mtx.clone(); //mtx.data检查后,只有2个数据,clone崩溃
rgb = mtx.clone(); //mtx.data����ֻ��2�����ݣ�clone����
itemImage = new QImage(QSize(rgb.cols, rgb.rows), QImage::Format_Grayscale8);
QImage qim((const unsigned char*)rgb.data, rgb.cols, rgb.rows, rgb.step, QImage::Format_Grayscale8);
*itemImage = qim.copy();
}
else if (mtx.type() == CV_16U) // 双通道转单通道显示
else if (mtx.type() == CV_16U) // ˫ͨ��ת��ͨ����ʾ
{
cv::normalize(mtx, mtx, 0, 255, cv::NORM_MINMAX);
cv::convertScaleAbs(mtx, rgb);
@@ -292,12 +292,12 @@ void Logic_transfer::base_Logic_sendImage(QString key, cv::Mat mtx)
}
//emit LogicTransfer_sendImage(key, itemImage);
QMutexLocker locker(showMutex); // 加锁
QMutexLocker locker(showMutex); // ����
showImgStruct mS;
mS.show_QImage = itemImage;
mS.cameraKey_index = key;
////堆积了,只显示最新的
////�ѻ��ˣ�ֻ��ʾ���µ�
//for (int i = 0; i < queue_showImgStruct.size(); i++)
// if (key == queue_showImgStruct[i].cameraKey_index)
// {
@@ -321,7 +321,7 @@ Logic_transfer::~Logic_transfer()
ifRuntransfer = false;
Sleep(100);
//通用逻辑接口
//ͨ���߼��ӿ�
destory_Logic(Logic_ptr);
}
@@ -330,9 +330,9 @@ void Logic_transfer::base_Logic_sendTcpStatus(bool flag)
{
emit LogicTransfer_sendTcpStatus(flag);
}
void Logic_transfer::base_Logic_writeData(QString key, QString cameraName, QString snInfo, QByteArray byte, QString sendNgInfo)
void Logic_transfer::base_Logic_writeData(QString key, QString cameraName, QString snInfo, QByteArray byteArray, QString sendNgInfo)
{
emit LogicTransfer_writeData(key, cameraName, snInfo, byte, sendNgInfo);
emit LogicTransfer_writeData(key, cameraName, snInfo, byteArray, sendNgInfo);
}
void Logic_transfer::base_Logic_cameraDisconnect(QString msg, bool status)
{
+9 -9
View File
@@ -1,13 +1,13 @@
#pragma once
//通用逻辑接口
//ͨ���߼��ӿ�
#include "base_Logic.h"
//无法用信号槽传递图像?
//返回图片的结构体
//�޷����źŲ۴���ͼ��
//����ͼƬ�Ľṹ��
struct showImgStruct
{
QImage* show_QImage; //返回的图像
QString cameraKey_index; //关键字_序号
QImage* show_QImage; //���ص�ͼ��
QString cameraKey_index; //�ؼ���_���
};
typedef base_Logic* (*CreateFunction)();
@@ -77,7 +77,7 @@ public:
QMutex* showMutex;
QQueue< showImgStruct> queue_showImgStruct;
bool getShowQImage(QQueue< showImgStruct>&);
//内部使用
//�ڲ�ʹ��
private:
QString currPath;
@@ -85,11 +85,11 @@ private:
QJsonObject m_jsonObj;
base_Logic* Logic_ptr;
ReleaseFunction destory_Logic = nullptr; //释放
ReleaseFunction destory_Logic = nullptr; //�ͷ�
void check_sendImgStruct();
//对外接口
//����ӿ�
signals:
void LogicTransfer_sendImage(QString, QImage*);
void LogicTransfer_sendTcpStatus(bool);
@@ -99,7 +99,7 @@ signals:
private slots:
void base_Logic_sendImage(QString key, cv::Mat mtx);
void base_Logic_sendTcpStatus(bool flag);
void base_Logic_writeData(QString key, QString cameraName, QString snInfo, QByteArray byte, QString sendNgInfo);
void base_Logic_writeData(QString key, QString cameraName, QString snInfo, QByteArray byteArray, QString sendNgInfo);
void base_Logic_cameraDisconnect(QString msg, bool status);
void base_Logic_CommunicationDisconnect(QString msg, bool status);
};
-1
View File
@@ -19,7 +19,6 @@
#include <QJsonParseError>
#include "qimage.h"
#include<qtimer.h>
#include <Windows.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
-1
View File
@@ -10,7 +10,6 @@
#include <opencv2/opencv.hpp>
#include <windows.h>
#include <stdlib.h>
using namespace std;
using namespace cv;