初步校准测试

This commit is contained in:
2024-08-26 15:45:15 +08:00
parent f15dfac750
commit 4f76fa0c65
27 changed files with 247 additions and 70 deletions
Binary file not shown.
Binary file not shown.
+58 -26
View File
@@ -4,6 +4,7 @@
#include <simpleTools/eulerCoordinateAlgo.h>
struct CorrectionPoints
{
double OriginZ, OriginX, OriginY;
std::vector<double> Origin;//X Y Z
std::vector<double> Result_X;//X Y Z
std::vector<double> Result_Y;//X Y Z
@@ -300,10 +301,41 @@ double doubleLmit(double input, int num)
out << std::fixed << std::setprecision(num) << input;
return std::stod(out.str());
}
bool simpleCorrection(correctionStruct* correctionData, CorrectionPoints& result)
{
//Z
{
double sum = 0;
for (auto zData : correctionData->in_Z_X0Y)
sum += zData;
for (auto zData : correctionData->in_Z_X0Y_Value)
sum += zData;
result.OriginZ = sum / 3;
}
//X
{
double sum = 0;
for (auto xData : correctionData->in_X_Y0Z)
sum += xData;
for (auto xData : correctionData->in_X_Y0Z_Value)
sum += xData;
result.OriginX = sum / 3;
}
//Y
{
double sum = 0;
for (auto yData : correctionData->in_Y_X0Z)
sum += yData;
for (auto yData : correctionData->in_Y_X0Z_Value)
sum += yData;
result.OriginY = sum / 3;
}
return true;
}
void ALGO_Correction(std::shared_ptr <detData> data)
{
CorrectionPoints resultPoints;
if (HalconCorrection(&data->laserData, resultPoints) == false)
if (simpleCorrection(&data->laserData, resultPoints) == false)
{
data->writeBack("short", 274, "1");
return;
@@ -315,38 +347,38 @@ void ALGO_Correction(std::shared_ptr <detData> data)
qDebug() << "productIndex:"<< data->productType <<"ox:" << resultPoints.Origin[0] << "oy : " << resultPoints.Origin[1] << "oz : " << resultPoints.Origin[2];
qDebug() << "Rx:" << point.x << "Ry:" << point.y << "Rz:" << point.z;
double baseOffsetX = data->_productDataStruct.basePos[0] - resultPoints.Origin[0];
double baseOffsetY = data->_productDataStruct.basePos[1] - resultPoints.Origin[1];
double baseOffsetZ = data->_productDataStruct.basePos[2] - resultPoints.Origin[2];
double baseOffsetX = data->_productDataStruct.basePos[0] - resultPoints.OriginX;
double baseOffsetY = data->_productDataStruct.basePos[1] - resultPoints.OriginY;
double baseOffsetZ = data->_productDataStruct.basePos[2] - resultPoints.OriginZ;
double offsetRx = data->_productDataStruct.baseRad[0] - point.x;
double offsetRy = data->_productDataStruct.baseRad[1] - point.y;
double offsetRz = data->_productDataStruct.baseRad[2] - point.z;
//double offsetRx = data->_productDataStruct.baseRad[0] - point.x;
//double offsetRy = data->_productDataStruct.baseRad[1] - point.y;
//double offsetRz = data->_productDataStruct.baseRad[2] - point.z;
cv::Vec3d radIn1({ 0,0,0 });
cv::Vec3d radIn2({ degToRad(offsetRx),degToRad(offsetRy),degToRad(offsetRz) });
cv::Mat coords = (cv::Mat_<double>(3, 1) << data->_productDataStruct.basePos[0], data->_productDataStruct.basePos[1], data->_productDataStruct.basePos[2]);
cv::Mat newCoords = transform_coordinates(coords, radIn1, radIn2);
cv::Mat coordsOffset = (cv::Mat_<double>(3, 1) << coords.at<double>(0, 0) - newCoords.at<double>(0, 0), coords.at<double>(1, 0) - newCoords.at<double>(1, 0), coords.at<double>(2, 0) - newCoords.at<double>(2, 0));
//cv::Vec3d radIn1({ 0,0,0 });
//cv::Vec3d radIn2({ degToRad(offsetRx),degToRad(offsetRy),degToRad(offsetRz) });
//cv::Mat coords = (cv::Mat_<double>(3, 1) << data->_productDataStruct.basePos[0], data->_productDataStruct.basePos[1], data->_productDataStruct.basePos[2]);
//cv::Mat newCoords = transform_coordinates(coords, radIn1, radIn2);
//cv::Mat coordsOffset = (cv::Mat_<double>(3, 1) << coords.at<double>(0, 0) - newCoords.at<double>(0, 0), coords.at<double>(1, 0) - newCoords.at<double>(1, 0), coords.at<double>(2, 0) - newCoords.at<double>(2, 0));
double offsetX = doubleLmit(coordsOffset.at<double>(0, 0) + baseOffsetX,3);
double offsetY = doubleLmit(coordsOffset.at<double>(1, 0) + baseOffsetY,3);
double offsetZ = doubleLmit(coordsOffset.at<double>(2, 0) + baseOffsetZ,3);
//double offsetX = doubleLmit(coordsOffset.at<double>(0, 0) + baseOffsetX,3);
//double offsetY = doubleLmit(coordsOffset.at<double>(1, 0) + baseOffsetY,3);
//double offsetZ = doubleLmit(coordsOffset.at<double>(2, 0) + baseOffsetZ,3);
offsetRx = doubleLmit(offsetRx, 3);
offsetRy = doubleLmit(offsetRy, 3);
offsetRz = doubleLmit(offsetRz, 3);
//offsetRx = doubleLmit(offsetRx, 3);
//offsetRy = doubleLmit(offsetRy, 3);
//offsetRz = doubleLmit(offsetRz, 3);
std::cout << "offsetX:" << offsetX << "offsetY:" << offsetY << "offsetZ:" << offsetZ << std::endl;
std::cout << "offsetRx:" << offsetRx << "offsetRy:" << offsetRy << "offsetRz:" << offsetRz << std::endl;
std::cout << "offsetX:" << baseOffsetX << "offsetY:" << baseOffsetY << "offsetZ:" << baseOffsetZ << std::endl;
//std::cout << "offsetRx:" << offsetRx << "offsetRy:" << offsetRy << "offsetRz:" << offsetRz << std::endl;
createModbusStrs(310, offsetX,data);
createModbusStrs(313, offsetY, data);
createModbusStrs(316, offsetZ, data);
createModbusStrs(310, baseOffsetX,data);
createModbusStrs(313, baseOffsetY, data);
createModbusStrs(316, baseOffsetZ, data);
createModbusStrs(319, offsetRx, data);
createModbusStrs(322, offsetRy, data);
createModbusStrs(325, offsetRz, data);
//createModbusStrs(319, offsetRx, data);
//createModbusStrs(322, offsetRy, data);
//createModbusStrs(325, offsetRz, data);
data->writeBack("short", 274, "1");
}
@@ -8,6 +8,7 @@
#include <CISCO_APEX.hpp>
#include <CISCO_APEXSMALL.hpp>
#include <CISCO_ASR.hpp>
#include <templateAlgo.h>
cv::Mat pinHandleAiEvaluate(std::shared_ptr <detData> data, cv::Mat& src,
handleAiModelSeg* segPtr, handleAiModelCls* clsPtr);
bool pinHalconEvaluate(std::shared_ptr <detData> data, cv::Rect& Result, cv::Mat& src, cv::Mat& out, int productType);
@@ -19,6 +20,7 @@ std::vector<handdleAI::Bbox> pinDetEvaluate(std::shared_ptr <detData> data, cv::
handleAiModelDet* detPtr = _handleAiModelManager->getDetModel("connectorDet.BHD");
if (detPtr == nullptr)
return std::vector<handdleAI::Bbox>();
src = rotateImage(src, cv::Point2f(src.cols / 2, src.rows / 2), -1, 1);
detPtr->Evaluate(src, result);
return result;
}
@@ -0,0 +1,56 @@
#include <opencv.hpp>
double templateMatchAndAngle(const cv::Mat& img, const cv::Mat& templ) {
// 创建存储匹配结果的矩阵
cv::Mat result;
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create(result_rows, result_cols, CV_32FC1);
// 执行模板匹配
cv::matchTemplate(img, templ, result, cv::TM_CCOEFF_NORMED);
// 通过 minMaxLoc 查找最佳匹配位置
double minVal, maxVal;
cv::Point minLoc, maxLoc;
cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
// 使用 ORB 进行特征点提取
std::vector<cv::KeyPoint> keypoints_img, keypoints_templ;
cv::Mat descriptors_img, descriptors_templ;
cv::Ptr<cv::ORB> orb = cv::ORB::create();
orb->detectAndCompute(img, cv::noArray(), keypoints_img, descriptors_img);
orb->detectAndCompute(templ, cv::noArray(), keypoints_templ, descriptors_templ);
// 使用 BFMatcher 进行特征点匹配
cv::BFMatcher matcher(cv::NORM_HAMMING);
std::vector<cv::DMatch> matches;
matcher.match(descriptors_img, descriptors_templ, matches);
// 计算匹配点间的角度偏移
double angle_sum = 0;
int count = 0;
for (const auto& match : matches) {
cv::Point2f pt_img = keypoints_img[match.queryIdx].pt;
cv::Point2f pt_templ = keypoints_templ[match.trainIdx].pt;
// 计算向量的角度
double angle = atan2(pt_img.y - pt_templ.y, pt_img.x - pt_templ.x) * 180 / CV_PI;
angle_sum += angle;
count++;
}
// 计算平均角度
double average_angle = count > 0 ? angle_sum / count : 0;
return average_angle;
}
cv::Mat rotateImage(const cv::Mat& img, const cv::Point2f& center, double angle, double scale) {
// 获取旋转矩阵
cv::Mat rotation_matrix = cv::getRotationMatrix2D(center, angle, scale);
// 创建旋转后的图像
cv::Mat rotated_img;
cv::warpAffine(img, rotated_img, rotation_matrix, img.size());
return rotated_img;
}
@@ -44,8 +44,8 @@ public:
virtual bool Update(
std::string tableName,
std::vector<sqlData> selectStr,
std::string Where = "",
std::string equal = "")
std::string Where,
std::string equal)
{ return true; };
private:
@@ -134,7 +134,22 @@ void sqlManager::initialization(appConfig* _appConfig,std::string dataBasePath,
std::vector<std::string> input=getTableList();
mutex.unlock();
}
bool sqlManager::updateData(std::string SN,sqlRowDatas data)
{
mutex.lock();
sqlTableDatas selectResult;
dbPtr->Select(getCurrentDate(), {}, selectResult, "SN", SN);
if (selectResult.rowDatas.size() == 0)//无指定数据 查找前一天
{
dbPtr->Update(getPreviousDate(), data, "SN", SN);
}
else
{
dbPtr->Update(getCurrentDate(), data, "SN", SN);
}
mutex.unlock();
}
//将数据存入数据库
bool sqlManager::addData(std::string SN,std::vector<sqlData> data)
{
@@ -35,6 +35,7 @@ public:
std::vector<std::string> getTableList();//获取所有列名
void initialization(appConfig* _appConfig, std::string dataBasePath = sqlDefaultDatabasePath,bool backUp=true);
bool addData(std::string SN, std::vector<sqlData> data);
bool updateData(std::string SN,sqlRowDatas data);
void uninitlize();
sqlite3* db;
+1 -1
View File
@@ -20,7 +20,7 @@ signals:
void uiModuleLocationMap_ResetToDefault();
void uiModuleLocationMap_SetProductSignStatus(int pos, int status);//设置产品示意图指定位置的状态
void uiModuleImageDoubleCheckQdialog_ShowWindows(QPixmap);
void uiModuleImageDoubleCheckQdialog_ShowWindows(imageDoubleCheckPack);
void uiModuleSummaryDataManager_SetSummaryResultText(QString text, Qt::GlobalColor color);
void uiModuleSummaryDataManager_Reset();
+84 -25
View File
@@ -88,6 +88,7 @@ public:
manualDetThread _manualDetThread;//手动触发线程
///////////////////////////////
QMutex detMutex;
std::string currentSn;
void detProcessCallbackRegister()
{
@@ -105,7 +106,7 @@ public:
int backArmIndex = -1;
bool currentBack = false;
//激光校准数据缓存 //SN 数据
correctionStruct laserDataCache;
correctionStruct laserDataCache;
//总流程开始,机器人发送1至寄存器259
//上位机确认OK之后,清零寄存器259,并发送1至寄存器260
//如产品型号为Product_1且为正面,则上位机发送1至寄存器256,发送0至寄存器257
@@ -133,7 +134,7 @@ public:
int armPos = _triggerManager.getValue(264, byteArray);
int xValue1 = _triggerManager.getValue(265, byteArray);
int xValue2 = _triggerManager.getValue(266, byteArray);
int xValue2 = _triggerManager.getValue(266, byteArray);
int xValue3 = _triggerManager.getValue(267, byteArray);
int yValue1 = _triggerManager.getValue(268, byteArray);
@@ -194,19 +195,20 @@ public:
laserDataCache.in_Z_X0Y_Value.push_back(rangeData);
}
else if (armPos <= 6)
{
laserDataCache.in_X_X0Z.push_back(xValue);
laserDataCache.in_Y_X0Z.push_back(yValue);
laserDataCache.in_Z_X0Z.push_back(zValue);
laserDataCache.in_Y_X0Z_Value.push_back(rangeData);
}
else if (armPos <= 9)
{
laserDataCache.in_X_Y0Z.push_back(xValue);
laserDataCache.in_Y_Y0Z.push_back(yValue);
laserDataCache.in_Z_Y0Z.push_back(zValue);
laserDataCache.in_X_Y0Z_Value.push_back(rangeData);
}
else if (armPos <= 9)
{
laserDataCache.in_X_X0Z.push_back(xValue);
laserDataCache.in_Y_X0Z.push_back(yValue);
laserDataCache.in_Z_X0Z.push_back(zValue);
laserDataCache.in_Y_X0Z_Value.push_back(rangeData);
}
_triggerManager.sendFinsMsg("write_short_261_0");//清零
_triggerManager.sendFinsMsg("write_short_262_1");
_triggerManager.sendFinsMsg("write_short_263_1");
@@ -225,6 +227,7 @@ public:
//拍照并检测 300
void captureImageAndDetection(QByteArray& byteArray)
{
detMutex.lock();
_lightSourceManager.getLightSourcePtr("COM9")->setValue(lightSourceChannel::DChannel, 255);
QThread::msleep(2000);//延时等待机械臂停稳
_triggerManager.sendFinsMsg("write_short_300_0");//触发信号清零
@@ -249,6 +252,7 @@ public:
QThread::msleep(1000);//延时一秒完成拍照,后续改成拍完直接发送
_triggerManager.sendFinsMsg("write_short_302_1");//开始检测信号
detMutex.unlock();
}
//机械臂状态切换 361 1 空闲
void detectionSwitch1(QByteArray& byteArray)
@@ -291,11 +295,38 @@ public:
_triggerManager.sendFinsMsg("write_short_362_0");
auto productData = _core._productDataCache.get(currentSn);
productData->writeProductData(currentSn, _core._appConfig.productDatas[_core._detGlobalData.productType]);
productData->saveData("D://CCD//result.xlsx");
if(productData->ngPinCount >0 || productData->ngCount>0)
QDateTime currentDateTime = QDateTime::currentDateTime();
std::string dateDirStr = currentDateTime.toString("yyyy-MM-dd").toStdString();
productData->saveData("D://CCD//Result//" + dateDirStr + "//result.xlsx");
//先查询数据库
auto sqlData = _core._appConfig._sqlManager.selectRowData(currentSn);
bool result = true;
if (sqlData.rowDatas.size() > 1)
for (auto data : sqlData.rowDatas[0])
if (!data.key.compare("detResult"))
if (!data.value.compare("NG"))
result = false;
//数据库结果为false时 不根据当前跑料数据判断
if(result == false)
{
emit _core._qtFunc.uiModuleSummaryDataManager_SetSummaryResultText("NG", Qt::red);
return;
}
//数据库结果为true或者没有查询到数据时时 继续判断
if(productData->ngPinCount >0 || productData->ngCount>0)//NG
{
emit _core._qtFunc.uiModuleSummaryDataManager_SetSummaryResultText("NG", Qt::red);
_core._appConfig._sqlManager.updateData(currentSn, {{"detResult","NG"}});
}
else
{
emit _core._qtFunc.uiModuleSummaryDataManager_SetSummaryResultText("OK", Qt::green);
_core._appConfig._sqlManager.updateData(currentSn, { {"detResult","OK"} });
}
std::cout << "detprocess runEnd" << std::endl;
}
@@ -334,21 +365,33 @@ public:
//发送检测结果发送到界面
if (data->armPos != -1)
{
emit _core._qtFunc.addDashBoardData(0, data->halconOK);
emit _core._qtFunc.addDashBoardData(1, data->aiDetOK);
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(data->armPos,
(data->halconOK==true&& data->aiDetOK==true)?2:3);
//如果为NG,则等到按下按钮时在发送
bool finalOk = (data->halconOK == true && data->aiDetOK == true);
if(finalOk == false)
if (data->aiDetOK == true)
emit _core._qtFunc.addDashBoardData(1, data->aiDetOK);
else if (data->resultImgs.size() >= 1)
{
for (auto& showMat : data->resultImgs)
{
QPixmap pixmap;
cvMatToQPixMap(showMat, pixmap);
//showImgPack* pack = new showImgPack();
emit _core._qtFunc.uiModuleImageDoubleCheckQdialog_ShowWindows(pixmap);
}
imageDoubleCheckPack pack;
pack.armPos = data->armPos;
cvMatToQPixMap(data->resultImgs[0], pack.img);
emit _core._qtFunc.uiModuleImageDoubleCheckQdialog_ShowWindows(pack);
pack.type = 2;
}
if(data->halconOK == true)
emit _core._qtFunc.addDashBoardData(0, data->halconOK);
else if (data->resultImgs.size() >= 2)
{
imageDoubleCheckPack pack;
pack.armPos = data->armPos;
cvMatToQPixMap(data->resultImgs[1], pack.img);
emit _core._qtFunc.uiModuleImageDoubleCheckQdialog_ShowWindows(pack);
pack.type = 1;
}
if (finalOk == true)
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(data->armPos,2);
auto productData = _core._productDataCache.get(currentSn);
if (finalOk == false)
productData->ngCount++;
@@ -413,10 +456,26 @@ public slots:
_triggerManager.sendFinsMsg("write_short_350_" + QString::number(_core._appConfig.productDatas[productTypeIn].indexOfArm));
_triggerManager.sendFinsMsg("write_short_351_1");
}
//人工复盘按下NG
void uiModuleImageDoubleCheckQdialog_pressNG()
//人工复判按下NG
void uiModuleImageDoubleCheckQdialog_pressNG(int armPos,int type)//1 halcon 2ai
{
if(type == 1)
emit _core._qtFunc.addDashBoardData(0, false);
else if (type == 2)
emit _core._qtFunc.addDashBoardData(1, false);
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(armPos, 3);
_triggerManager.sendFinsMsg("write_short_363_1");
detMutex.unlock();
}
//人工复判按下OK
void uiModuleImageDoubleCheckQdialog_pressOK(int armPos, int type)//1 halcon 2ai
{
if (type == 1)
emit _core._qtFunc.addDashBoardData(0, true);
else if (type == 2)
emit _core._qtFunc.addDashBoardData(1, true);
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(armPos, 2);
detMutex.unlock();
}
};
#pragma once
+7
View File
@@ -55,6 +55,12 @@ struct historyPack
std::shared_ptr<std::string>filePath;
std::vector<std::string>text;
};
struct imageDoubleCheckPack
{
QPixmap img;
int armPos;
int type;//1 halcon 2ai
};
static QImage cvMatToQImage(cv::Mat& src)
{
if (src.channels() == 1) { // if grayscale image
@@ -141,4 +147,5 @@ Q_DECLARE_METATYPE(cv::Mat)
Q_DECLARE_METATYPE(std::string)
Q_DECLARE_METATYPE(historyPack)
Q_DECLARE_METATYPE(Qt::GlobalColor)
Q_DECLARE_METATYPE(imageDoubleCheckPack)
#pragma once
+5 -1
View File
@@ -109,9 +109,11 @@ void connectSignalAndSlots(MainWindow* front, appCore* _core, detProcess* _detPr
front, &MainWindow::uiModuleLocationMapSetProductSignStatus);
//uiModuleImageDoubleCheckQdialog
QObject::connect(&_core->_qtFunc, &qtFunction::uiModuleImageDoubleCheckQdialog_ShowWindows,
front, [=](QPixmap map) {front->_imageDoubleCheckQdialog->showAndSetImg(map); });
front, [=](imageDoubleCheckPack pack) {front->_imageDoubleCheckQdialog->showAndSetImg(pack); });
QObject::connect(front->_imageDoubleCheckQdialog,&imageDoubleCheckQdialog::ngSignal,
_detProcess, &detProcess::uiModuleImageDoubleCheckQdialog_pressNG);
QObject::connect(front->_imageDoubleCheckQdialog, &imageDoubleCheckQdialog::okSignal,
_detProcess, &detProcess::uiModuleImageDoubleCheckQdialog_pressOK);
//uiModuleSummaryDataManager
QObject::connect(&_core->_qtFunc, &qtFunction::uiModuleSummaryDataManager_SetSummaryResultText,
front, [=](QString text, Qt::GlobalColor color)
@@ -177,6 +179,8 @@ int main(int argc, char* argv[])
qRegisterMetaType<std::string>("stdString");
qRegisterMetaType<historyPack>("historyPack");
qRegisterMetaType<Qt::GlobalColor>("QtGlobalColor");
qRegisterMetaType<imageDoubleCheckPack>("imageDoubleCheckPack");
//_core.initTimer();
MainWindow w;
w.show();
@@ -7,7 +7,6 @@
#include <uiModule/components/fancyButton.h>
#include <qdatetime.h>
#include <uiModule/uiModule_imageView.h>
class imageDoubleCheckQdialog :public QDialog
{
Q_OBJECT
@@ -18,7 +17,8 @@ public:
fancyButtonText* okBtn = new fancyButtonText(120, 40, "OK", "继续");
fancyButtonText* ngBtn = new fancyButtonText(120, 40, "NG", "继续");
QMutex mutex;
QQueue< QPixmap>imgqueue;
QQueue< imageDoubleCheckPack>imgqueue;
imageDoubleCheckPack currentPack;
imageDoubleCheckQdialog()
{
QPalette paletteWhite, paletteRed, paletteGreen;
@@ -83,7 +83,7 @@ public:
menuBarLayoutRight->addWidget(closeBtn);
QObject::connect(closeBtn, &QPushButton::clicked, this, &QDialog::close);
closeBtn->hide();//隐藏关闭按钮
QHBoxLayout* imageViewLayout = new QHBoxLayout();
imageViewLayout->addWidget(_ImageWidgetManager);
@@ -105,34 +105,35 @@ public:
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
//this->show();
}
void showAndSetImg(QPixmap img)
void showAndSetImg(imageDoubleCheckPack pack)
{
mutex.lock();
std::cout << isShowing<<"-" << imgqueue.size()<< std::endl;
if (isShowing == false && imgqueue.size() == 0)
{
_ImageWidgetManager->showImg(img, imgWidgetShowType::imgWidgetOri, 0);
currentPack = pack;
_ImageWidgetManager->showImg(pack.img, imgWidgetShowType::imgWidgetOri, 0);
this->show();
isShowing = true;
}
else
{
imgqueue.enqueue(img);
imgqueue.enqueue(pack);
}
mutex.unlock();
}
signals:
void okSignal();
void ngSignal();
void okSignal(int armPos, int type);
void ngSignal(int armPos, int type);
private:
void pressOK()
{
mutex.lock();
emit okSignal();
emit okSignal(currentPack.armPos , currentPack.type);
if (imgqueue.size() > 0)
{
QPixmap img = imgqueue.dequeue();
_ImageWidgetManager->showImg(img, imgWidgetShowType::imgWidgetOri, 0);
currentPack = imgqueue.dequeue();
_ImageWidgetManager->showImg(currentPack.img, imgWidgetShowType::imgWidgetOri, 0);
}
else
{
@@ -144,11 +145,11 @@ private:
void pressNG()
{
mutex.lock();
emit ngSignal();
emit ngSignal(currentPack.armPos, currentPack.type);
if (imgqueue.size() > 0)
{
QPixmap img = imgqueue.dequeue();
_ImageWidgetManager->showImg(img, imgWidgetShowType::imgWidgetOri, 0);
currentPack = imgqueue.dequeue();
_ImageWidgetManager->showImg(currentPack.img, imgWidgetShowType::imgWidgetOri, 0);
}
else
{
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.