On main: V20260416-2.5.1
增加halconGuard类,用于防止halcon算法的输入输出和程序不一致而引起的报错,并且会检查算法文件是否存在,如不存在则会弹窗提示。 增加handleAiGpuThreadGuard类,用于防止因重复调用同一个模型而引起的报错,并且支持不停机更新模型,支持初始化时检测模型文件是否存在。 增加内存占用显示控件。 用户管理增加root权限,默认密码为dseuiroot,模型热更新时需要此权限。 支持缓存界面上的检测数据。 相机模块新增在回调后的指定时间没有取图时则清空容器的功能。 增加等待结果汇总功能,在启用时同一个SN的图片会等待总结果后再进行存图。 存图线程修改为多线程编码,单线程储存,提高IO效率。并且增加根据内存占用的百分比更新存图逻辑的功能,默认占用超过70%不储存OK原图,超过80%不储存原图,超过90%时不储存所有图片。
This commit is contained in:
@@ -37,7 +37,9 @@ public:
|
||||
bool writeData(std::vector<cv::Mat>&, QByteArray&);
|
||||
bool initParas(QByteArray&);
|
||||
bool run();
|
||||
|
||||
bool checkStatus() {
|
||||
return true;
|
||||
}
|
||||
std::string sTriggerSource;
|
||||
private:
|
||||
bool softwareTriggerStatus = 0;
|
||||
|
||||
@@ -60,6 +60,9 @@ public:
|
||||
|
||||
bool decodeInitData(QByteArray byteArray, QVector<QByteArray>& vector_data);
|
||||
bool InitHighSpeed();
|
||||
bool checkStatus() {
|
||||
return true;
|
||||
}
|
||||
private:
|
||||
//int LJXA_ACQ_Acquire(int lDeviceId, unsigned short* heightImage, unsigned short* luminanceImage, LJXA_ACQ_SETPARAM* setParam, LJXA_ACQ_GETPARAM* getParam);
|
||||
LJX8IF_HIGH_SPEED_PRE_START_REQ* startReq_ptr = nullptr;
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
#include "Hd_CameraModule_HIK_General.h"
|
||||
#include <qtimer.h>
|
||||
using namespace std;
|
||||
#include <QTextCodec>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <qelapsedtimer.h>
|
||||
enum statusEnum {
|
||||
CONNECTED,
|
||||
RECONNECTING,
|
||||
@@ -29,7 +31,39 @@ int cameraIndex = -1;
|
||||
QString lastError;
|
||||
QQueue<cv::Mat> queuepic;
|
||||
QMutex* n_mutex = new QMutex();
|
||||
|
||||
class callbackCollectTimeoutTimerClass : public QThread {
|
||||
public:
|
||||
void run() {
|
||||
runFlag.store(true);
|
||||
counter = 0;
|
||||
while (runFlag.load() && counter < interval.load()) {
|
||||
QThread::msleep(ontTimeSleepInterval);
|
||||
counter += ontTimeSleepInterval;
|
||||
}
|
||||
if (runFlag.load() && counter >= interval.load())
|
||||
timeoutAction();
|
||||
}
|
||||
void timeoutAction() {
|
||||
QMutexLocker locker(n_mutex);
|
||||
if (queuepic.size() > 0) {
|
||||
queuepic.clear();
|
||||
qDebug() << QString::fromStdString(Username) << "上次回调后未取图,已因超时清除缓存,interval" << interval;
|
||||
std::cout << Username << "上次回调后未取图,已因超时清除缓存,interval" << interval << std::endl;
|
||||
}
|
||||
}
|
||||
void setInterval(int msec) {
|
||||
interval.store(msec);
|
||||
}
|
||||
void stop() {
|
||||
runFlag.store(false);
|
||||
}
|
||||
private:
|
||||
int counter = 0;
|
||||
std::atomic<bool> runFlag = false;
|
||||
std::atomic<int> interval = 1500;
|
||||
int ontTimeSleepInterval = 10;
|
||||
};
|
||||
callbackCollectTimeoutTimerClass callbackCollectTimeoutTimer;
|
||||
void* handle = NULL;
|
||||
void CloseDevice();
|
||||
|
||||
@@ -183,6 +217,7 @@ void __stdcall ReconnectDevice(unsigned int nMsgType, void* pUser){
|
||||
void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0)
|
||||
{
|
||||
Q_UNUSED(pUser0)
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
int frameNum = 0;
|
||||
double time_Start = (double)clock();
|
||||
QMutexLocker locker(n_mutex);
|
||||
@@ -245,12 +280,14 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
|
||||
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
|
||||
}
|
||||
queuepic.enqueue(srcImage);
|
||||
callbackCollectTimeoutTimer.start();
|
||||
if (queuepic.size() > 10)
|
||||
queuepic.dequeue();
|
||||
pData0 = { 0 };
|
||||
double time_End = (double)clock();
|
||||
qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg getImg,Time:" << (time_End - time_Start) << "ms"
|
||||
<< "--CameraName:" << QString::fromStdString(Username) << " imgIndex:" << imgIndex << "nFrameNum : " << frameNum;
|
||||
|
||||
}
|
||||
|
||||
//关闭设备
|
||||
@@ -280,10 +317,15 @@ void CloseDevice()
|
||||
|
||||
handle = nullptr;
|
||||
}
|
||||
Hd_CameraModule_HIK_General::Hd_CameraModule_HIK_General() {
|
||||
|
||||
}
|
||||
Hd_CameraModule_HIK_General::~Hd_CameraModule_HIK_General()
|
||||
{
|
||||
runFlag = false;
|
||||
|
||||
// 防止定时线程在资源析构后仍访问队列和互斥锁
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
|
||||
// 等待重连线程结束
|
||||
int waitCount = 0;
|
||||
@@ -309,10 +351,10 @@ bool Hd_CameraModule_HIK_General::readData(std::vector<cv::Mat>& mat, QByteArray
|
||||
{
|
||||
return false;
|
||||
}
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
QMutexLocker locker(n_mutex);
|
||||
cv::Mat img = queuepic.dequeue();
|
||||
mat.push_back(img);
|
||||
|
||||
qDebug() << "[INFO] " << __FUNCTION__ << " line:" << __LINE__ << " checkImg readData--CameraName:" << QString::fromStdString(Username) << "--imgIndex : " << imgIndex;
|
||||
return true;
|
||||
}
|
||||
@@ -332,11 +374,11 @@ bool Hd_CameraModule_HIK_General::writeData(std::vector<cv::Mat>& mat, QByteArra
|
||||
data = lastError.toUtf8();
|
||||
return true;
|
||||
}
|
||||
//if (data == "clearCache") {
|
||||
// QMutexLocker locker(n_mutex);
|
||||
// queuepic.clear();
|
||||
// return true;
|
||||
//}
|
||||
if (data == "clearCache") {
|
||||
QMutexLocker locker(n_mutex);
|
||||
queuepic.clear();
|
||||
return true;
|
||||
}
|
||||
if (data.contains("exposure")){
|
||||
auto commandList = data.split('_');
|
||||
QMutexLocker locker(n_mutex);
|
||||
@@ -408,7 +450,7 @@ bool Hd_CameraModule_HIK_General::run()
|
||||
bool Hd_CameraModule_HIK_General::checkStatus()
|
||||
{
|
||||
//status = moduleStatus;
|
||||
return status;
|
||||
return cameraStatus == CONNECTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ bool IsColor(MvGvspPixelType enType)
|
||||
class Hd_CameraModule_HIK_General :public dsModuleBase
|
||||
{
|
||||
public:
|
||||
Hd_CameraModule_HIK_General() {};
|
||||
Hd_CameraModule_HIK_General();
|
||||
virtual ~Hd_CameraModule_HIK_General();
|
||||
//从类中读数据到实例对象
|
||||
bool readData(std::vector<cv::Mat>& mat, QByteArray& data);
|
||||
|
||||
@@ -31,7 +31,40 @@ int cameraIndex = -1;
|
||||
QString lastError;
|
||||
QQueue<cv::Mat> queuepic;
|
||||
QMutex* n_mutex = new QMutex();
|
||||
|
||||
class callbackCollectTimeoutTimerClass : public QThread {
|
||||
public:
|
||||
void run() {
|
||||
runFlag.store(true, std::memory_order_release);
|
||||
counter = 0;
|
||||
while (runFlag.load() && counter < interval.load()) {
|
||||
QThread::msleep(ontTimeSleepInterval);
|
||||
counter += ontTimeSleepInterval;
|
||||
}
|
||||
if (runFlag.load() && counter >= interval.load())
|
||||
timeoutAction();
|
||||
}
|
||||
void timeoutAction() {
|
||||
QMutexLocker locker(n_mutex);
|
||||
if (queuepic.size() > 0) {
|
||||
queuepic.clear();
|
||||
qDebug() << QString::fromStdString(Username) << "上次回调后未取图,已因超时清除缓存,interval" << interval;
|
||||
std::cout << Username << "上次回调后未取图,已因超时清除缓存,interval" << interval << std::endl;
|
||||
}
|
||||
}
|
||||
void setInterval(int msec) {
|
||||
interval.store(msec);
|
||||
}
|
||||
void stop() {
|
||||
runFlag.store(false);
|
||||
terminate();
|
||||
}
|
||||
private:
|
||||
int counter = 0;
|
||||
std::atomic<bool> runFlag = false;
|
||||
std::atomic<int> interval = 1500;
|
||||
int ontTimeSleepInterval = 10;
|
||||
};
|
||||
callbackCollectTimeoutTimerClass callbackCollectTimeoutTimer;
|
||||
void* handle = NULL;
|
||||
void CloseDevice();
|
||||
|
||||
@@ -189,7 +222,7 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
|
||||
return;
|
||||
}
|
||||
eTimer.start();
|
||||
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
Q_UNUSED(pUser0)
|
||||
int frameNum = 0;
|
||||
double time_Start = (double)clock();
|
||||
@@ -252,6 +285,7 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
|
||||
{
|
||||
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
|
||||
}
|
||||
callbackCollectTimeoutTimer.start();
|
||||
queuepic.enqueue(srcImage);
|
||||
if (queuepic.size() > 10)
|
||||
queuepic.dequeue();
|
||||
@@ -288,7 +322,9 @@ void CloseDevice()
|
||||
|
||||
handle = nullptr;
|
||||
}
|
||||
|
||||
Hd_CameraModule_HIK_General::Hd_CameraModule_HIK_General() {
|
||||
\
|
||||
}
|
||||
Hd_CameraModule_HIK_General::~Hd_CameraModule_HIK_General()
|
||||
{
|
||||
runFlag = false;
|
||||
@@ -340,11 +376,11 @@ bool Hd_CameraModule_HIK_General::writeData(std::vector<cv::Mat>& mat, QByteArra
|
||||
data = lastError.toUtf8();
|
||||
return true;
|
||||
}
|
||||
/* if (data == "clearCache") {
|
||||
if (data == "clearCache") {
|
||||
QMutexLocker locker(n_mutex);
|
||||
queuepic.clear();
|
||||
return true;
|
||||
}*/
|
||||
}
|
||||
if (data.contains("exposure")) {
|
||||
auto commandList = data.split('_');
|
||||
QMutexLocker locker(n_mutex);
|
||||
@@ -416,7 +452,7 @@ bool Hd_CameraModule_HIK_General::run()
|
||||
bool Hd_CameraModule_HIK_General::checkStatus()
|
||||
{
|
||||
//status = moduleStatus;
|
||||
return status;
|
||||
return cameraStatus == CONNECTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ bool IsColor(MvGvspPixelType enType)
|
||||
class Hd_CameraModule_HIK_General :public dsModuleBase
|
||||
{
|
||||
public:
|
||||
Hd_CameraModule_HIK_General() {};
|
||||
Hd_CameraModule_HIK_General();
|
||||
virtual ~Hd_CameraModule_HIK_General();
|
||||
//从类中读数据到实例对象
|
||||
bool readData(std::vector<cv::Mat>& mat, QByteArray& data);
|
||||
|
||||
@@ -5,6 +5,7 @@ using namespace std;
|
||||
#include <atomic>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
#include <qelapsedtimer.h>
|
||||
enum statusEnum {
|
||||
CONNECTED,
|
||||
RECONNECTING,
|
||||
@@ -30,7 +31,39 @@ int cameraIndex = -1;
|
||||
QString lastError;
|
||||
QQueue<cv::Mat> queuepic;
|
||||
QMutex* n_mutex = new QMutex();
|
||||
|
||||
class callbackCollectTimeoutTimerClass : public QThread {
|
||||
public:
|
||||
void run() {
|
||||
runFlag.store(true);
|
||||
counter = 0;
|
||||
while (runFlag.load() && counter < interval.load()) {
|
||||
QThread::msleep(ontTimeSleepInterval);
|
||||
counter += ontTimeSleepInterval;
|
||||
}
|
||||
if (runFlag.load() && counter >= interval.load())
|
||||
timeoutAction();
|
||||
}
|
||||
void timeoutAction() {
|
||||
QMutexLocker locker(n_mutex);
|
||||
if (queuepic.size() > 0) {
|
||||
queuepic.clear();
|
||||
qDebug() << QString::fromStdString(Username) << "上次回调后未取图,已因超时清除缓存,interval" << interval;
|
||||
std::cout << Username << "上次回调后未取图,已因超时清除缓存,interval" << interval << std::endl;
|
||||
}
|
||||
}
|
||||
void setInterval(int msec) {
|
||||
interval.store(msec);
|
||||
}
|
||||
void stop() {
|
||||
runFlag.store(false);
|
||||
}
|
||||
private:
|
||||
int counter = 0;
|
||||
std::atomic<bool> runFlag = false;
|
||||
std::atomic<int> interval = 1500;
|
||||
int ontTimeSleepInterval = 10;
|
||||
};
|
||||
callbackCollectTimeoutTimerClass callbackCollectTimeoutTimer;
|
||||
void* handle = NULL;
|
||||
void CloseDevice();
|
||||
|
||||
@@ -184,7 +217,8 @@ void __stdcall ReconnectDevice(unsigned int nMsgType, void* pUser) {
|
||||
void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFrameInfo0, void* pUser0)
|
||||
{
|
||||
Q_UNUSED(pUser0)
|
||||
int frameNum = 0;
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
int frameNum = 0;
|
||||
double time_Start = (double)clock();
|
||||
QMutexLocker locker(n_mutex);
|
||||
cv::Mat srcImage = cv::Mat();
|
||||
@@ -245,7 +279,7 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
|
||||
{
|
||||
srcImage = cv::Mat(5, 5, CV_8UC1).setTo(0);
|
||||
}
|
||||
|
||||
callbackCollectTimeoutTimer.start();
|
||||
queuepic.push_back(srcImage);
|
||||
pData0 = { 0 };
|
||||
double time_End = (double)clock();
|
||||
@@ -253,11 +287,6 @@ void __stdcall ImageCallBackEx(unsigned char* pData0, MV_FRAME_OUT_INFO_EX* pFra
|
||||
<< "--CameraName:" << QString::fromStdString(Username) << " imgIndex:" << imgIndex << "nFrameNum : " << frameNum;
|
||||
}
|
||||
|
||||
Hd_CameraModule_HIK_hard_PCIE::Hd_CameraModule_HIK_hard_PCIE()
|
||||
{
|
||||
//m_thread = new MyThread;
|
||||
//m_mutex = new QMutex();
|
||||
}
|
||||
//关闭设备
|
||||
void CloseDevice()
|
||||
{
|
||||
@@ -272,8 +301,11 @@ void CloseDevice()
|
||||
//nRet = MV_CC_CloseDevice(handle);
|
||||
//nRet = MV_CC_DestroyHandle(handle);
|
||||
}
|
||||
Hd_CameraModule_HIK_hard_PCIE::Hd_CameraModule_HIK_hard_PCIE() {
|
||||
}
|
||||
Hd_CameraModule_HIK_hard_PCIE::~Hd_CameraModule_HIK_hard_PCIE()
|
||||
{
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
CloseDevice();
|
||||
if (n_mutex)
|
||||
{
|
||||
@@ -298,6 +330,7 @@ bool Hd_CameraModule_HIK_hard_PCIE::readData(std::vector<cv::Mat>& mat, QByteArr
|
||||
{
|
||||
return false;
|
||||
}
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
QMutexLocker locker(n_mutex);
|
||||
cv::Mat img = queuepic.dequeue();
|
||||
mat.push_back(img);
|
||||
|
||||
@@ -1,14 +1,46 @@
|
||||
#include "Hd_VirtualCamera.h"
|
||||
#include "Hd_VirtualCamera.h"
|
||||
#include <QDebug>
|
||||
QQueue<vector<cv::Mat>> queuePic;
|
||||
QMutex* n_mutex = new QMutex();
|
||||
|
||||
#include <qtimer.h>
|
||||
|
||||
|
||||
class callbackCollectTimeoutTimerClass : public QThread {
|
||||
public:
|
||||
void run() {
|
||||
runFlag = true;
|
||||
counter = 0;
|
||||
while (runFlag && counter < interval) {
|
||||
QThread::msleep(ontTimeSleepInterval);
|
||||
counter += ontTimeSleepInterval;
|
||||
}
|
||||
if (counter >= interval)
|
||||
timeoutAction();
|
||||
}
|
||||
void timeoutAction() {
|
||||
QMutexLocker locker(n_mutex);
|
||||
if (queuePic.size() > 0) {
|
||||
queuePic.clear();
|
||||
qDebug() << "上次回调后未取图,已因超时清除缓存,interval" << interval;
|
||||
std::cout << "上次回调后未取图,已因超时清除缓存,interval" << interval << std::endl;
|
||||
}
|
||||
}
|
||||
void setInterval(int msec) {
|
||||
interval = msec;
|
||||
}
|
||||
void stop() {
|
||||
runFlag = false;
|
||||
}
|
||||
private:
|
||||
int counter = 0;
|
||||
std::atomic<bool> runFlag = false;
|
||||
std::atomic<int> interval = 1500;
|
||||
int ontTimeSleepInterval = 10;
|
||||
};
|
||||
callbackCollectTimeoutTimerClass callbackCollectTimeoutTimer;
|
||||
Hd_VirtualCamera::Hd_VirtualCamera()
|
||||
{
|
||||
//m_thread = new MyThread;
|
||||
//m_mutex = new QMutex();
|
||||
|
||||
}
|
||||
|
||||
Hd_VirtualCamera::~Hd_VirtualCamera()
|
||||
@@ -29,7 +61,7 @@ bool Hd_VirtualCamera::readData(std::vector<cv::Mat>& mat, QByteArray& data)
|
||||
Q_UNUSED(data)
|
||||
|
||||
|
||||
int cnt = 0;
|
||||
int cnt = 0;
|
||||
while (queuePic.empty())
|
||||
{
|
||||
cnt++;
|
||||
@@ -40,6 +72,7 @@ bool Hd_VirtualCamera::readData(std::vector<cv::Mat>& mat, QByteArray& data)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
callbackCollectTimeoutTimer.stop();
|
||||
n_mutex->lock();
|
||||
vector<cv::Mat> dstMat = queuePic.dequeue();
|
||||
n_mutex->unlock();
|
||||
@@ -66,6 +99,7 @@ bool Hd_VirtualCamera::initParas(QByteArray&n)
|
||||
|
||||
bool Hd_VirtualCamera::run()//�����
|
||||
{
|
||||
callbackCollectTimeoutTimer.start();
|
||||
QThread::msleep(1000);
|
||||
n_mutex->lock();
|
||||
if (cameraName == "25D-1" || cameraName == "25D-2") {
|
||||
|
||||
@@ -20,7 +20,9 @@ public:
|
||||
bool writeData(std::vector<cv::Mat>&, QByteArray&);
|
||||
bool initParas(QByteArray&);
|
||||
bool run();
|
||||
|
||||
bool checkStatus() {
|
||||
return false;
|
||||
}
|
||||
std::string sTriggerSource;
|
||||
private:
|
||||
bool softwareTriggerStatus = 0;
|
||||
|
||||
Reference in New Issue
Block a user