增加halconGuard类,用于防止halcon算法的输入输出和程序不一致而引起的报错,并且会检查算法文件是否存在,如不存在则会弹窗提示。 增加handleAiGpuThreadGuard类,用于防止因重复调用同一个模型而引起的报错,并且支持不停机更新模型,支持初始化时检测模型文件是否存在。 增加内存占用显示控件。 用户管理增加root权限,默认密码为dseuiroot,模型热更新时需要此权限。 支持缓存界面上的检测数据。 相机模块新增在回调后的指定时间没有取图时则清空容器的功能。 增加等待结果汇总功能,在启用时同一个SN的图片会等待总结果后再进行存图。 存图线程修改为多线程编码,单线程储存,提高IO效率。并且增加根据内存占用的百分比更新存图逻辑的功能,默认占用超过70%不储存OK原图,超过80%不储存原图,超过90%时不储存所有图片。
132 lines
3.3 KiB
C++
132 lines
3.3 KiB
C++
#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()
|
|
{
|
|
|
|
}
|
|
|
|
Hd_VirtualCamera::~Hd_VirtualCamera()
|
|
{
|
|
|
|
|
|
if (n_mutex)
|
|
{
|
|
delete n_mutex;
|
|
n_mutex = nullptr;
|
|
}
|
|
|
|
qDebug() << "[info]" << __FUNCTION__ << "line:" << __LINE__ << " delete success!";
|
|
}
|
|
|
|
bool Hd_VirtualCamera::readData(std::vector<cv::Mat>& mat, QByteArray& data)
|
|
{
|
|
Q_UNUSED(data)
|
|
|
|
|
|
int cnt = 0;
|
|
while (queuePic.empty())
|
|
{
|
|
cnt++;
|
|
QThread::msleep(10);
|
|
if (cnt > 3000)
|
|
{
|
|
qCritical() << " [ error] " << __FUNCTION__ << " line:" << __LINE__ << " srcImage is null";
|
|
return false;
|
|
}
|
|
}
|
|
callbackCollectTimeoutTimer.stop();
|
|
n_mutex->lock();
|
|
vector<cv::Mat> dstMat = queuePic.dequeue();
|
|
n_mutex->unlock();
|
|
//for (int i=0;i<dstMat.size();i++)
|
|
// imwrite("D://CCD//2.5//2.5D_" + to_string(clock()) + "_"+ sImageType [i] + ".bmp", dstMat[i]);
|
|
mat.insert(mat.end(), dstMat.begin(), dstMat.end());
|
|
qCritical() << " [ error] " << __FUNCTION__ << " line:" << __LINE__ << "get image";
|
|
|
|
return true;
|
|
}
|
|
|
|
bool Hd_VirtualCamera::writeData(std::vector<cv::Mat>& mat, QByteArray& data)
|
|
{
|
|
Q_UNUSED(mat)
|
|
|
|
cameraName = data.toStdString();
|
|
return true;
|
|
}
|
|
|
|
bool Hd_VirtualCamera::initParas(QByteArray&n)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool Hd_VirtualCamera::run()//�����
|
|
{
|
|
callbackCollectTimeoutTimer.start();
|
|
QThread::msleep(1000);
|
|
n_mutex->lock();
|
|
if (cameraName == "25D-1" || cameraName == "25D-2") {
|
|
vector<cv::Mat> mats;
|
|
mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count0.bmp", -1));
|
|
mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count1.bmp", -1));
|
|
mats.push_back(cv::imread("I:\\952Code\\CODES\\16H\\A2250709-162941554918413\\A2250709-1629415549184132.5D-H-2_16-31-32-65_Count2.bmp", -1));
|
|
queuePic.enqueue(mats);
|
|
}
|
|
else {
|
|
vector<cv::Mat> mats;
|
|
mats.push_back(cv::Mat(2096,4800,CV_8UC3,cv::Scalar(0,0,0)));
|
|
queuePic.enqueue(mats);
|
|
}
|
|
n_mutex->unlock();
|
|
return true;
|
|
}
|
|
|
|
Hd_VirtualCamera* create(){
|
|
qDebug() << "[info]" << __FUNCTION__ << "line:" << __LINE__ << "Hd_VirtualCamera create success!";
|
|
return new Hd_VirtualCamera;
|
|
}
|
|
void destory(Hd_VirtualCamera* ptr){
|
|
if (ptr)
|
|
{
|
|
delete ptr;
|
|
ptr = nullptr;
|
|
}
|
|
qDebug() << "[info] " << __FUNCTION__ << " line:" << __LINE__ << "Hd_MvCamera_module destory success!";
|
|
} |