This commit is contained in:
2024-06-13 16:44:21 +08:00
parent 1030db57b3
commit db0a968e99
5 changed files with 1205 additions and 48 deletions
+44 -38
View File
@@ -5,8 +5,8 @@
#include <algo/simpleAlgo.h>
cv::Mat pinHandleAiEvaluate(std::shared_ptr <detData> data, cv::Mat& src,
handleAiModelSeg* segPtr, handleAiModelCls* clsPtr);
bool pinHalconEvaluate(cv::Rect& Result, cv::Mat& src, cv::Mat& out, int productType, int type1, int type2);
/////////////////HALCON////////////////////////
bool pinHalconEvaluate(cv::Rect& Result, cv::Mat& src, cv::Mat& out, int productType);
//公头定位
std::vector<handdleAI::Bbox> pinDetEvaluate(cv::Mat& src, handleAiModelManager* _handleAiModelManager)
{
@@ -15,45 +15,40 @@ std::vector<handdleAI::Bbox> pinDetEvaluate(cv::Mat& src, handleAiModelManager*
_handleAiModelManager->smalDet->Evaluate(src, result);
return result;
}
std::vector<cv::Rect> getpinHandleAiEvaluateRect(std::shared_ptr <detData> data, cv::Mat& src, std::vector<handdleAI::Bbox>& result)
std::vector<handdleAI::Bbox> getpinHandleAiEvaluateRect(std::shared_ptr <detData> data, cv::Mat& src, std::vector<handdleAI::Bbox>& detResult)
{
//Bbox转Rect
std::vector<cv::Rect> rectVec;
for (auto detResult : result)
rectVec.push_back(cv::Rect(detResult.x - detResult.w / 2, detResult.y - detResult.h / 2, detResult.w, detResult.h));
std::vector<handdleAI::Bbox> result;
//计算过滤条件
int totalWidth = 0;
for (auto detResult : result)
for (auto detResult : detResult)
totalWidth += detResult.w;
int avgWidth= totalWidth / rectVec.size();
int avgWidth= totalWidth / detResult.size();
std::vector<cv::Rect> resultRectVec;
cv::Point centerPos(src.rows / 2, src.cols / 2);
cv::Rect targetRect(src.cols / 3, src.rows / 3, src.cols / 3, src.rows / 3);
for (auto detResult : result)
for (auto detData : detResult)
{
if ((detResult.x< targetRect.x || detResult.x > targetRect.x + targetRect.width ||
detResult.y < targetRect.y || detResult.y > targetRect.y + targetRect.height) == false)
if ((detData.x< targetRect.x || detData.x > targetRect.x + targetRect.width ||
detData.y < targetRect.y || detData.y > targetRect.y + targetRect.height) == false)
{
resultRectVec.push_back(cv::Rect(detResult.x - detResult.w / 2, detResult.y - detResult.h / 2, detResult.w, detResult.h));
result.push_back(detData);
}
}
return resultRectVec;
return result;
}
//HALCON检测
void halconEvaluate(std::shared_ptr <detData> data, std::vector<cv::Rect>connectorPos,std::vector<cv::Mat>&halconImgResult)
void halconEvaluate(std::shared_ptr <detData> data, std::vector<handdleAI::Bbox>connectorPos,std::vector<cv::Mat>&halconImgResult)
{
cv::Mat src = data->oriImgs[0];
for (auto& rect : connectorPos)
for (auto& box : connectorPos)
{
cv::Mat halconMatResult;
bool halconBoolResult = pinHalconEvaluate(rect, src, halconMatResult, data->productType, 1, 1);
bool halconBoolResult = pinHalconEvaluate(BboxToRect(box), src, halconMatResult, box.classes);
if (halconBoolResult == true)
halconImgResult.push_back(halconMatResult);//HALCON检测结果
}
}
bool pinHalconEvaluate(cv::Rect& Result, cv::Mat& src,cv::Mat& out,int productType,int type1,int type2)
bool pinHalconEvaluate(cv::Rect& Result, cv::Mat& src,cv::Mat& out,int productType)
{
#pragma region halcon变量定义
//测量
@@ -83,18 +78,29 @@ bool pinHalconEvaluate(cv::Rect& Result, cv::Mat& src,cv::Mat& out,int productTy
//[4]-ping针偏移判NG阈值(mm);
//[5]-切图存图开关
hv_in_Parameter.Append(3);
hv_in_Parameter.Append(type1);
hv_in_Parameter.Append(type2);
hv_in_Parameter.Append(1);
hv_in_Parameter.Append(1);
hv_in_Parameter.Append(0.0135);
hv_in_Parameter.Append(0.2);
hv_in_Parameter.Append(2);
hv_in_ShapePath = "./halconModel";
Pings_Inspection_2_Front_New(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X,
&hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num,
&hv_out_NG_Pings_Num, &hv_out_Flag_INS, &hv_out_Img_INS);
switch (productType)
{
case 0:
Pings_Inspection_2_Front_New(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X,
&hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num,
&hv_out_NG_Pings_Num, &hv_out_Flag_INS, &hv_out_Img_INS);
break;
case 2:
Pings_Inspection_1_Front_New(ho_in_Image, hv_in_ShapePath, hv_in_Parameter, &hv_out_Pings_X,
&hv_out_Pings_Y, &hv_out_NG_Pings_X, &hv_out_NG_Pings_Y, &hv_out_Pings_Num,
&hv_out_NG_Pings_Num, &hv_out_Flag_INS, &hv_out_Img_INS);
break;
default:
break;
}
if(hv_out_Flag_INS.D()==1)
{
out = HObject2Mat(hv_out_Img_INS);
@@ -115,28 +121,28 @@ bool pinHalconEvaluate(cv::Rect& Result, cv::Mat& src,cv::Mat& out,int productTy
//}
}
//缺陷检测
void handleAiEvaluate(std::shared_ptr <detData> data, handleAiModelManager* _handleAiModelManager, std::vector<cv::Rect>connectorPos, std::vector<cv::Mat>&aiImgResult)
void handleAiEvaluate(std::shared_ptr <detData> data, handleAiModelManager* _handleAiModelManager, std::vector<handdleAI::Bbox>connectorPos, std::vector<cv::Mat>&aiImgResult)
{
cv::Mat src = data->oriImgs[0];
for (auto rect : connectorPos)
for (auto box : connectorPos)
{
cv::Mat handleAiMat;
switch (data->productType)
{
case 0://AFront
handleAiMat = pinHandleAiEvaluate(data, src(rect),
handleAiMat = pinHandleAiEvaluate(data, src(BboxToRect(box)),
_handleAiModelManager->largeSeg, _handleAiModelManager->largeCls);
break;
case 1://ABack
handleAiMat = pinHandleAiEvaluate(data, src(rect),
handleAiMat = pinHandleAiEvaluate(data, src(BboxToRect(box)),
_handleAiModelManager->largeSeg, _handleAiModelManager->largeCls);
break;
case 2://B
handleAiMat = pinHandleAiEvaluate(data, src(rect),
handleAiMat = pinHandleAiEvaluate(data, src(BboxToRect(box)),
_handleAiModelManager->midSeg, _handleAiModelManager->midCls);
break;
case 3://C
handleAiMat = pinHandleAiEvaluate(data, src(rect),
handleAiMat = pinHandleAiEvaluate(data, src(BboxToRect(box)),
_handleAiModelManager->smallSeg, _handleAiModelManager->smallCls);
break;
}
@@ -226,19 +232,19 @@ void ALGO_Inspection(std::shared_ptr <detData> data, handleAiModelManager* _hand
}
cv::Mat src = data->oriImgs[0];
//使用det获取每个公头的位置
std::vector<handdleAI::Bbox> pinPos= pinDetEvaluate(src, _handleAiModelManager);
std::vector<handdleAI::Bbox> detResult = pinDetEvaluate(src, _handleAiModelManager);
//过滤结果,获取用于handleAi/HALCON检测的rect
std::vector<cv::Rect> detRects = getpinHandleAiEvaluateRect(data,src,pinPos);
std::vector<handdleAI::Bbox> pinPos = getpinHandleAiEvaluateRect(data,src, detResult);
//HANDLEAI
std::vector<cv::Mat>aiImgResult;
#if disableeHandleAiAlgo
handleAiEvaluate(data, _handleAiModelManager, detRects, aiImgResult);
#if enableHandleAiAlgo
handleAiEvaluate(data, _handleAiModelManager, pinPos, aiImgResult);
#endif
data->handleAiEndTime = std::chrono::high_resolution_clock::now();
//HALCON
std::vector<cv::Mat>halconImgResult;
#if disableHalconAlgo
halconEvaluate(data, detRects, halconImgResult);
#if enableHalconAlgo
halconEvaluate(data, pinPos, halconImgResult);
#endif
data->halconEndTime = std::chrono::high_resolution_clock::now();
//平铺结果图
@@ -1,6 +1,7 @@
#include <HalconCpp.h>
#include <opencv.hpp>
#include <ios>
#include <handleAI.h>
using namespace HalconCpp;
struct MatchResult {
cv::Rect boundingRect;
@@ -639,6 +640,10 @@ static std::vector<cv::Point> contourPlusContour(const std::vector<cv::Point>& c
return res;
}
static Rect BboxToRect(handdleAI::Bbox input)
{
return Rect(input.x - input.w / 2, input.y - input.h / 2, input.w, input.h);
}
enum ngTypeEnum
{
OK,
+2 -2
View File
@@ -20,8 +20,8 @@
#define enableHandleAiModel 1
#define disableBackEndCheck 1
#define disableeAlgo 0
#define disableeHalconAlgo 1
#define disableeHandleAiAlgo 0
#define enableHalconAlgo 1
#define enableHandleAiAlgo 0
//窗口设置
#define windowMoveFreshRate 100//窗口移动每秒的刷新率
File diff suppressed because it is too large Load Diff
@@ -8,8 +8,8 @@ class switchProductWidget : public QWidget
Q_OBJECT
public:
QLabel* staticLabel = new QLabel(this);
std::vector<QString>productName ={"asr1006","asr1009","cs9600","MDS9710"};
std::vector<int>productCode = { 1,2,3,4};
std::vector<QString>productName ={"asr1006","asr1009","cs9600","MDS9710","MDS9706","C9504"};
std::vector<int>productCode = { 1,2,3,4,5,6};
int* currentProductIndexPtr;
QVBoxLayout* layout = new QVBoxLayout(this);
fancyButtonText* switchBtn = new fancyButtonText(100, 60, "修改", "修改当前机型");