触发器与相机联动成功

This commit is contained in:
2024-05-22 01:32:43 +08:00
parent 8c68d557eb
commit 323cc25cf7
13 changed files with 230 additions and 135 deletions
@@ -512,7 +512,17 @@ void algoThread::run()
detData* data = detQueue.dequeue();//取出数据
detQueueMutex.unlock();
int threadId = data->algoThreadIndex;//获取线程id
if (waitForImg(data) == false)
{
qDebug() << "取图失败";
cout << "get img err" << endl;
detDataManager* dManager = data->dManager;
data->dManager->deleteDetData(data->timeCode);
break;
}
detDataManager* dManager = data->dManager;
data->dManager->deleteDetData(data->timeCode);
continue;
if (threadId == 0)
{
int timeOut = 0;
@@ -714,7 +714,7 @@ public:
handleAiModel* modelPtr;
sqlManager* sql;
threadConroller* tManager;
threadManager* tManager;
sncodeCls* snDatas;
QMutex detQueueMutex;
@@ -729,11 +729,11 @@ public:
void run();
bool waitForImg(detData* data,int);
void getAllFiles(std::string path, std::vector<std::string>& files, std::string format);
void Init(threadConroller* threadConroller) {
tManager = threadConroller;
modelPtr = &threadConroller->models;
sql = threadConroller->sql;
snDatas = &threadConroller->snDatas;
void Init(threadManager* threadManager) {
tManager = threadManager;
modelPtr = &threadManager->models;
sql = threadManager->sql;
snDatas = &threadManager->snDatas;
}
bool addDetTask(detData*);//添加任务
@@ -8,7 +8,8 @@ backEndManager::backEndManager()
_jsonConfiguration = new jsonConfiguration();
_triggerManager = new triggerManager();
_cameraManager = new cameraManager();
_threadConroller = new threadConroller();
_threadManager = new threadManager();
_detDataManager = new detDataManager();
std::vector<std::future<void>> futures;//Òì²½³õʼ»¯
futures.push_back(std::async(std::launch::async, &triggerManager::init, _triggerManager, this));
futures.push_back(std::async(std::launch::async, &cameraManager::init, _cameraManager, this));
@@ -5,7 +5,8 @@
class triggerManager;
class cameraManager;
class jsonConfiguration;
class threadConroller;
class threadManager;
class detDataManager;
class backEndManager :public QObject
{
Q_OBJECT
@@ -15,7 +16,8 @@ public:
triggerManager* _triggerManager;//´¥·¢Æ÷
cameraManager* _cameraManager;
threadConroller* _threadConroller;
threadManager* _threadManager;
detDataManager* _detDataManager;
backEndManager();
~backEndManager();
signals:
+64 -42
View File
@@ -43,57 +43,79 @@ void camera::run()
std::vector<cv::Mat>camera_mat;
while (runFlag)
{
getCameraImg(camera_mat);
while(camera_mat.size()>0)
{
int size = imgQueue.size();
for (auto img : camera_mat)
{
imgQueue.enqueue(img);
if (lastUpdateTime.elapsed() > 200)//显示在界面
{
lastUpdateTime.start(); // 记录本次更新时间
QPixmap pixmap;
cvMatToQPixMap(img, pixmap);
showImgPack* pack = new showImgPack();
pack->img = pixmap;
pack->type = imgWidgetOri;
pack->index = index;
emit S1(pack);
}
else
{
showLost++;
qDebug() << cameraModulePtr.moduleName << "Lost show";
}
camera_mat.clear();
}
//getCameraImg(camera_mat);
//while(camera_mat.size()>0)
//{
// int size = imgQueue.size();
// for (auto img : camera_mat)
// {
// imgQueue.enqueue(img);
// if (lastUpdateTime.elapsed() > 200)//显示在界面
// {
// lastUpdateTime.start(); // 记录本次更新时间
// QPixmap pixmap;
// cvMatToQPixMap(img, pixmap);
// showImgPack* pack = new showImgPack();
// pack->img = pixmap;
// pack->type = imgWidgetOri;
// pack->index = index;
// emit S1(pack);
// }
// else
// {
// showLost++;
// qDebug() << cameraModulePtr.moduleName << "Lost show";
// }
// camera_mat.clear();
// }
//防止过大
while (imgQueue.size() > 5)
{
imgQueue.dequeue();
imgLost++;
qDebug() << cameraModulePtr.moduleName << "Lost img";
}
getCameraImg(camera_mat);
}
if (data != nullptr)
// //防止过大
// while (imgQueue.size() > 5)
// {
// imgQueue.dequeue();
// imgLost++;
// qDebug() << cameraModulePtr.moduleName << "Lost img";
// }
//
// getCameraImg(camera_mat);
//}
int queueSize = requestQueue.size() ;
if (queueSize >0)
{
data->imgMutex->lock();
mutex.lock();
detData *data = requestQueue.dequeue();
trigger();
data->imgMutex.lock();
const unsigned long long timeCode = data->timeCode;
while(1)
{
getCameraImg(data->imgs);
if (data->imgs.size() > data->imgAmountMin)
if (data->imgs.size() >= data->imgAmountMin)
{
qDebug() << data->timeCode << " Min:" << data->imgAmountMin << " Get:" << data->imgs.size();
data->imgMutex->unlock();
data = nullptr;
if (lastUpdateTime.elapsed() > 200)//显示在界面
{
lastUpdateTime.start(); // 记录本次更新时间
QPixmap pixmap;
cvMatToQPixMap(data->imgs[0], pixmap);
showImgPack* pack = new showImgPack();
pack->img = pixmap;
pack->type = imgWidgetOri;
pack->index = index;
emit S1(pack);
}
else
{
showLost++;
qDebug() << cameraModulePtr.moduleName << "Lost show";
}
data->imgMutex.unlock();
mutex.unlock();
break;
}
QThread::msleep(1);
}
data->imgMutex->unlock();
}
QThread::msleep(100);
}
@@ -164,7 +186,7 @@ void cameraManager::init(backEndManager* input)
{
camera* _camera = new camera(m_module,_backEndManager, cameras.size());
QObject::connect(_camera, &camera::S1, this, &cameraManager::R1);
cameras.insert(std::make_pair(m_module.key, _camera));
cameras.insert(std::make_pair(m_module.key.toStdString(), _camera));
qDebug() << "[INFO] " << " initParas success!";
}
else
+16 -4
View File
@@ -31,7 +31,7 @@ public:
void Process(detData* dataIn)
{
data = dataIn;
requestQueue.enqueue(dataIn);
}
//相机操作
@@ -44,6 +44,16 @@ public:
}
return true;
}
double getCameraValue()//点激光相机专用
{
double value = 0;
std::vector<cv::Mat> camera_mat;
QByteArray task_name;
if (!cameraModulePtr.module_ptr->sendData(camera_mat, task_name))
qCritical() << "[Error] " << " camera_mat is error! ";
value = task_name.toDouble();
return value;
}
void getCameraImg(std::vector<cv::Mat>& mats)
{
QByteArray task_name;
@@ -66,7 +76,7 @@ public:
signals:
void S1(showImgPack*);
private:
detData* data = nullptr;
//detData* data = nullptr;
void sendData(std::string str)
{
QByteArray task_name(QByteArray::fromStdString(str));
@@ -77,8 +87,10 @@ private:
int index = 0;
int timeout = 5000;
QMutex mutex;
cameraModule cameraModulePtr;
QQueue<cv::Mat>imgQueue;
QQueue<detData*>requestQueue;
backEndManager* _backEndManager;
bool runFlag = true;
@@ -91,7 +103,7 @@ class cameraManager : public QThread
public:
void init(backEndManager*);
~cameraManager();
std::unordered_map<QString, camera*>cameras;//key 相机名
std::unordered_map<std::string, camera*>cameras;//key 相机名
void run()
{
//while (1)
@@ -112,7 +124,7 @@ private:
QList<QLibrary*> lib_list;
public slots:
void R1(showImgPack*);
void cameraTrigger(QString Name)
void cameraTrigger(std::string Name)
{
auto camera=cameras.find(Name);
if (camera != cameras.end())
+1 -1
View File
@@ -61,7 +61,7 @@ void MyIoThread::run()
bridge.back.sendFinsMsg(
QString::fromStdString("write_DM" + to_string(bridge.back.json.tcp.startPos + i) + "_0"));*/
workThread = new threadConroller();
workThread = new threadManager();
for (auto thread : threadlist)
thread->cameraImgsPtr = &workThread->cameraImgs;
+1 -1
View File
@@ -97,7 +97,7 @@ public:
void writeSnFromString(string SN, int startPos, bool highLowConversion);
void requestSummary(std::string sn, int offset);
detDataManager dManager;
threadConroller* workThread ;
threadManager* workThread ;
bool barcodeScanLock = false;
private:
triggerLocker tLocker;//防止重复触发
@@ -35,7 +35,7 @@ int threadAmount = 0;
int maxThread = 16;
////////////THREAD//Manager////////////////////////
threadConroller::threadConroller(QObject* parent) : QThread(parent)
threadManager::threadManager(QObject* parent) : QThread(parent)
{
//sql初始化
sql = new sqlManager;
@@ -57,7 +57,7 @@ threadConroller::threadConroller(QObject* parent) : QThread(parent)
}
}
void threadConroller::run()
void threadManager::run()
{
return;
while (1)
@@ -100,9 +100,9 @@ void threadConroller::run()
QThread::msleep(10);
}
}
void threadConroller::addTask(detData* data)
void threadManager::addTask(detData* data)
{
cout << __LINE__ << "insert Data " << data ->timeCode<< endl;
//cout << __LINE__ << "insert Data " << data ->timeCode<< endl;
{
algoThreadCls::datastruct _struct = bridge.back.json.algoThreads.getData(data->algoThreadName);
data->algoThreadIndex = _struct.threadIndex;
@@ -125,7 +125,7 @@ void threadConroller::addTask(detData* data)
insertQueueMutex.unlock();
//this->start();
}
bool threadConroller::getFreeThread()
bool threadManager::getFreeThread()
{
#if 0
int index = 0;
@@ -147,7 +147,7 @@ bool threadConroller::getFreeThread()
return false;
}
bool threadConroller::addTaskFreeThread(detData* data)
bool threadManager::addTaskFreeThread(detData* data)
{
#if 0
int index = 0;
@@ -172,7 +172,7 @@ bool threadConroller::addTaskFreeThread(detData* data)
return false;
}
threadConroller::~threadConroller()
threadManager::~threadManager()
{
for (auto thread : algoThreadList)
{
@@ -16,7 +16,7 @@
#include <qtcpsocket.h>
#include <mutex>
#include <backStruct.h>
class threadConroller;
class threadManager;
class algoThread;
class subThread;
class detDataManager;
@@ -85,7 +85,7 @@ class detData
{
public:
const unsigned long long timeCode = getTimeCode();//根据时间和随机数生成的值,唯一
QMutex* imgMutex;
QMutex imgMutex;
std::string SNcode;
QString cameraKeyName;
@@ -147,7 +147,7 @@ public:
algoThreadName = IN_algoThreadName;
oriShowIndex = IN_oriShowIndex;
SNcode = IN_SN;
imgMutex = new QMutex();
//imgMutex = new QMutex();
}
~detData()
{
@@ -155,7 +155,6 @@ public:
img.release();
for (auto img : resultImgs)
img.release();
delete imgMutex;
//delete cameraImgPtr;
}
@@ -183,18 +182,18 @@ class detDataManager
public:
std::unordered_map<unsigned long long, detData*>map;
QLinkedList<detData> detDatas;
//QLinkedList<detData> detDatas;
QMutex dataMutex;
detData* insertDetData(QString IN_cameraKeyName, QString IN_algoThreadName,
std::string IN_SN, int IN_oriShowIndex)
{
dataMutex.lock();
detData data(IN_cameraKeyName, IN_algoThreadName, IN_SN, IN_oriShowIndex);
data.dManager = this;
detDatas.push_back(data);
map.insert({ data.timeCode,&detDatas.back() });
detData* data = new detData(IN_cameraKeyName, IN_algoThreadName, IN_SN, IN_oriShowIndex);
data->dManager = this;
//detDatas.push_back(data);
map.insert({ data->timeCode,data });
dataMutex.unlock();
detData* dataPtr = getDetData(data.timeCode);
detData* dataPtr = getDetData(data->timeCode);
if (dataPtr == nullptr)
qDebug() << "创建新容器失败";
@@ -219,17 +218,11 @@ public:
std::unordered_map<unsigned long long, detData*>::iterator it = map.find(timeCode);
if (it != map.end())
{
it->second->imgMutex.lock();
delete it->second;
map.erase(it);
QLinkedList<detData>::iterator linkedListIt;
for (linkedListIt = detDatas.begin(); linkedListIt != detDatas.end(); ++linkedListIt)
{
if (linkedListIt->timeCode == timeCode)
{
detDatas.erase(linkedListIt);
dataMutex.unlock();
return true;
}
}
dataMutex.unlock();
return true;
}
dataMutex.unlock();
return false;
@@ -262,12 +255,12 @@ public:
/// <summary>
/// 线程池管理
/// </summary>
class threadConroller : public QThread
class threadManager : public QThread
{
Q_OBJECT
public:
explicit threadConroller(QObject* parent = nullptr);
explicit threadManager(QObject* parent = nullptr);
QMutex queueMutex;
cameraImages cameraImgs;
QQueue<detData*> detDataQueue;
@@ -283,7 +276,7 @@ public:
bool getFreeThread();
bool addTaskFreeThread(detData*);
sncodeCls snDatas;
~threadConroller();
~threadManager();
private:
QList<detData*>imgWaitList;
};
@@ -1,9 +1,30 @@
#include <triggerManager.h>
#include <backEndManager.h>
#include <threadPoolManager.h>
#include <backStruct.h>
#include <cameraManager.h>
#include <jsonParsing.h>
static correctionStruct* correctionData;
void triggerManager::decodeCameraCMD(QByteArray byte)
{
#if 0
#if 1
//if (checkTrigger(1, 2, byte) == true)
{
detData* data = dManager->insertDetData("Camera1", "Thread3", "TEST", 0);
data->correctionData = correctionData;
_threadManager->addTask(data);//添加任务
auto camera = _cameraManager->cameras.find("123");
camera->second->Process(data);
}
//if (checkTrigger(2, 2, byte) == true)
{
detData* data = dManager->insertDetData("Camera1", "Thread2", "TEST", 0);
data->correctionData = correctionData;
_threadManager->addTask(data);//添加任务
auto camera = _cameraManager->cameras.find("Vir-CA013-20GC");
camera->second->Process(data);
}
return;
if (byte.isEmpty())
return;
double cameraData = 0;
@@ -24,12 +45,27 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
correctionData->in_Y_Y0Z = { -1147.29,-1147.28,-940.82 };
correctionData->in_Z_Y0Z = { 118.15,-228.19,-256.5 };
correctionData->in_X_Y0Z_Value = { -36.652200,-36.7302,41.0436 };
detData* data = dManager.insertDetData("Camera1", "correctionDataThread", "TEST", 0);
detData* data = dManager->insertDetData("Camera1", "correctionDataThread", "TEST", 0);
data->correctionData = correctionData;
workThread->addTask(data);//添加任务
_threadManager->addTask(data);//添加任务
correctionData = nullptr;
}
if (checkTrigger(1, 2, byte) == true)
{
detData* data = dManager->insertDetData("Camera1", "Thread3", "TEST", 0);
data->correctionData = correctionData;
_threadManager->addTask(data);//添加任务
auto camera = _cameraManager->cameras.find("123");
camera->second -> Process(data);
}
if (checkTrigger(2, 2, byte) == true)
{
detData* data = dManager->insertDetData("Camera1", "Thread3", "TEST", 0);
data->correctionData = correctionData;
_threadManager->addTask(data);//添加任务
auto camera = _cameraManager->cameras.find("456");
camera->second->Process(data);
}
//总流程开始,机器人发送1至寄存器259
//上位机确认OK之后,清零寄存器259,并发送1至寄存器260
@@ -37,8 +73,8 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
//之后机器人确认之后需发送测量点位总数具体值至寄存器258
if (checkTrigger(259, 1, byte) == true)
{
bridge.back.sendFinsMsg("write_short_259_0");//触发信号清零
bridge.back.sendFinsMsg("write_short_260_1");//开始检测信号
sendFinsMsg("write_short_259_0");//触发信号清零
sendFinsMsg("write_short_260_1");//开始检测信号
}
//机器人激光当前点位 264 1...9
@@ -64,7 +100,7 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
double xValue = (xValue1 == 1 ? 1 : -1) * ((double)xValue2 + ((double)xValue3) / (std::pow(10, to_string(xValue3).length())));
double yValue = (yValue1 == 1 ? 1 : -1) * ((double)yValue2 + ((double)yValue3) / (std::pow(10, to_string(yValue3).length())));
double zValue = (zValue1 == 1 ? 1 : -1) * ((double)zValue2 + ((double)zValue3) / (std::pow(10, to_string(zValue3).length())));
double rangeData = threadlist[0]->getValueFromCamera();
double rangeData = _cameraManager->cameras.find("相机的名字")->second->getCameraValue();
if (armPos == 1)//第一次
correctionData = new correctionStruct();
@@ -92,16 +128,16 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
correctionData->in_X_Y0Z_Value.push_back(rangeData);
}
}
bridge.back.sendFinsMsg("write_short_261_0");//清零
bridge.back.sendFinsMsg("write_short_262_1");
bridge.back.sendFinsMsg("write_short_263_1");
sendFinsMsg("write_short_261_0");//清零
sendFinsMsg("write_short_262_1");
sendFinsMsg("write_short_263_1");
//上位机校正完成,将寄存器274置为1,并将结果按照定义XYZ规则放入310~336中
if (armPos == 9)
{
detData* data = dManager.insertDetData("Camera1", "correctionDataThread", "TEST", 0);
detData* data = dManager->insertDetData("Camera1", "correctionDataThread", "TEST", 0);
data->correctionData = correctionData;
workThread->addTask(data);//添加任务
_threadManager->addTask(data);//添加任务
correctionData = nullptr;
}
}
@@ -110,8 +146,8 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
if (checkTrigger(300, 1, byte) == true)
{
bridge.back.sendFinsMsg("write_short_300_0");//触发信号清零
bridge.back.sendFinsMsg("write_short_301_1");//开始检测信号
sendFinsMsg("write_short_300_0");//触发信号清零
sendFinsMsg("write_short_301_1");//开始检测信号
int Pos = getValue(303, byte);
}
@@ -122,6 +158,9 @@ void triggerManager::decodeCameraCMD(QByteArray byte)
void triggerManager::init(backEndManager* input)
{
_backEndManager = input;
dManager = _backEndManager->_detDataManager;
_cameraManager = _backEndManager->_cameraManager;
_threadManager = _backEndManager->_threadManager;
QLibrary* m_lib = new QLibrary(triggerFileName);
bool flag = m_lib->load();
if (!m_lib->isLoaded())
@@ -152,4 +191,14 @@ void triggerManager::init(backEndManager* input)
}
}
this->start();
}
int triggerManager::getValue(int dmPos, QByteArray byte)
{
int triggerPos = (dmPos - _backEndManager->_jsonConfiguration->tcp.startPos) * 2;
if (byte.size() / 2 < triggerPos)
return false;
int val1 = byte.at(triggerPos) * 256;
int val2 = static_cast<unsigned char>(byte.at(triggerPos + 1));
return val1 + val2;
}
+14 -1
View File
@@ -6,7 +6,14 @@
#include <qlibrary.h>
#include <globalStruct.h>
#include <backStruct.h>
using namespace std;
class backEndManager;
class cameraManager;
class jsonConfiguration;
class threadManager;
class detDataManager;
//防止重复触发
class triggerLockerT
{
@@ -69,10 +76,11 @@ public:
void init(backEndManager* input);
void run()
{
QThread::msleep(5000);
while (runFlag)
{
reciveCommond();
QThread::msleep(interval);
QThread::msleep(1000);
}
}
@@ -124,8 +132,13 @@ public:
}
return true;
}
int getValue(int dmPos, QByteArray byte);
private:
threadManager* _threadManager;
detDataManager* dManager;
backEndManager* _backEndManager;
cameraManager* _cameraManager;
triggerLockerT tLocker;//防止重复触发,每次收到数据时检查数据是否与上次相同,如果相同checkTrigger会返回false
/// <summary>
/// 检测QByteArray中某位置的值是否和输入一样,使用了绝对位置
@@ -34,41 +34,36 @@ public:
setDragMode(QGraphicsView::DragMode::NoDrag);
setInteractive(false);
setEnabled(false);
this->setStyleSheet("QGraphicsView {"
"background: transparent;"
"background-image: url(:/topBar/icon/waitting.png);"
"background-repeat: no-repeat;"
"background-position: center center;"
"background-size: contain;"
"}");
//initShow();
scene = new QGraphicsScene(this);
scene = new QGraphicsScene();
this->setScene(scene);
//this->fitInView(pixmapItem, Qt::KeepAspectRatio);
this->setBackgroundBrush(QBrush(QColor(0, 0, 0)));
setEnabled(true);
setMouseTracking(true);
imgLabel = new QLabel();
scene->clear();
scene->addWidget(imgLabel);
imgLabel->setMaximumSize(9999, 9999);
this->setStyleSheet("QGraphicsView {"
"background: transparent;"
"background-image: url(:/topBar/icon/waitting.png);"
"background-repeat: no-repeat;"
"background-position: center center;"
"background-size: contain;"
"}");
mutex.unlock();
}
void setImg(QImage& image)
{
if (image.isNull())
return;
showimg(QPixmap::fromImage(image));
showImg(QPixmap::fromImage(image));
}
void setImg(cv::Mat& src)
{
if (src.empty())
return;
showimg(QPixmap::fromImage(cvMatToQImage(src)));
showImg(QPixmap::fromImage(cvMatToQImage(src)));
}
void setImg(QPixmap& pixmap)
{
showimg(pixmap);
showImg(pixmap);
}
void resetImage()
{
@@ -167,19 +162,17 @@ protected:
vBar->setValue(vBar->value() - delta.y());
}
private:
void showimg(QPixmap& img)
void showImg(QPixmap& img)
{
mutex.lock();
//scene->clear();
//scene->addPixmap(img);
imgLabel->setPixmap(img);
setEnabled(true);
setMouseTracking(true);
QRect rect = img.rect();
imageWidth = rect.width();
imageHeight = rect.height();
imgLabel->setFixedSize(imageWidth, imageHeight);
setSceneRect(rect);
fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
this->fitInView(scene->itemsBoundingRect(), Qt::KeepAspectRatio);
mutex.unlock();
}
bool m_isPan;
@@ -265,7 +258,7 @@ public:
}
oriImg= oriImgInput;
if (MatType == false)
showImg(pixOriImg);
showImgOnGraphicsView(pixOriImg);
}
//set不一定显示,要根据当前显示的类型决定
void setResImg(cv::Mat& resImgInput)
@@ -279,7 +272,7 @@ public:
}
resImg = resImgInput;
if (MatType == true)
showImg(pixResImg);
showImgOnGraphicsView(pixResImg);
}
//set不一定显示,要根据当前显示的类型决定
void setOriImg(QPixmap& oriImgInput)
@@ -289,7 +282,7 @@ public:
return;
}
if (MatType == false)
showImg(pixOriImg);
showImgOnGraphicsView(pixOriImg);
}
//set不一定显示,要根据当前显示的类型决定
void setResImg(QPixmap& resImgInput)
@@ -299,10 +292,10 @@ public:
return;
}
if (MatType == true)
showImg(pixResImg);
showImgOnGraphicsView(pixResImg);
}
//无视当前类型直接显示
void showImg(cv::Mat& imageMat) {
void showImgOnGraphicsView(cv::Mat& imageMat) {
if (imageMat.empty()) {
return;
}
@@ -318,7 +311,7 @@ public:
}
view->setImg(pixmap);
}
void showImg(QPixmap& imageMat) {
void showImgOnGraphicsView(QPixmap& imageMat) {
view->setImg(imageMat);
}
void switchOriAndRes()//切换原图和结果图
@@ -326,17 +319,17 @@ public:
if (MatType == false)
{
if(pixOriImg.isNull())
showImg(resImg);
showImgOnGraphicsView(resImg);
else
showImg(pixResImg);
showImgOnGraphicsView(pixResImg);
label2->setText(u8"结果图");
}
else
{
if (pixOriImg.isNull())
showImg(oriImg);
showImgOnGraphicsView(oriImg);
else
showImg(pixOriImg);
showImgOnGraphicsView(pixOriImg);
label2->setText(u8"原图");
}
MatType = !MatType;