UPDATE
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,547 @@
|
||||
#include <detData.h>
|
||||
#include <handleAiModel.h>
|
||||
#include <simpleAlgo.h>
|
||||
#include <CISCO_struct.hpp>
|
||||
cv::Size BattleStarF1_Max(30, 30), BattleStarF1_Min(400, 400);
|
||||
cv::Size BattleStarF2_Max(30, 30), BattleStarF2_Min(400, 400);
|
||||
cv::Size BattleStarB1_Max(30, 30), BattleStarB1_Min(400, 400);
|
||||
cv::Size BattleStarB2_Max(30, 30), BattleStarB2_Min(400, 400);
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_Halcon_F1(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
//cv::Mat halconImg;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
//HTuple hv_out_OK_Pings;
|
||||
//HTuple hv_out_NG_Pings;
|
||||
//HTuple hv_out_Flag_INS;
|
||||
//HTuple hv_out_Line;
|
||||
//HTuple hv_pin_number;
|
||||
//HTuple hv_out_Pings;
|
||||
//HObject ho_in_Image = MatToHObject(halconImg);
|
||||
//cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
//sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
// &hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
//int flag = hv_out_Flag_INS.D();
|
||||
//if (halconImg.channels() == 1)
|
||||
// cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
//int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
// hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
//int lineSize = hv_out_Line.Length();
|
||||
//int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
//int hv_pin_numberSize = hv_pin_number.Length();
|
||||
//std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
//std::vector<rectAndResult> AllBaseRects;
|
||||
//std::vector<cv::Rect> AllPoints;
|
||||
//std::vector<cv::Rect>okPos;
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
//}
|
||||
//std::vector<cv::Rect>ngPos;
|
||||
//for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_NG_Pings[i * 4].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 3].D());
|
||||
// ngPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
//}
|
||||
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllPoints.push_back(rect);
|
||||
//}
|
||||
//std::vector<startAndEndPoints>xLines;
|
||||
//for (int i = 0; i < lineSize / 4; i++)
|
||||
//{
|
||||
// startAndEndPoints p;
|
||||
// p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
// p.start.y = hv_out_Line[i * 4].D();
|
||||
// p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
// p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
// xLines.push_back(p);
|
||||
//}
|
||||
////画线
|
||||
//double maxRange = 0;
|
||||
//apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
//data->maxPinDetValue = maxRange;
|
||||
//return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_HandleAi_F1(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
//handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
//handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
//cv::Mat img;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
////结果图
|
||||
//cv::Mat Paint;
|
||||
//if (img.channels() == 3)
|
||||
// img.copyTo(Paint);
|
||||
//else
|
||||
// cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
////处理
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
//std::vector<std::vector<cv::Point>> contours;
|
||||
//cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int cnt = 0;
|
||||
//if (contours.size())//如果有缺陷
|
||||
// data->segOriginImgs.push_back(img);
|
||||
//bool finalOK = true;
|
||||
//for (auto contour : contours)
|
||||
//{
|
||||
// cv::Rect originRect = cv::boundingRect(contour);
|
||||
// if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
// continue;
|
||||
// cv::Rect rect = originRect;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
// int clsRes = clsPtr->Evaluate(clsImg);
|
||||
// cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
// std::string clsFileName;
|
||||
// switch (clsRes)
|
||||
// {
|
||||
// case 0:
|
||||
// color = cv::Scalar(0, 255, 0, 30);
|
||||
// clsFileName = "OK";
|
||||
// break;
|
||||
// case 1:
|
||||
// color = cv::Scalar(0, 0, 255, 30);
|
||||
// clsFileName = "NG1";
|
||||
// finalOK = false;
|
||||
// break;
|
||||
// default:
|
||||
// clsFileName = std::to_string(clsRes);
|
||||
// finalOK = false;
|
||||
// }
|
||||
// data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
// cv::rectangle(Paint, originRect, color, 2);
|
||||
//}
|
||||
//if (finalOK == false)
|
||||
//{
|
||||
// data->halconOK = false;
|
||||
// data->aiDetOK = false;
|
||||
// data->aiNgCount++;
|
||||
//}
|
||||
////返回结果图
|
||||
//return Paint;
|
||||
}
|
||||
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_Halcon_F2(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
//cv::Mat halconImg;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
//HTuple hv_out_OK_Pings;
|
||||
//HTuple hv_out_NG_Pings;
|
||||
//HTuple hv_out_Flag_INS;
|
||||
//HTuple hv_out_Line;
|
||||
//HTuple hv_pin_number;
|
||||
//HTuple hv_out_Pings;
|
||||
//HObject ho_in_Image = MatToHObject(halconImg);
|
||||
//cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
//sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
// &hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
//int flag = hv_out_Flag_INS.D();
|
||||
//if (halconImg.channels() == 1)
|
||||
// cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
//int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
// hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
//int lineSize = hv_out_Line.Length();
|
||||
//int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
//int hv_pin_numberSize = hv_pin_number.Length();
|
||||
//std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
//std::vector<rectAndResult> AllBaseRects;
|
||||
//std::vector<cv::Rect> AllPoints;
|
||||
//std::vector<cv::Rect>okPos;
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
//}
|
||||
//std::vector<cv::Rect>ngPos;
|
||||
//for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_NG_Pings[i * 4].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 3].D());
|
||||
// ngPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
//}
|
||||
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllPoints.push_back(rect);
|
||||
//}
|
||||
//std::vector<startAndEndPoints>xLines;
|
||||
//for (int i = 0; i < lineSize / 4; i++)
|
||||
//{
|
||||
// startAndEndPoints p;
|
||||
// p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
// p.start.y = hv_out_Line[i * 4].D();
|
||||
// p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
// p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
// xLines.push_back(p);
|
||||
//}
|
||||
////画线
|
||||
//double maxRange = 0;
|
||||
//apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
//data->maxPinDetValue = maxRange;
|
||||
//return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_HandleAi_F2(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
//handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
//handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
//cv::Mat img;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
////结果图
|
||||
//cv::Mat Paint;
|
||||
//if (img.channels() == 3)
|
||||
// img.copyTo(Paint);
|
||||
//else
|
||||
// cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
////处理
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
//std::vector<std::vector<cv::Point>> contours;
|
||||
//cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int cnt = 0;
|
||||
//if (contours.size())//如果有缺陷
|
||||
// data->segOriginImgs.push_back(img);
|
||||
//bool finalOK = true;
|
||||
//for (auto contour : contours)
|
||||
//{
|
||||
// cv::Rect originRect = cv::boundingRect(contour);
|
||||
// if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
// continue;
|
||||
// cv::Rect rect = originRect;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
// int clsRes = clsPtr->Evaluate(clsImg);
|
||||
// cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
// std::string clsFileName;
|
||||
// switch (clsRes)
|
||||
// {
|
||||
// case 0:
|
||||
// color = cv::Scalar(0, 255, 0, 30);
|
||||
// clsFileName = "OK";
|
||||
// break;
|
||||
// case 1:
|
||||
// color = cv::Scalar(0, 0, 255, 30);
|
||||
// clsFileName = "NG1";
|
||||
// finalOK = false;
|
||||
// break;
|
||||
// default:
|
||||
// clsFileName = std::to_string(clsRes);
|
||||
// finalOK = false;
|
||||
// }
|
||||
// data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
// cv::rectangle(Paint, originRect, color, 2);
|
||||
//}
|
||||
//if (finalOK == false)
|
||||
//{
|
||||
// data->halconOK = false;
|
||||
// data->aiDetOK = false;
|
||||
// data->aiNgCount++;
|
||||
//}
|
||||
////返回结果图
|
||||
//return Paint;
|
||||
}
|
||||
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_Halcon_B1(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
//cv::Mat halconImg;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
//HTuple hv_out_OK_Pings;
|
||||
//HTuple hv_out_NG_Pings;
|
||||
//HTuple hv_out_Flag_INS;
|
||||
//HTuple hv_out_Line;
|
||||
//HTuple hv_pin_number;
|
||||
//HTuple hv_out_Pings;
|
||||
//HObject ho_in_Image = MatToHObject(halconImg);
|
||||
//cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
//sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
// &hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
//int flag = hv_out_Flag_INS.D();
|
||||
//if (halconImg.channels() == 1)
|
||||
// cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
//int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
// hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
//int lineSize = hv_out_Line.Length();
|
||||
//int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
//int hv_pin_numberSize = hv_pin_number.Length();
|
||||
//std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
//std::vector<rectAndResult> AllBaseRects;
|
||||
//std::vector<cv::Rect> AllPoints;
|
||||
//std::vector<cv::Rect>okPos;
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
//}
|
||||
//std::vector<cv::Rect>ngPos;
|
||||
//for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_NG_Pings[i * 4].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 3].D());
|
||||
// ngPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
//}
|
||||
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllPoints.push_back(rect);
|
||||
//}
|
||||
//std::vector<startAndEndPoints>xLines;
|
||||
//for (int i = 0; i < lineSize / 4; i++)
|
||||
//{
|
||||
// startAndEndPoints p;
|
||||
// p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
// p.start.y = hv_out_Line[i * 4].D();
|
||||
// p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
// p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
// xLines.push_back(p);
|
||||
//}
|
||||
////画线
|
||||
//double maxRange = 0;
|
||||
//apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
//data->maxPinDetValue = maxRange;
|
||||
//return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_HandleAi_B1(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
//handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
//handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
//cv::Mat img;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
////结果图
|
||||
//cv::Mat Paint;
|
||||
//if (img.channels() == 3)
|
||||
// img.copyTo(Paint);
|
||||
//else
|
||||
// cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
////处理
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
//std::vector<std::vector<cv::Point>> contours;
|
||||
//cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int cnt = 0;
|
||||
//if (contours.size())//如果有缺陷
|
||||
// data->segOriginImgs.push_back(img);
|
||||
//bool finalOK = true;
|
||||
//for (auto contour : contours)
|
||||
//{
|
||||
// cv::Rect originRect = cv::boundingRect(contour);
|
||||
// if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
// continue;
|
||||
// cv::Rect rect = originRect;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
// int clsRes = clsPtr->Evaluate(clsImg);
|
||||
// cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
// std::string clsFileName;
|
||||
// switch (clsRes)
|
||||
// {
|
||||
// case 0:
|
||||
// color = cv::Scalar(0, 255, 0, 30);
|
||||
// clsFileName = "OK";
|
||||
// break;
|
||||
// case 1:
|
||||
// color = cv::Scalar(0, 0, 255, 30);
|
||||
// clsFileName = "NG1";
|
||||
// finalOK = false;
|
||||
// break;
|
||||
// default:
|
||||
// clsFileName = std::to_string(clsRes);
|
||||
// finalOK = false;
|
||||
// }
|
||||
// data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
// cv::rectangle(Paint, originRect, color, 2);
|
||||
//}
|
||||
//if (finalOK == false)
|
||||
//{
|
||||
// data->halconOK = false;
|
||||
// data->aiDetOK = false;
|
||||
// data->aiNgCount++;
|
||||
//}
|
||||
////返回结果图
|
||||
//return Paint;
|
||||
}
|
||||
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_Halcon_B2(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
//cv::Mat halconImg;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
//HTuple hv_out_OK_Pings;
|
||||
//HTuple hv_out_NG_Pings;
|
||||
//HTuple hv_out_Flag_INS;
|
||||
//HTuple hv_out_Line;
|
||||
//HTuple hv_pin_number;
|
||||
//HTuple hv_out_Pings;
|
||||
//HObject ho_in_Image = MatToHObject(halconImg);
|
||||
//cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
//sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
// &hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
//int flag = hv_out_Flag_INS.D();
|
||||
//if (halconImg.channels() == 1)
|
||||
// cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
//int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
// hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
//int lineSize = hv_out_Line.Length();
|
||||
//int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
//int hv_pin_numberSize = hv_pin_number.Length();
|
||||
//std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
//std::vector<rectAndResult> AllBaseRects;
|
||||
//std::vector<cv::Rect> AllPoints;
|
||||
//std::vector<cv::Rect>okPos;
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
//}
|
||||
//std::vector<cv::Rect>ngPos;
|
||||
//for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_NG_Pings[i * 4].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 3].D());
|
||||
// ngPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
//}
|
||||
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllPoints.push_back(rect);
|
||||
//}
|
||||
//std::vector<startAndEndPoints>xLines;
|
||||
//for (int i = 0; i < lineSize / 4; i++)
|
||||
//{
|
||||
// startAndEndPoints p;
|
||||
// p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
// p.start.y = hv_out_Line[i * 4].D();
|
||||
// p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
// p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
// xLines.push_back(p);
|
||||
//}
|
||||
////画线
|
||||
//double maxRange = 0;
|
||||
//apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
//data->maxPinDetValue = maxRange;
|
||||
//return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat BattleStar_HandleAi_B2(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
//handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
//handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
//cv::Mat img;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
////结果图
|
||||
//cv::Mat Paint;
|
||||
//if (img.channels() == 3)
|
||||
// img.copyTo(Paint);
|
||||
//else
|
||||
// cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
////处理
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
//std::vector<std::vector<cv::Point>> contours;
|
||||
//cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int cnt = 0;
|
||||
//if (contours.size())//如果有缺陷
|
||||
// data->segOriginImgs.push_back(img);
|
||||
//bool finalOK = true;
|
||||
//for (auto contour : contours)
|
||||
//{
|
||||
// cv::Rect originRect = cv::boundingRect(contour);
|
||||
// if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
// continue;
|
||||
// cv::Rect rect = originRect;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
// int clsRes = clsPtr->Evaluate(clsImg);
|
||||
// cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
// std::string clsFileName;
|
||||
// switch (clsRes)
|
||||
// {
|
||||
// case 0:
|
||||
// color = cv::Scalar(0, 255, 0, 30);
|
||||
// clsFileName = "OK";
|
||||
// break;
|
||||
// case 1:
|
||||
// color = cv::Scalar(0, 0, 255, 30);
|
||||
// clsFileName = "NG1";
|
||||
// finalOK = false;
|
||||
// break;
|
||||
// default:
|
||||
// clsFileName = std::to_string(clsRes);
|
||||
// finalOK = false;
|
||||
// }
|
||||
// data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
// cv::rectangle(Paint, originRect, color, 2);
|
||||
//}
|
||||
//if (finalOK == false)
|
||||
//{
|
||||
// data->halconOK = false;
|
||||
// data->aiDetOK = false;
|
||||
// data->aiNgCount++;
|
||||
//}
|
||||
////返回结果图
|
||||
//return Paint;
|
||||
}
|
||||
@@ -0,0 +1,411 @@
|
||||
#include <detData.h>
|
||||
#include <handleAiModel.h>
|
||||
#include <simpleAlgo.h>
|
||||
#include <CISCO_struct.hpp>
|
||||
cv::Size cornitaD_Max(30, 30), cornitaD_Min(400, 400);
|
||||
cv::Size cornitaF_Max(30, 30), cornitaF_Min(400, 400);
|
||||
cv::Size cornitaB_Max(30, 30), cornitaB_Min(400, 400);
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat cornita_Halcon_D(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
cv::Mat halconImg;
|
||||
src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
HTuple hv_out_OK_Pings;
|
||||
HTuple hv_out_NG_Pings;
|
||||
HTuple hv_out_Flag_INS;
|
||||
HTuple hv_out_Line;
|
||||
HTuple hv_pin_number;
|
||||
HTuple hv_out_Pings;
|
||||
HObject ho_in_Image = MatToHObject(halconImg);
|
||||
cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
&hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
int flag = hv_out_Flag_INS.D();
|
||||
if (halconImg.channels() == 1)
|
||||
cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
int lineSize = hv_out_Line.Length();
|
||||
int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
int hv_pin_numberSize = hv_pin_number.Length();
|
||||
std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
std::vector<rectAndResult> AllBaseRects;
|
||||
std::vector<cv::Rect> AllPoints;
|
||||
std::vector<cv::Rect>okPos;
|
||||
for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
{
|
||||
cv::Rect rect(
|
||||
hv_out_OK_Pings[i * 4].D(),
|
||||
hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
hv_out_OK_Pings[i * 4 + 3].D());
|
||||
okPos.push_back(rect);
|
||||
AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
}
|
||||
std::vector<cv::Rect>ngPos;
|
||||
for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
{
|
||||
cv::Rect rect(
|
||||
hv_out_NG_Pings[i * 4].D(),
|
||||
hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
hv_out_NG_Pings[i * 4 + 3].D());
|
||||
ngPos.push_back(rect);
|
||||
AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
}
|
||||
|
||||
for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
{
|
||||
cv::Rect rect(
|
||||
hv_out_OK_Pings[i * 4].D(),
|
||||
hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
hv_out_OK_Pings[i * 4 + 3].D());
|
||||
okPos.push_back(rect);
|
||||
AllPoints.push_back(rect);
|
||||
}
|
||||
std::vector<startAndEndPoints>xLines;
|
||||
for (int i = 0; i < lineSize / 4; i++)
|
||||
{
|
||||
startAndEndPoints p;
|
||||
p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
p.start.y = hv_out_Line[i * 4].D();
|
||||
p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
xLines.push_back(p);
|
||||
}
|
||||
//画线
|
||||
double maxRange = 0;
|
||||
apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
data->maxPinDetValue = maxRange;
|
||||
return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat cornita_HandleiAi_D(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
cv::Mat img;
|
||||
src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
//结果图
|
||||
cv::Mat Paint;
|
||||
if (img.channels() == 3)
|
||||
img.copyTo(Paint);
|
||||
else
|
||||
cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
//处理
|
||||
auto start = std::chrono::high_resolution_clock::now();
|
||||
cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
std::vector<std::vector<cv::Point>> contours;
|
||||
cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
int cnt = 0;
|
||||
if (contours.size())//如果有缺陷
|
||||
data->segOriginImgs.push_back(img);
|
||||
bool finalOK = true;
|
||||
for (auto contour : contours)
|
||||
{
|
||||
cv::Rect originRect = cv::boundingRect(contour);
|
||||
if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
continue;
|
||||
cv::Rect rect = originRect;
|
||||
cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
int clsRes = clsPtr->Evaluate(clsImg);
|
||||
cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
std::string clsFileName;
|
||||
switch (clsRes)
|
||||
{
|
||||
case 0:
|
||||
color = cv::Scalar(0, 255, 0, 30);
|
||||
clsFileName = "OK";
|
||||
break;
|
||||
case 1:
|
||||
color = cv::Scalar(0, 0, 255, 30);
|
||||
clsFileName = "NG1";
|
||||
finalOK = false;
|
||||
break;
|
||||
default:
|
||||
clsFileName = std::to_string(clsRes);
|
||||
finalOK = false;
|
||||
}
|
||||
data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
cv::rectangle(Paint, originRect, color, 2);
|
||||
}
|
||||
if (finalOK == false)
|
||||
{
|
||||
data->halconOK = false;
|
||||
data->aiDetOK = false;
|
||||
data->aiNgCount++;
|
||||
}
|
||||
//返回结果图
|
||||
return Paint;
|
||||
}
|
||||
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat cornita_Halcon_F(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
//cv::Mat halconImg;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
//HTuple hv_out_OK_Pings;
|
||||
//HTuple hv_out_NG_Pings;
|
||||
//HTuple hv_out_Flag_INS;
|
||||
//HTuple hv_out_Line;
|
||||
//HTuple hv_pin_number;
|
||||
//HTuple hv_out_Pings;
|
||||
//HObject ho_in_Image = MatToHObject(halconImg);
|
||||
//cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
//sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
// &hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
//int flag = hv_out_Flag_INS.D();
|
||||
//if (halconImg.channels() == 1)
|
||||
// cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
//int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
// hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
//int lineSize = hv_out_Line.Length();
|
||||
//int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
//int hv_pin_numberSize = hv_pin_number.Length();
|
||||
//std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
//std::vector<rectAndResult> AllBaseRects;
|
||||
//std::vector<cv::Rect> AllPoints;
|
||||
//std::vector<cv::Rect>okPos;
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
//}
|
||||
//std::vector<cv::Rect>ngPos;
|
||||
//for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_NG_Pings[i * 4].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 3].D());
|
||||
// ngPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
//}
|
||||
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllPoints.push_back(rect);
|
||||
//}
|
||||
//std::vector<startAndEndPoints>xLines;
|
||||
//for (int i = 0; i < lineSize / 4; i++)
|
||||
//{
|
||||
// startAndEndPoints p;
|
||||
// p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
// p.start.y = hv_out_Line[i * 4].D();
|
||||
// p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
// p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
// xLines.push_back(p);
|
||||
//}
|
||||
////画线
|
||||
//double maxRange = 0;
|
||||
//apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
//data->maxPinDetValue = maxRange;
|
||||
//return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat cornita_HandleiAi_F(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
//handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
//handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
//cv::Mat img;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
////结果图
|
||||
//cv::Mat Paint;
|
||||
//if (img.channels() == 3)
|
||||
// img.copyTo(Paint);
|
||||
//else
|
||||
// cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
////处理
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
//std::vector<std::vector<cv::Point>> contours;
|
||||
//cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int cnt = 0;
|
||||
//if (contours.size())//如果有缺陷
|
||||
// data->segOriginImgs.push_back(img);
|
||||
//bool finalOK = true;
|
||||
//for (auto contour : contours)
|
||||
//{
|
||||
// cv::Rect originRect = cv::boundingRect(contour);
|
||||
// if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
// continue;
|
||||
// cv::Rect rect = originRect;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
// int clsRes = clsPtr->Evaluate(clsImg);
|
||||
// cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
// std::string clsFileName;
|
||||
// switch (clsRes)
|
||||
// {
|
||||
// case 0:
|
||||
// color = cv::Scalar(0, 255, 0, 30);
|
||||
// clsFileName = "OK";
|
||||
// break;
|
||||
// case 1:
|
||||
// color = cv::Scalar(0, 0, 255, 30);
|
||||
// clsFileName = "NG1";
|
||||
// finalOK = false;
|
||||
// break;
|
||||
// default:
|
||||
// clsFileName = std::to_string(clsRes);
|
||||
// finalOK = false;
|
||||
// }
|
||||
// data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
// cv::rectangle(Paint, originRect, color, 2);
|
||||
//}
|
||||
//if (finalOK == false)
|
||||
//{
|
||||
// data->halconOK = false;
|
||||
// data->aiDetOK = false;
|
||||
// data->aiNgCount++;
|
||||
//}
|
||||
////返回结果图
|
||||
//return Paint;
|
||||
}
|
||||
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat cornita_Halcon_B(std::shared_ptr<detData>data, cv::Mat& src)
|
||||
{
|
||||
//cv::Mat halconImg;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(halconImg);
|
||||
//HTuple hv_out_OK_Pings;
|
||||
//HTuple hv_out_NG_Pings;
|
||||
//HTuple hv_out_Flag_INS;
|
||||
//HTuple hv_out_Line;
|
||||
//HTuple hv_pin_number;
|
||||
//HTuple hv_out_Pings;
|
||||
//HObject ho_in_Image = MatToHObject(halconImg);
|
||||
//cv::Mat r = HObject2Mat(ho_in_Image);
|
||||
//sk_APEX_Pin(ho_in_Image, &hv_out_OK_Pings, &hv_out_NG_Pings,
|
||||
// &hv_out_Line, &hv_pin_number, &hv_out_Pings, &hv_out_Flag_INS);
|
||||
//int flag = hv_out_Flag_INS.D();
|
||||
//if (halconImg.channels() == 1)
|
||||
// cv::cvtColor(halconImg, halconImg, cv::COLOR_GRAY2BGR);
|
||||
//int hv_out_OK_PingsSize = hv_out_OK_Pings.Length(),
|
||||
// hv_out_NG_PingsSize = hv_out_NG_Pings.Length();
|
||||
//int lineSize = hv_out_Line.Length();
|
||||
//int hv_out_PingsSize = hv_out_Pings.Length();
|
||||
//int hv_pin_numberSize = hv_pin_number.Length();
|
||||
//std::cout << "OKSize" << hv_out_OK_PingsSize << "NGSize" << hv_out_NG_PingsSize << std::endl;
|
||||
//std::vector<rectAndResult> AllBaseRects;
|
||||
//std::vector<cv::Rect> AllPoints;
|
||||
//std::vector<cv::Rect>okPos;
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, true));
|
||||
//}
|
||||
//std::vector<cv::Rect>ngPos;
|
||||
//for (int i = 0; i < hv_out_NG_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_NG_Pings[i * 4].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 1].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 2].D(),
|
||||
// hv_out_NG_Pings[i * 4 + 3].D());
|
||||
// ngPos.push_back(rect);
|
||||
// AllBaseRects.push_back(rectAndResult(rect, false));
|
||||
//}
|
||||
|
||||
//for (int i = 0; i < hv_out_OK_PingsSize / 4; i++)
|
||||
//{
|
||||
// cv::Rect rect(
|
||||
// hv_out_OK_Pings[i * 4].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 1].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 2].D(),
|
||||
// hv_out_OK_Pings[i * 4 + 3].D());
|
||||
// okPos.push_back(rect);
|
||||
// AllPoints.push_back(rect);
|
||||
//}
|
||||
//std::vector<startAndEndPoints>xLines;
|
||||
//for (int i = 0; i < lineSize / 4; i++)
|
||||
//{
|
||||
// startAndEndPoints p;
|
||||
// p.start.x = hv_out_Line[i * 4 + 1].D();
|
||||
// p.start.y = hv_out_Line[i * 4].D();
|
||||
// p.end.x = hv_out_Line[i * 4 + 3].D();
|
||||
// p.end.y = hv_out_Line[i * 4 + 2].D();
|
||||
// xLines.push_back(p);
|
||||
//}
|
||||
////画线
|
||||
//double maxRange = 0;
|
||||
//apexHalconPaint(halconImg, xLines, AllPoints, AllBaseRects, maxRange);
|
||||
//data->maxPinDetValue = maxRange;
|
||||
//return halconImg;
|
||||
}
|
||||
//输入det切出的连接器图片
|
||||
static cv::Mat cornita_HandleiAi_B(std::shared_ptr<detData>data, cv::Mat& src, handleAiModelManager* _handleAiModelManager)
|
||||
{
|
||||
//handleAiModelSeg* segPtr = _handleAiModelManager->getSegModel("APEX-Seg.BHD");
|
||||
//handleAiModelCls* clsPtr = _handleAiModelManager->getClsModel("APEX-Cls.BHD");
|
||||
//cv::Mat img;
|
||||
//src(cv::Rect(50, 50, src.cols - 100, src.rows - 150)).copyTo(img);
|
||||
////结果图
|
||||
//cv::Mat Paint;
|
||||
//if (img.channels() == 3)
|
||||
// img.copyTo(Paint);
|
||||
//else
|
||||
// cvtColor(img, Paint, cv::COLOR_GRAY2BGR);
|
||||
////处理
|
||||
//auto start = std::chrono::high_resolution_clock::now();
|
||||
//cv::Mat segRes = ~segPtr->Evaluate(img);
|
||||
//std::vector<std::vector<cv::Point>> contours;
|
||||
//cv::findContours(segRes, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
|
||||
//int cnt = 0;
|
||||
//if (contours.size())//如果有缺陷
|
||||
// data->segOriginImgs.push_back(img);
|
||||
//bool finalOK = true;
|
||||
//for (auto contour : contours)
|
||||
//{
|
||||
// cv::Rect originRect = cv::boundingRect(contour);
|
||||
// if (originRect.width < apexMinPin.width || originRect.height < apexMinPin.height || originRect.width > apexMaxPin.width || originRect.height > apexMaxPin.height)
|
||||
// continue;
|
||||
// cv::Rect rect = originRect;
|
||||
// cv::Mat clsImg = cutImg2Cls(rect, img);
|
||||
// int clsRes = clsPtr->Evaluate(clsImg);
|
||||
// cv::Scalar color = cv::Scalar(0, 0, 255, 30);
|
||||
// std::string clsFileName;
|
||||
// switch (clsRes)
|
||||
// {
|
||||
// case 0:
|
||||
// color = cv::Scalar(0, 255, 0, 30);
|
||||
// clsFileName = "OK";
|
||||
// break;
|
||||
// case 1:
|
||||
// color = cv::Scalar(0, 0, 255, 30);
|
||||
// clsFileName = "NG1";
|
||||
// finalOK = false;
|
||||
// break;
|
||||
// default:
|
||||
// clsFileName = std::to_string(clsRes);
|
||||
// finalOK = false;
|
||||
// }
|
||||
// data->clsOriginImgs.push_back(std::make_pair(clsFileName, clsImg));
|
||||
// cv::rectangle(Paint, originRect, color, 2);
|
||||
//}
|
||||
//if (finalOK == false)
|
||||
//{
|
||||
// data->halconOK = false;
|
||||
// data->aiDetOK = false;
|
||||
// data->aiNgCount++;
|
||||
//}
|
||||
////返回结果图
|
||||
//return Paint;
|
||||
}
|
||||
@@ -7,43 +7,93 @@
|
||||
#include <triggerManager.h>
|
||||
#include <qthread.h>
|
||||
#include <simpleSiemensTcp.hpp>
|
||||
|
||||
struct backDetLaserAcc
|
||||
{
|
||||
std::string SN;
|
||||
std::string productType;
|
||||
pointsOffsetStruct lastPointsOffsetStruct_;
|
||||
};
|
||||
class detProcess : public QThread
|
||||
{
|
||||
public:
|
||||
detProcess()
|
||||
{
|
||||
_threadManager.initialization(this);
|
||||
_manualDetThread.initialization(this);
|
||||
_cameraManager.initialization();
|
||||
_handleAiModelManager.initialization();
|
||||
_triggerManager.initialization(this);
|
||||
detProcess()
|
||||
{
|
||||
_threadManager.initialization(this);
|
||||
_manualDetThread.initialization(this);
|
||||
_cameraManager.initialization();
|
||||
_triggerManager.initialization(this);
|
||||
detProcessCallbackRegister();
|
||||
|
||||
}
|
||||
}
|
||||
//初始化
|
||||
void run()
|
||||
{
|
||||
std::vector<std::future<void>>futures;
|
||||
futures.push_back(std::async(std::launch::async, &handleAiModelManager::start, &_handleAiModelManager));
|
||||
futures.push_back(std::async(std::launch::async, &cameraManager::start, &_cameraManager));
|
||||
futures.push_back(std::async(std::launch::async, &lightSourceManager::start, &_lightSourceManager));
|
||||
futures.push_back(std::async(std::launch::async, &triggerManager::connectHost, &_triggerManager));
|
||||
|
||||
}
|
||||
void run()
|
||||
{
|
||||
_cameraManager.start();
|
||||
_handleAiModelManager.start();
|
||||
_lightSourceManager.start();
|
||||
_triggerManager.start();
|
||||
QThread::msleep(1000);
|
||||
bool res1 = waitrForInitResult(&_cameraManager);
|
||||
bool res2 = waitrForInitResult(&_handleAiModelManager);
|
||||
bool res3 = waitrForInitResult(&_triggerManager);
|
||||
if (res3 == false)//连不上就重试一次
|
||||
{
|
||||
_triggerManager.start();
|
||||
res3 = waitrForInitResult(&_triggerManager);
|
||||
}
|
||||
std::cout << "_cameraManager-initReuslt-->" << std::to_string(res1) << "\n"
|
||||
<< "_handleAiModelManager-initReuslt-->" << std::to_string(res2) << "\n"
|
||||
<< "_triggerManager-initReuslt-->" << std::to_string(res3) << "\n" << std::endl;
|
||||
if (res1 == true && res2 == true && res3 == true)
|
||||
emit _core._qtFunc.sendInitFinished(InitOK);
|
||||
else
|
||||
emit _core._qtFunc.sendInitFinished(InitFailure);
|
||||
}
|
||||
//等待服务返回OK/NG直到超时
|
||||
bool waitrForInitResult(serviceModule* ptr, int timeout = -1)
|
||||
{
|
||||
if (timeout == -1)//不会超时
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
if (ptr->status == InitFailure)
|
||||
return false;
|
||||
else if (ptr->status == InitOK)
|
||||
return true;
|
||||
QThread::msleep(100);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int timecnt = 0;
|
||||
while (timecnt <= timeout)
|
||||
{
|
||||
if (ptr->status != NotInit)
|
||||
break;
|
||||
QThread::msleep(100);
|
||||
timecnt++;
|
||||
}
|
||||
if (timecnt > 100)
|
||||
return false;
|
||||
if (ptr->status == InitFailure)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
simpleSiemensTcp _simpleSiemensTcp;
|
||||
detDataManager _detDataManager;//检测中的数据 不需要初始化
|
||||
imgSaveThreadManager _imgSaveThreadManager;//存图线程 不需要初始化
|
||||
detThreadManager _threadManager;//异步检测线程 不需要初始化
|
||||
|
||||
handleAiModelManager _handleAiModelManager;//模型
|
||||
cameraManager _cameraManager;//相机
|
||||
lightSourceManager _lightSourceManager;//光源
|
||||
detDataManager _detDataManager;//检测中的数据 不需要初始化
|
||||
imgSaveThreadManager _imgSaveThreadManager;//存图线程 不需要初始化
|
||||
detThreadManager _threadManager;//异步检测线程 不需要初始化
|
||||
|
||||
triggerManager _triggerManager;//MODBUS触发器
|
||||
manualDetThread _manualDetThread;//手动触发线程
|
||||
handleAiModelManager _handleAiModelManager;//模型
|
||||
cameraManager _cameraManager;//相机
|
||||
lightSourceManager _lightSourceManager;//光源
|
||||
|
||||
///////////////////////////////
|
||||
triggerManager _triggerManager;//MODBUS触发器
|
||||
manualDetThread _manualDetThread;//手动触发线程
|
||||
|
||||
///////////////////////////////
|
||||
bool startDet = false;
|
||||
QMutex detMutex;
|
||||
std::string currentSn;
|
||||
void detProcessCallbackRegister()
|
||||
{
|
||||
@@ -53,7 +103,10 @@ public:
|
||||
_triggerManager.registerCallback(361, 1, [this](QByteArray& byteArray) {detectionSwitch1(byteArray); }, "检测开始");
|
||||
_triggerManager.registerCallback(361, 2, [this](QByteArray& byteArray) {detectionSwitch2(byteArray); }, "检测结束1");
|
||||
_triggerManager.registerCallback(362, 1, [this](QByteArray& byteArray) {detectionEnd(byteArray); }, "检测结束2");
|
||||
_triggerManager.registerCallback(364, 1, [this](QByteArray& byteArray) {frontBackDet(); }, "检测正反面");
|
||||
_triggerManager.registerCallback(365, 2, [this](QByteArray& byteArray) {testFunc(byteArray); }, "测试1");
|
||||
|
||||
_threadManager.registerCallback([this](std::shared_ptr<detData>data) {correctionResultHandle(data); });
|
||||
_threadManager.registerCallback([this](std::shared_ptr<detData>data) {detectionResultHandle(data); });
|
||||
}
|
||||
//检测程序是否在运行
|
||||
@@ -62,6 +115,8 @@ public:
|
||||
bool currentBack = false;
|
||||
//激光校准数据缓存 //SN 数据
|
||||
correctionStruct laserDataCache;
|
||||
backDetLaserAcc _backDetLaserAcc;
|
||||
|
||||
//总流程开始,机器人发送1至寄存器259
|
||||
//上位机确认OK之后,清零寄存器259,并发送1至寄存器260
|
||||
//如产品型号为Product_1且为正面,则上位机发送1至寄存器256,发送0至寄存器257
|
||||
@@ -84,8 +139,8 @@ public:
|
||||
//上位机确认机器人到达点位1(264)时,确认OK后,寄存器262至1,261至0,取点完成后,发送寄存器263至1
|
||||
//校准函数 261
|
||||
void calibrationFunc(QByteArray& byteArray)
|
||||
{
|
||||
QThread::msleep(3000);
|
||||
{
|
||||
QThread::msleep(500);
|
||||
int armPos = _triggerManager.getValue(264, byteArray);
|
||||
|
||||
int xValue1 = _triggerManager.getValue(265, byteArray);
|
||||
@@ -106,31 +161,33 @@ public:
|
||||
auto cameraPtr = _cameraManager.getCamera("181964");
|
||||
if (cameraPtr == nullptr)
|
||||
return;
|
||||
std::vector<double> values;
|
||||
for (int i = 0; i < 10; i++)//弃用
|
||||
{
|
||||
cameraPtr->trigger();
|
||||
double rangeData1 = cameraPtr->getCameraValue();
|
||||
}
|
||||
for (int i = 0; i < 100; i++)
|
||||
{
|
||||
cameraPtr->trigger();
|
||||
double rangeData1 = cameraPtr->getCameraValue();
|
||||
values.push_back(rangeData1);
|
||||
}
|
||||
cameraPtr->trigger();
|
||||
double rangeData = cameraPtr->getCameraValue();
|
||||
//std::vector<double> values;
|
||||
//for (int i = 0; i < 10; i++)//弃用
|
||||
//{
|
||||
// cameraPtr->trigger();
|
||||
// double rangeData1 = cameraPtr->getCameraValue();
|
||||
//}
|
||||
//for (int i = 0; i < 70; i++)
|
||||
//{
|
||||
// cameraPtr->trigger();
|
||||
// double rangeData1 = cameraPtr->getCameraValue();
|
||||
// values.push_back(rangeData1);
|
||||
//}
|
||||
|
||||
double avgData = 0;
|
||||
for (auto data : values)
|
||||
{
|
||||
avgData += data;
|
||||
}
|
||||
avgData /= values.size();
|
||||
//double avgData = 0;
|
||||
//for (auto data : values)
|
||||
//{
|
||||
// avgData += data;
|
||||
//}
|
||||
//avgData /= values.size();
|
||||
|
||||
double maxData = *std::max_element(values.begin(), values.end());
|
||||
double minData = *std::min_element(values.begin(), values.end());
|
||||
double rangeData = avgData;
|
||||
qDebug() << " max:" << maxData << " min:" << minData << " avg:" << avgData;
|
||||
std::cout << " max:" << maxData << " min:" << minData << " avg:" << avgData << std::endl;
|
||||
//double maxData = *std::max_element(values.begin(), values.end());
|
||||
//double minData = *std::min_element(values.begin(), values.end());
|
||||
//double rangeData = avgData;
|
||||
/*qDebug() << " max:" << maxData << " min:" << minData << " avg:" << avgData;
|
||||
std::cout << " max:" << maxData << " min:" << minData << " avg:" << avgData << std::endl;*/
|
||||
qDebug() << "jiaozhun xValue:" << xValue << " yValue:" << yValue << " zValue:" << zValue << " rangeData:" << rangeData;
|
||||
std::cout << "jiaozhun xValue:" << xValue << " yValue:" << yValue << " zValue:" << zValue << " rangeData:" << rangeData << std::endl;
|
||||
if (rangeData == 0)
|
||||
@@ -140,7 +197,7 @@ public:
|
||||
}
|
||||
|
||||
if (armPos == 1)//第一次
|
||||
laserDataCache = correctionStruct();
|
||||
laserDataCache = correctionStruct();
|
||||
|
||||
if (armPos <= 3)
|
||||
{
|
||||
@@ -150,19 +207,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");
|
||||
@@ -177,19 +235,21 @@ public:
|
||||
_threadManager.addTask(data);//添加任务
|
||||
laserDataCache = correctionStruct();
|
||||
}
|
||||
}
|
||||
}
|
||||
//拍照并检测 300
|
||||
void captureImageAndDetection(QByteArray& byteArray)
|
||||
{
|
||||
startDet = true;
|
||||
//detMutex.lock();
|
||||
_lightSourceManager.getLightSourcePtr("COM9")->setValue(lightSourceChannel::DChannel, 255);
|
||||
QThread::msleep(2000);//延时等待机械臂停稳
|
||||
_triggerManager.sendFinsMsg("write_short_300_0");//触发信号清零
|
||||
_triggerManager.sendFinsMsg("write_short_301_1");//开始检测信号
|
||||
int Pos = _triggerManager.getValue(303, byteArray);
|
||||
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(Pos,1);
|
||||
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(Pos, 1);
|
||||
std::cout << "arm @Pos:" << Pos;
|
||||
|
||||
std::shared_ptr <detData> data = _detDataManager.insertDetData("Camera1", currentSn, 1, 1);
|
||||
std::shared_ptr <detData> data = _detDataManager. insertDetData("Camera1", currentSn, 1, 1);
|
||||
data->oriShowIndex = 0;
|
||||
data->resShowIndex = 0;
|
||||
data->armPos = Pos;
|
||||
@@ -205,6 +265,7 @@ public:
|
||||
|
||||
QThread::msleep(1000);//延时一秒完成拍照,后续改成拍完直接发送
|
||||
_triggerManager.sendFinsMsg("write_short_302_1");//开始检测信号
|
||||
//detMutex.unlock();
|
||||
}
|
||||
//机械臂状态切换 361 1 空闲
|
||||
void detectionSwitch1(QByteArray& byteArray)
|
||||
@@ -228,37 +289,79 @@ public:
|
||||
emit _core._qtFunc.simpleSiemensTcp_Write100True();
|
||||
}
|
||||
}
|
||||
//机械臂结束
|
||||
//检测程序结束结束
|
||||
void detectionEnd(QByteArray& byteArray)
|
||||
{
|
||||
_simpleSiemensTcp.writeDM100FALSE();
|
||||
_lightSourceManager.getLightSourcePtr("COM9")->setValue(lightSourceChannel::DChannel, 0);
|
||||
int currentProductIndex = _core._appConfig._switchProductWidgetDataPtr.currentProductIndex;
|
||||
if (currentBack == true)
|
||||
currentBack = false;
|
||||
else if (_core._appConfig.productDatas[currentProductIndex].isBackExist == true)
|
||||
{
|
||||
backArmIndex = _core._appConfig.productDatas[currentProductIndex].backArmIndex;
|
||||
emit emit _core._qtFunc.uiModuleBackContinueDetDialog_show();
|
||||
}
|
||||
bool result = true;
|
||||
if (armIsRunning == true)
|
||||
{
|
||||
armIsRunning = false;
|
||||
_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);
|
||||
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;
|
||||
}
|
||||
|
||||
//是否继续运行背面检测
|
||||
int currentProductIndex = _core._appConfig._switchProductWidgetDataPtr.currentProductIndex;
|
||||
if (currentBack == true)
|
||||
currentBack = false;
|
||||
else if (
|
||||
_core._appConfig.productDatas[currentProductIndex].isBackExist == true
|
||||
&& result == true
|
||||
&& startDet == true)
|
||||
{
|
||||
backArmIndex = _core._appConfig.productDatas[currentProductIndex].backArmIndex;
|
||||
emit _core._qtFunc.uiModuleBackContinueDetDialog_show();
|
||||
emit _core._qtFunc.uiModulestartDetBtn_disable();
|
||||
}
|
||||
startDet = false;
|
||||
}
|
||||
//校准结果处理
|
||||
void correctionResultHandle(std::shared_ptr<detData>data)
|
||||
{
|
||||
_backDetLaserAcc.lastPointsOffsetStruct_ = data->pointsOffsetStruct_;
|
||||
//写入plc
|
||||
for (auto writeBackStr : data->writeBackData)
|
||||
_triggerManager.sendFinsMsg(writeBackStr);
|
||||
}
|
||||
//检测结果处理
|
||||
void detectionResultHandle(std::shared_ptr<detData>data)
|
||||
{
|
||||
data->sqlVec.push_back({ "SN",data->SNcode });
|
||||
data->sqlVec.push_back({ "ARMPOS",std::to_string(data->armPos) });
|
||||
//发送图片
|
||||
if (data->resultImgs.size() > 0)
|
||||
{
|
||||
@@ -288,29 +391,43 @@ 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);
|
||||
bool finalOk = (data->halconOK == true || data->aiDetOK == true)? true :false;
|
||||
if(finalOk=false)
|
||||
//如果为NG,则等到按下按钮时在发送
|
||||
bool finalOk = (data->halconOK == true && data->aiDetOK == true);
|
||||
|
||||
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);
|
||||
pack.type = 1;
|
||||
emit _core._qtFunc.uiModuleImageDoubleCheckQdialog_ShowWindows(pack);
|
||||
|
||||
}
|
||||
auto productData = _core._productDataCache.get(currentSn);
|
||||
if (finalOk = false)
|
||||
productData->ngCount++;
|
||||
|
||||
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);
|
||||
pack.type = 2;
|
||||
emit _core._qtFunc.uiModuleImageDoubleCheckQdialog_ShowWindows(pack);
|
||||
|
||||
}
|
||||
if (finalOk == true)
|
||||
emit _core._qtFunc.uiModuleLocationMap_SetProductSignStatus(data->armPos, 2);
|
||||
|
||||
|
||||
perConnector _perConnectorData;
|
||||
_perConnectorData.aiOk = data->aiDetOK;
|
||||
_perConnectorData.halconOk = data->halconOK;
|
||||
_perConnectorData.maxPinDetValue = data->maxPinDetValue;
|
||||
auto productData = _core._productDataCache.get(currentSn);
|
||||
productData->connectorResults.push_back(_perConnectorData);
|
||||
data->sqlVec.push_back({ "Result",std::to_string(finalOk) });
|
||||
}
|
||||
//ct计算以及发送到界面
|
||||
auto totalCt = std::chrono::duration_cast<std::chrono::milliseconds>(data->halconEndTime - data->algoStartTime);
|
||||
@@ -322,11 +439,13 @@ public:
|
||||
emit _core._qtFunc.addCtData(1, aiCt.count());
|
||||
if (halconCt.count() > 0)
|
||||
emit _core._qtFunc.addCtData(2, halconCt.count());
|
||||
|
||||
data->sqlVec.push_back({ "totalCt",std::to_string(totalCt.count()) });
|
||||
data->sqlVec.push_back({ "aiCt",std::to_string(aiCt.count()) });
|
||||
data->sqlVec.push_back({ "halconCt",std::to_string(halconCt.count()) });
|
||||
//SQL
|
||||
std::vector<sqlData> sqlDatas;
|
||||
for (auto sqlData : data->sqlVec)
|
||||
sqlDatas.push_back({ sqlData.first, std::to_string(sqlData.second) });
|
||||
sqlDatas.push_back({ sqlData.first, sqlData.second });
|
||||
_core._appConfig._sqlManager.addData(data->SNcode, sqlDatas);
|
||||
|
||||
//写入plc
|
||||
@@ -340,8 +459,56 @@ public:
|
||||
detDataManager* dManager = data->dManager;
|
||||
data->dManager->deleteDetData(data->timeCode);
|
||||
}
|
||||
//使用点激光测量检测是否为正面,没数据就是正面
|
||||
void frontBackDet()
|
||||
{
|
||||
QThread::msleep(1000);
|
||||
_triggerManager.sendFinsMsg("write_short_364_0");
|
||||
_triggerManager.sendFinsMsg("write_short_365_0");
|
||||
auto cameraPtr = _cameraManager.getCamera("181964");
|
||||
if (cameraPtr == nullptr)
|
||||
return;
|
||||
//for (int i = 0; i < 10; i++)//弃用
|
||||
//{
|
||||
// cameraPtr->trigger();
|
||||
// cameraPtr->getCameraValue();
|
||||
//}
|
||||
//for (int i = 0; i < 100; i++)//检测是否有数据
|
||||
//{
|
||||
// cameraPtr->trigger();
|
||||
// if (cameraPtr->getCameraValue() > -100)//有数据 是反面
|
||||
// {
|
||||
// _triggerManager.sendFinsMsg("write_short_365_2");
|
||||
// break;
|
||||
// }
|
||||
//}
|
||||
|
||||
//1是正面,读不到,2是反面,可以读到
|
||||
//edit 1是读不到数据 2是读的到数据
|
||||
cameraPtr->trigger();
|
||||
double value = cameraPtr->getCameraValue();
|
||||
std::cout << "camera value" << value;
|
||||
if (value > -100)//有数据 是反面
|
||||
{
|
||||
_triggerManager.sendFinsMsg("write_short_365_2");
|
||||
return;
|
||||
}
|
||||
_triggerManager.sendFinsMsg("write_short_365_1");//无数据 是正面
|
||||
|
||||
//正面反面是否继续检测,在机械臂脚本中决定
|
||||
}
|
||||
|
||||
//365
|
||||
void testFunc(QByteArray& byteArray)
|
||||
{
|
||||
_triggerManager.sendFinsMsg("write_short_365_0");
|
||||
imageDoubleCheckPack pack;
|
||||
pack.armPos = 1;
|
||||
cv::Mat img = cv::imread("I:/CCD/2024-08-09/15H/APEX10-1/Camera1_APEX10_Pos1_15-13-48-47_Count0.bmp",-1);
|
||||
cvMatToQPixMap(img, pack.img);
|
||||
pack.type = 1;
|
||||
emit _core._qtFunc.uiModuleImageDoubleCheckQdialog_ShowWindows(pack);
|
||||
}
|
||||
public slots:
|
||||
void runBackDet()
|
||||
{
|
||||
@@ -350,6 +517,22 @@ public slots:
|
||||
currentBack = true;
|
||||
_triggerManager.sendFinsMsg("write_short_350_" + QString::number(backArmIndex));//清零
|
||||
_triggerManager.sendFinsMsg("write_short_351_1");
|
||||
qDebug() << "运行背后检测程序";
|
||||
|
||||
_triggerManager.sendFinsMsg("write_short_310_" + QString::number(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetX < 0 ? 2 : 1));
|
||||
_triggerManager.sendFinsMsg("write_short_311_"+QString::number(abs(static_cast<int>(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetX))));
|
||||
double pvalueX = _backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetX - static_cast<int>(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetX);
|
||||
_triggerManager.sendFinsMsg("write_short_312_" + QString::number(static_cast<int>(abs(pvalueX * 100))));
|
||||
|
||||
_triggerManager.sendFinsMsg("write_short_313_" + QString::number(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetY < 0 ? 2 : 1));
|
||||
_triggerManager.sendFinsMsg("write_short_314_" + QString::number(abs(static_cast<int>(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetY))));
|
||||
double pvalueY = _backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetY - static_cast<int>(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetY);
|
||||
_triggerManager.sendFinsMsg("write_short_315_" + QString::number(static_cast<int>(abs(pvalueY * 100))));
|
||||
|
||||
_triggerManager.sendFinsMsg("write_short_316_" + QString::number(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetZ < 0 ? 2 : 1));
|
||||
_triggerManager.sendFinsMsg("write_short_317_" + QString::number(abs(static_cast<int>(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetZ))));
|
||||
double pvalueZ = _backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetZ - static_cast<int>(_backDetLaserAcc.lastPointsOffsetStruct_.baseOffsetZ);
|
||||
_triggerManager.sendFinsMsg("write_short_318_" + QString::number(static_cast<int>(abs(pvalueZ * 100))));
|
||||
}
|
||||
}
|
||||
void writeArmStartSignal(int productTypeIn, QString SN)
|
||||
@@ -363,6 +546,37 @@ public slots:
|
||||
currentSn = SN.toStdString();
|
||||
_triggerManager.sendFinsMsg("write_short_350_" + QString::number(_core._appConfig.productDatas[productTypeIn].indexOfArm));
|
||||
_triggerManager.sendFinsMsg("write_short_351_1");
|
||||
|
||||
qDebug() << "SN:" << SN << "开始运行,型号->" << QString::fromStdString(_core._detGlobalData.productTypeStr);
|
||||
std::cout << "SN:" << SN.toStdString() << "开始运行,型号->" << _core._detGlobalData.productTypeStr <<std::endl;
|
||||
|
||||
}
|
||||
//人工复判按下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);
|
||||
emit _core._qtFunc.uiModulestartDetBtn_enable();
|
||||
_triggerManager.sendFinsMsg("write_short_363_1");
|
||||
auto productData = _core._productDataCache.get(currentSn);
|
||||
productData->ngCount++;
|
||||
std::cout << "TYPE:" << std::to_string(type) << std::endl;
|
||||
//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);
|
||||
emit _core._qtFunc.uiModulestartDetBtn_enable();
|
||||
std::cout << "TYPE:" << std::to_string(type) << std::endl;
|
||||
//detMutex.unlock();
|
||||
}
|
||||
};
|
||||
#pragma once
|
||||
@@ -1,20 +1,40 @@
|
||||
#include <handleAi/handleAiModel.h>
|
||||
#include <appConfig/appConfig.h>
|
||||
#include <appCore.hpp>
|
||||
#include<handleAiModelList.hpp>
|
||||
#include <handleAiModel.h>
|
||||
|
||||
handleAiModelManager::handleAiModelManager()
|
||||
#define enableHandleAiModel 0
|
||||
void handleAiModelManager::handleAiModelManager::run()
|
||||
{
|
||||
_core._appConfig.productDatasMutex.lock();
|
||||
this->basePath = _core._appConfig.handleAiModelPath + "/";
|
||||
for (auto& productData : _core._appConfig.productDatas)
|
||||
if (init == true)
|
||||
return;
|
||||
handleAiModelinitialization(this);
|
||||
#if enableHandleAiModel
|
||||
|
||||
std::vector<std::future<std::string>> futures;
|
||||
for (auto& model : segModels)
|
||||
{
|
||||
insertDetModelPath(productData.handleAiData.detModelName, productData.handleAiData.detGpuIndex);
|
||||
for (auto& handleAiData : productData.handleAiData.detResultHandle)
|
||||
{
|
||||
|
||||
insertSegModelPath(handleAiData.segModelName, handleAiData.segGpuIndex);
|
||||
insertClsModelPath(handleAiData.clsModelName, handleAiData.clsGpuIndex);
|
||||
}
|
||||
futures.push_back(std::async(std::launch::async, &handleAiModelSeg::init, model.second));
|
||||
emit _core._qtFunc.sendInitString(QString::fromStdString(fileManager::getFileName(model.second->path) + "初始化中..."));
|
||||
}
|
||||
_core._appConfig.productDatasMutex.unlock();
|
||||
for (auto& model : clsModels)
|
||||
{
|
||||
futures.push_back(std::async(std::launch::async, &handleAiModelCls::init, model.second));
|
||||
emit _core._qtFunc.sendInitString(QString::fromStdString(fileManager::getFileName(model.second->path) + "初始化中..."));
|
||||
}
|
||||
for (auto& model : detModels)
|
||||
{
|
||||
futures.push_back(std::async(std::launch::async, &handleAiModelDet::init, model.second));
|
||||
emit _core._qtFunc.sendInitString(QString::fromStdString(fileManager::getFileName(model.second->path) + "初始化中..."));
|
||||
}
|
||||
|
||||
for (auto& func : futures)
|
||||
{
|
||||
func.wait();
|
||||
std::string result = func.get();
|
||||
emit _core._qtFunc.sendInitString(QString::fromStdString(fileManager::getFileName(result) + "成功"));
|
||||
qDebug() << QString::fromStdString(fileManager::getFileName(result) + "成功");
|
||||
std::cout << fileManager::getFileName(result) + "成功" << std::endl;
|
||||
}
|
||||
init = true;
|
||||
status = InitOK;
|
||||
#endif
|
||||
}
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
#include <appCore.hpp>
|
||||
#include <detProcess.hpp>
|
||||
|
||||
#include <opencv2/core/utils/logger.hpp>
|
||||
#pragma region 程序启动功能
|
||||
bool appIsRuning()
|
||||
{
|
||||
@@ -107,14 +107,29 @@ void connectSignalAndSlots(MainWindow* front, appCore* _core, detProcess* _detPr
|
||||
front->_displayWidget->_uiModuleLocationMap, &uiModuleLocationMap::resetToDefault);
|
||||
QObject::connect(&_core->_qtFunc, &qtFunction::uiModuleLocationMap_SetProductSignStatus,
|
||||
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)
|
||||
{front->_displayWidget->_summaryDataManager->setSummaryResult(text, color); });
|
||||
QObject::connect(&_core->_qtFunc, &qtFunction::uiModuleSummaryDataManager_Reset,
|
||||
front, [=]() {front->_displayWidget->_summaryDataManager->resetAllValue(); });
|
||||
|
||||
QObject::connect(&_core->_qtFunc, &qtFunction::uiModulestartDetBtn_disable,
|
||||
front, [=]() {front->_displayWidget->_switchProductWidget->startBtn->setDisabled(true);
|
||||
front->_displayWidget->_switchProductWidget->disableTextChange = true;
|
||||
front->_displayWidget->_switchProductWidget->startBtn->setText(" "); });
|
||||
QObject::connect(&_core->_qtFunc, &qtFunction::uiModulestartDetBtn_enable,
|
||||
front, [=]() {front->_displayWidget->_switchProductWidget->startBtn->setEnabled(true);
|
||||
front->_displayWidget->_switchProductWidget->disableTextChange = false;
|
||||
front->_displayWidget->_switchProductWidget->startBtn->setText("运行"); });
|
||||
|
||||
QObject::connect(&_core->_qtFunc, &qtFunction::uiModuleBackContinueDetDialog_show,
|
||||
front, [=]() {front->_backContinueDetDialog->show(); });
|
||||
QObject::connect(&_core->_qtFunc, &qtFunction::uiModuleBackContinueDetDialog_hide,
|
||||
@@ -145,39 +160,78 @@ void connectSignalAndSlots(MainWindow* front, appCore* _core, detProcess* _detPr
|
||||
QObject::connect(front->_backContinueDetDialog, &backContinueDetDialog::continueClickedSignal,
|
||||
_detProcess, &detProcess::runBackDet);
|
||||
}
|
||||
#include <windows.h>
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
|
||||
if (msg == WM_QUERYENDSESSION) {
|
||||
// 阻止关机
|
||||
return FALSE;
|
||||
}
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
appCore _core;
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
|
||||
if (!isRunAsAdmin())
|
||||
if (!isRunAsAdmin())
|
||||
{
|
||||
restartAsAdmin();
|
||||
restartAsAdmin();
|
||||
exit(0);
|
||||
}
|
||||
#if enableHideConsle
|
||||
HWND hWnd = GetConsoleWindow();
|
||||
if (hWnd) {
|
||||
ShowWindow(hWnd, SW_HIDE);
|
||||
}// 隐藏控制台窗口
|
||||
#endif
|
||||
QApplication a(argc, argv);
|
||||
//检测是否已运行
|
||||
if (appIsRuning() == false)
|
||||
exit(0);
|
||||
//////////
|
||||
qRegisterMetaType<imgWidgetShowType>("imgWidgetShowType");
|
||||
qRegisterMetaType<showImgPack>("showImgPack");
|
||||
qRegisterMetaType<cv::Mat*>("matPtr");
|
||||
qRegisterMetaType<cv::Mat>("mat");
|
||||
qRegisterMetaType<std::string>("stdString");
|
||||
qRegisterMetaType<historyPack>("historyPack");
|
||||
qRegisterMetaType<Qt::GlobalColor>("QtGlobalColor");
|
||||
//_core.initTimer();
|
||||
MainWindow w;
|
||||
w.show();
|
||||
detProcess _detProcess;
|
||||
connectSignalAndSlots(&w,&_core,&_detProcess);
|
||||
_detProcess.start();
|
||||
return a.exec();
|
||||
// 注册窗口类
|
||||
WNDCLASS wc = { 0 };
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.hInstance = GetModuleHandle(NULL);
|
||||
wc.lpszClassName = (LPCSTR)L"BlockShutdown";
|
||||
RegisterClass(&wc);
|
||||
|
||||
// 创建窗口
|
||||
HWND hwnd = CreateWindow(wc.lpszClassName, (LPCSTR)L"BlockShutdown", WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL, wc.hInstance, NULL);
|
||||
|
||||
// 消息循环
|
||||
MSG msg;
|
||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
//int main(int argc, char* argv[])
|
||||
//{
|
||||
// if (!isRunAsAdmin())
|
||||
// {
|
||||
// restartAsAdmin();
|
||||
// exit(0);
|
||||
// }
|
||||
//#if enableHideConsle
|
||||
// HWND hWnd = GetConsoleWindow();
|
||||
// if (hWnd) {
|
||||
// ShowWindow(hWnd, SW_HIDE);
|
||||
// }// 隐藏控制台窗口
|
||||
//#endif
|
||||
// QApplication a(argc, argv);
|
||||
// //检测是否已运行
|
||||
// if (appIsRuning() == false)
|
||||
// exit(0);
|
||||
// //////////
|
||||
// cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_ERROR);
|
||||
// qRegisterMetaType<imgWidgetShowType>("imgWidgetShowType");
|
||||
// qRegisterMetaType<showImgPack>("showImgPack");
|
||||
// qRegisterMetaType<cv::Mat*>("matPtr");
|
||||
// qRegisterMetaType<cv::Mat>("mat");
|
||||
// qRegisterMetaType<std::string>("stdString");
|
||||
// qRegisterMetaType<historyPack>("historyPack");
|
||||
// qRegisterMetaType<Qt::GlobalColor>("QtGlobalColor");
|
||||
// qRegisterMetaType<imageDoubleCheckPack>("imageDoubleCheckPack");
|
||||
//
|
||||
// //_core.initTimer();
|
||||
// MainWindow w;
|
||||
// w.show();
|
||||
// detProcess _detProcess;
|
||||
// connectSignalAndSlots(&w,&_core,&_detProcess);
|
||||
// _detProcess.start();
|
||||
// return a.exec();
|
||||
////}
|
||||
|
||||
@@ -8,28 +8,35 @@ class backContinueDetDialog : public QObject
|
||||
public:
|
||||
fancyWarnWindow* _fancyWarnWindow;
|
||||
QTimer* timer;
|
||||
QString SN;
|
||||
backContinueDetDialog()
|
||||
{
|
||||
timer = new QTimer(this);
|
||||
_fancyWarnWindow = new fancyWarnWindow(fancyWarnWindow::tip, "是否继续背面检测", "", true);
|
||||
_fancyWarnWindow = new fancyWarnWindow(fancyWarnWindow::tip, "是否继续背面检测", "", false);
|
||||
_fancyWarnWindow->disableHideAfterClicked();
|
||||
_fancyWarnWindow->hide();
|
||||
_fancyWarnWindow->closeBtn->hide();
|
||||
QObject::connect(_fancyWarnWindow->continueBtn, &QPushButton::clicked, this, &backContinueDetDialog::continueClicked);
|
||||
|
||||
QObject::connect(_fancyWarnWindow->cancelBtn, &QPushButton::clicked, this, &backContinueDetDialog::cancelClicked);
|
||||
}
|
||||
private:
|
||||
|
||||
public slots:
|
||||
void cancelClicked()
|
||||
{
|
||||
qDebug() << "点击了取消检测背面";
|
||||
}
|
||||
void continueClicked()
|
||||
{
|
||||
timer->start(10000);
|
||||
emit continueClickedSignal();
|
||||
_fancyWarnWindow->continueBtn->setDisabled(true);
|
||||
QObject::connect(timer, &QTimer::timeout, this, [=]() {_fancyWarnWindow->continueBtn->setEnabled(true); });
|
||||
}
|
||||
qDebug() << "点击运行背面";
|
||||
}
|
||||
void show()
|
||||
{
|
||||
_fancyWarnWindow->show();
|
||||
_fancyWarnWindow->show();
|
||||
}
|
||||
void hide()
|
||||
{
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include <uiModule/components/fancyButton.h>
|
||||
#include <qdatetime.h>
|
||||
#include <uiModule/uiModule_imageView.h>
|
||||
|
||||
class imageDoubleCheckQdialog :public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -17,6 +16,9 @@ public:
|
||||
QPushButton* closeBtn = new QPushButton(this);
|
||||
fancyButtonText* okBtn = new fancyButtonText(120, 40, "OK", "继续");
|
||||
fancyButtonText* ngBtn = new fancyButtonText(120, 40, "NG", "继续");
|
||||
QMutex mutex;
|
||||
QQueue< imageDoubleCheckPack>imgqueue;
|
||||
imageDoubleCheckPack currentPack;
|
||||
imageDoubleCheckQdialog()
|
||||
{
|
||||
QPalette paletteWhite, paletteRed, paletteGreen;
|
||||
@@ -81,21 +83,21 @@ public:
|
||||
menuBarLayoutRight->addWidget(closeBtn);
|
||||
|
||||
QObject::connect(closeBtn, &QPushButton::clicked, this, &QDialog::close);
|
||||
|
||||
closeBtn->hide();//隐藏关闭按钮
|
||||
QHBoxLayout* imageViewLayout = new QHBoxLayout();
|
||||
imageViewLayout->addWidget(_ImageWidgetManager);
|
||||
|
||||
_ImageWidgetManager->createViewer("");
|
||||
_ImageWidgetManager->disableAllSwitchBtn();
|
||||
|
||||
|
||||
QHBoxLayout* okngBtnLayout = new QHBoxLayout();
|
||||
okngBtnLayout->addWidget(okBtn);
|
||||
okngBtnLayout->addWidget(ngBtn);
|
||||
|
||||
QObject::connect(okBtn, &QPushButton::clicked, this, &QDialog::close);
|
||||
QObject::connect(ngBtn, &QPushButton::clicked, this, &QDialog::close);
|
||||
QObject::connect(okBtn, &QPushButton::clicked, this, [=]() {emit okSignal(); });
|
||||
QObject::connect(ngBtn, &QPushButton::clicked, this, [=]() {emit ngSignal(); });
|
||||
//QObject::connect(okBtn, &QPushButton::clicked, this, &QDialog::close);
|
||||
//QObject::connect(ngBtn, &QPushButton::clicked, this, &QDialog::close);
|
||||
QObject::connect(okBtn, &QPushButton::clicked, this, [=]() {pressOK(); });
|
||||
QObject::connect(ngBtn, &QPushButton::clicked, this, [=]() {pressNG(); });
|
||||
|
||||
layout->addWidget(menuBarWidget, 0, 0);
|
||||
layout->addLayout(imageViewLayout, 1, 0);
|
||||
@@ -103,15 +105,61 @@ public:
|
||||
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
|
||||
//this->show();
|
||||
}
|
||||
void showAndSetImg(QPixmap img)
|
||||
void showAndSetImg(imageDoubleCheckPack pack)
|
||||
{
|
||||
_ImageWidgetManager->showImg(img, imgWidgetShowType::imgWidgetOri, 0);
|
||||
this->show();
|
||||
mutex.lock();
|
||||
std::cout << isShowing<<"-" << imgqueue.size()<< std::endl;
|
||||
if (isShowing == false && imgqueue.size() == 0)
|
||||
{
|
||||
currentPack = pack;
|
||||
_ImageWidgetManager->showImg(pack.img, imgWidgetShowType::imgWidgetOri, 0);
|
||||
_ImageWidgetManager->showImg(pack.img, imgWidgetShowType::imgWidgetRes, 0);
|
||||
this->show();
|
||||
isShowing = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
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(currentPack.armPos , currentPack.type);
|
||||
if (imgqueue.size() > 0)
|
||||
{
|
||||
currentPack = imgqueue.dequeue();
|
||||
_ImageWidgetManager->showImg(currentPack.img, imgWidgetShowType::imgWidgetOri, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
isShowing = false;
|
||||
close();
|
||||
}
|
||||
mutex.unlock();
|
||||
}
|
||||
void pressNG()
|
||||
{
|
||||
mutex.lock();
|
||||
emit ngSignal(currentPack.armPos, currentPack.type);
|
||||
if (imgqueue.size() > 0)
|
||||
{
|
||||
currentPack = imgqueue.dequeue();
|
||||
_ImageWidgetManager->showImg(currentPack.img, imgWidgetShowType::imgWidgetOri, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
isShowing = false;
|
||||
close();
|
||||
}
|
||||
mutex.unlock();
|
||||
}
|
||||
bool isShowing = false;
|
||||
bool isMoving = false;
|
||||
bool isResizing = false;
|
||||
int minWidth = 720, minHeight = 480;
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
#include <appConfig/json/generalJsonParsing.hpp>
|
||||
#include <uiModule/components/fancyDialog.h>
|
||||
#include <opencv.hpp>
|
||||
#include <handleAi/handleAiSimpleDet.h>
|
||||
#include <unordered_map>
|
||||
#include <simpleTools/stringAlgo.h>
|
||||
#include <qmutex.h>
|
||||
@@ -16,11 +15,13 @@
|
||||
#include <qlineedit.h>
|
||||
#include <iostream>
|
||||
#include <appCore.hpp>
|
||||
#include <qtimer.h>
|
||||
class switchProductWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
//
|
||||
bool disableTextChange = false;
|
||||
QMutex mutex;
|
||||
std::vector<productDataStruct>productDatas;
|
||||
int* currentProductIndexPtr;
|
||||
@@ -29,13 +30,25 @@ public:
|
||||
QVBoxLayout* layout = new QVBoxLayout(this);
|
||||
fancyButtonText* switchBtn = new fancyButtonText(100, 60, "修改", "修改当前机型");
|
||||
QLabel* armHeartBeatSign = new QLabel();
|
||||
//料号条码输入
|
||||
QLineEdit* partNumberIntputLine = new QLineEdit();
|
||||
|
||||
//运行按钮
|
||||
fancyButtonText* startBtn;
|
||||
//SN条码输入
|
||||
QLineEdit* snIntputLine = new QLineEdit();
|
||||
//SN完成输入后1秒触发
|
||||
QTimer* timer;
|
||||
//料号显示
|
||||
QComboBox* productSelect = new QComboBox(this);
|
||||
QComboBox* productSelect = new QComboBox(this);
|
||||
QLabel* currentProduct = new QLabel(this);
|
||||
//料号类型
|
||||
QComboBox* productNameTypeSwitch = new QComboBox(this);
|
||||
void clear()
|
||||
{
|
||||
partNumberIntputLine->clear();
|
||||
snIntputLine->clear();
|
||||
}
|
||||
switchProductWidget()
|
||||
{
|
||||
currentProductIndexPtr = &_core._appConfig._switchProductWidgetDataPtr.currentProductIndex;
|
||||
@@ -68,19 +81,28 @@ public:
|
||||
|
||||
layout->addLayout(switchLayout);
|
||||
}
|
||||
snIntputLine->setFixedHeight(50);
|
||||
snIntputLine->setFont(font);
|
||||
|
||||
|
||||
QHBoxLayout* hBtnLayout2 = new QHBoxLayout();
|
||||
partNumberIntputLine->setFixedHeight(50);
|
||||
partNumberIntputLine->setFont(font);
|
||||
partNumberIntputLine->setPlaceholderText("料号条码输入");
|
||||
hBtnLayout2->addWidget(partNumberIntputLine);
|
||||
|
||||
QHBoxLayout* hBtnLayout = new QHBoxLayout();
|
||||
startBtn = new fancyButtonText(80, -1, "运行", "运行检测程序");
|
||||
snIntputLine->setFixedHeight(50);
|
||||
snIntputLine->setFont(font);
|
||||
snIntputLine->setPlaceholderText("SN条码输入");
|
||||
hBtnLayout->addWidget(snIntputLine);
|
||||
hBtnLayout->addWidget(startBtn);
|
||||
|
||||
layout->addLayout(hBtnLayout2);
|
||||
layout->addLayout(hBtnLayout);
|
||||
productSelectFresh(0);
|
||||
connect(startBtn, &QPushButton::clicked, this, [=]()
|
||||
{
|
||||
emit startArmProgramSignal(productSelect->currentIndex(), snIntputLine->text());
|
||||
emit startArmProgramSignal(indexFromPartNumber, snIntputLine->text());
|
||||
std::cout << "按下按钮" << std::endl;
|
||||
});
|
||||
connect(switchBtn, &QPushButton::clicked, this, &switchProductWidget::startSwitch);
|
||||
@@ -93,6 +115,22 @@ public:
|
||||
{
|
||||
productSelectFresh(productNameTypeSwitch->currentIndex());
|
||||
});
|
||||
connect(partNumberIntputLine, &QLineEdit::textChanged, this, [=]()
|
||||
{
|
||||
timer->start();
|
||||
//partNumberIntputLineSlot(partNumberIntputLine->text().toStdString());
|
||||
});
|
||||
timer = new QTimer(this);
|
||||
timer->setInterval(300); // 设置1秒超时
|
||||
timer->setSingleShot(true); // 定时器只触发一次
|
||||
connect(timer, &QTimer::timeout, this, [=]()
|
||||
{
|
||||
partNumberIntputLineSlot(partNumberIntputLine->text().toStdString());
|
||||
});
|
||||
currentProduct->setText("请输入料号");
|
||||
productSelect->hide();
|
||||
switchBtn->hide();
|
||||
startBtn->setDisabled(true);
|
||||
}
|
||||
void productSelectFresh(int index)
|
||||
{
|
||||
@@ -138,15 +176,19 @@ public slots:
|
||||
if (status == true)
|
||||
{
|
||||
startBtn->toDefault();
|
||||
startBtn->setText("运行");
|
||||
if (disableTextChange == false)
|
||||
startBtn->setText("运行");
|
||||
snIntputLine->setDisabled(false);
|
||||
partNumberIntputLine->setDisabled(false);
|
||||
std::cout << "按下软件运行" << std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
startBtn->toRed();
|
||||
startBtn->setText("急停");
|
||||
if (disableTextChange == false)
|
||||
startBtn->setText("急停");
|
||||
snIntputLine->setDisabled(true);
|
||||
partNumberIntputLine->setDisabled(true);
|
||||
std::cout << "按下软件急停" << std::endl;
|
||||
}
|
||||
}
|
||||
@@ -154,8 +196,34 @@ signals:
|
||||
void startArmProgramSignal(int,QString);
|
||||
void switchProductSignal(int);
|
||||
private:
|
||||
int indexFromPartNumber = -1;
|
||||
int siwtchBtnState = 0;
|
||||
private slots:
|
||||
void partNumberIntputLineSlot(std::string partNumber)
|
||||
{
|
||||
int PartNumber_Count = partNumber.length();//循环次数
|
||||
for (auto i = 0; i < PartNumber_Count; i++)
|
||||
{
|
||||
std::string partNumber_Split = partNumber.substr(0, PartNumber_Count - i);
|
||||
auto it = _core._appConfig.partNumberWithIndex.find(partNumber_Split);
|
||||
if (it != _core._appConfig.partNumberWithIndex.end())
|
||||
{
|
||||
int index = _core._appConfig.partNumberWithIndex.find(partNumber_Split)->second;
|
||||
currentProduct->setText(QString::fromStdString(_core._appConfig.productDatas[index].name));
|
||||
*currentProductIndexPtr = index;
|
||||
startBtn->setEnabled(true);
|
||||
indexFromPartNumber = index;
|
||||
snIntputLine->setFocus();
|
||||
emit switchProductSignal(index);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
currentProduct->setText("未找到对应料号!");
|
||||
startBtn->setDisabled(true);
|
||||
}
|
||||
}
|
||||
void startSwitch()
|
||||
{
|
||||
if(siwtchBtnState == 0)
|
||||
|
||||
Reference in New Issue
Block a user