#include "algEg.h" #include "ValveDetector.h" #include "qmap.h" #include "qtcvutils.h" #include "BatchTest4Alg.h" #include "modelVerfication.h" #pragma execution_character_set("utf-8") using namespace luffy_base; static QMap listModes; algEg::algEg() { luffy_triangle::createNewTrigValue(360); luffy_triangle::createNewTrigValue(3600); } algEg::~algEg() { } const int nAngleMax = 3600;//将角度精确到0.1度 把整个圆分成3600份 bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) { int64 nStart = cv::getTickCount();qDebug() << "start alg valve detect"; ValveDetector m_objDetect; InputParam paramInput = { 0 }; OutputParam paramOutput; paramInput.nMaxAngle = nAngleMax; paramInput.dScoreThres = lpAlgorithm->GetParamValue("scoreTh", LP_DOUBLE).toDouble();//匹配分数阈值 低于该阈值 表示气门芯寻找失败 paramInput.nBarScore = lpAlgorithm->GetParamValue("barScore", LP_INT).toDouble();//辐条分数 paramInput.nBarScore = paramInput.nBarScore > 50 ? paramInput.nBarScore : 50; paramInput.withinOffset = lpAlgorithm->GetParamValue("withinOffset", LP_INT).toInt(); paramInput.barNum = lpAlgorithm->GetParamValue("barNum", LP_INT).toInt(); paramInput.flagCircle = lpAlgorithm->GetParamValue("flagCircle", LP_INT).toInt(); paramInput.roi = lpAlgorithm->GetParamValue("cirlceArea", LP_ROI).value(); paramInput.cMatchScore = lpAlgorithm->GetParamValue("cMatchScore", LP_DOUBLE).toDouble(); paramInput.wheelType = lpAlgorithm->GetParamValue("wheelType", LP_INT).toInt(); paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt(); paramInput.nValveOffset = lpAlgorithm->GetParamValue("valveOffset", LP_INT).toInt();//获取气门芯标定位置在圆心坐标系中的角度偏移值 paramInput.nStartOffset = lpAlgorithm->GetParamValue("startOffset", LP_INT).toInt(); paramInput.fValveWidth = lpAlgorithm->GetParamValue("valveWidth", LP_DOUBLE).toDouble(); paramInput.fValveDis = lpAlgorithm->GetParamValue("valveDis", LP_DOUBLE).toDouble(); paramInput.fStartDis = lpAlgorithm->GetParamValue("startDis", LP_DOUBLE).toDouble();//标定时标定点的圆心坐标与轮毂中心的坐标距离 paramOutput.bIsFind = false; paramOutput.dScore = 0; paramOutput.showMatchScore = -1; paramOutput.dAngle = 361; paramOutput.nErrorType = 0; Mat mask; Mat gray; Mat centerRoi = lpAlgorithm->GetParamValue("centerRoi", LP_MAT).value(); if (!lpTask->GetTaskInfo()->detectImg.empty()) { luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray); qDebug() << "luffy_imageProc::createImage"; } if (gray.empty()) { paramOutput.nErrorType += 1; qWarning() << "valve detect, gray is empty"; return false; } luffy_imageProc::createImage(gray, mask, luffy_imageProc::emCreateColor); QString strObj = paramInput.strObj = lpTask->GetTaskInfo()->strName; bool bExist = true; if (strObj.isEmpty()) { bExist = false; paramOutput.nErrorType += 2; } if (!centerRoi.empty()) { qDebug() << "valve detection: creating CenterRoi"; luffy_imageProc::createImage(centerRoi, paramInput.centerRoi, luffy_imageProc::emCreateGray); } else { qWarning() << "valve detection: fail to get CenterRoi"; bExist = false; } //保护 防止越界 QPointF pt = lpAlgorithm->GetParamValue("center", LP_POINTF).toPointF(); if (pt.x() > gray.size().width||pt.y()>gray.size().height) { qWarning() << "center point big "; return false; } // add original center paramInput.originalPoint = Point2f(pt.x(), pt.y()); paramInput.nCenterAlg = lpAlgorithm->GetParamValue("centerAlg", LP_INT).toInt(); double centeroffset = lpAlgorithm->GetParamValue("centerOffset", LP_INT).toInt(); // add background paramInput.backGround = lpAlgorithm->GetParamValue("background", LP_MAT).value(); luffy_imageProc::createImage(paramInput.backGround, paramInput.backGround, luffy_imageProc::emCreateGray); Mat rstMat; if (bExist) { qDebug() << "valve detection: found CenterRoi, trying to get the center points"; paramInput.ptCenter = m_objDetect.getCenterPoints(gray, centerRoi, paramInput, Point(pt.x(), pt.y()), rstMat); } if (paramInput.ptCenter.x == 0) { bExist = false; qWarning() << "valve detection: center point is null, background is empty"; } else { float dis = luffy_math::disofPoints(paramInput.originalPoint, paramInput.ptCenter); if (dis > centeroffset) { bExist = false; paramOutput.nErrorType += 8; paramOutput.flag = 1; } } Mat tmp = lpAlgorithm->GetParamValue("valveTemplate", LP_MAT).value();//获取气门芯模板图 Mat barTemp = lpAlgorithm->GetParamValue("barTemplate", LP_MAT).value();//获取辐条模板图 Mat weightMat = lpAlgorithm->GetParamValue("weightMat", LP_MAT).value();// Mat baseImage = lpAlgorithm->GetParamValue("baseImage", LP_MAT).value(); int num = lpTask->GetSystemInfoValue("station").toInt(); if (num == 2) { if (!baseImage.empty() && !weightMat.empty()) { if (baseImage.size() != weightMat.size()) { paramOutput.showMatchScore = 366; paramOutput.nErrorType += 16; bExist = false; } else { modelVerfication verObj(20, 127); verObj.setWeightMat(weightMat); bool ok = verObj.objectVerification(rstMat, baseImage, paramInput.cMatchScore, 360, paramOutput.showMatchScore); if (!ok) { paramOutput.nErrorType += 16; bExist = false; } } } } if (!tmp.empty() && !barTemp.empty()) { luffy_imageProc::createImage(tmp, paramInput.imgTemplate, luffy_imageProc::emCreateGray); luffy_imageProc::createImage(barTemp, paramInput.barTemplate, luffy_imageProc::emCreateGray); } else { if (!barTemp.empty() && paramInput.flagCircle == 1) { luffy_imageProc::createImage(barTemp, paramInput.barTemplate, luffy_imageProc::emCreateGray); } else { qWarning() << "valve detection: can not get template for detecting"; bExist = false; } } if (bExist) { qDebug() << "valve detection: try finding"; //定位检测 m_objDetect.detect(gray, paramInput, paramOutput, mask); } else { qWarning() << "valve detection: some param is missing"; } QPointF centerPoint; centerPoint.setX(paramInput.ptCenter.x); centerPoint.setY(paramInput.ptCenter.y); if (lpTask->GetSystemInfoValue("wf_batch_test").toBool()) { int nAngle = paramOutput.dAngle; nAngle = nAngle >= paramInput.nMaxAngle ? 0 : nAngle; int tmpX = paramInput.ptCenter.x + paramInput.fValveDis * luffy_base::luffy_triangle::getCos(paramInput.nMaxAngle, nAngle); int tmpY = paramInput.ptCenter.y - paramInput.fValveDis * luffy_base::luffy_triangle::getSin(paramInput.nMaxAngle, nAngle); Point ptValve(tmpX, tmpY); QString strBase = lpTask->GetSystemInfoValue("folderBase").toString(); QString strFile = lpTask->GetSystemInfoValue("fileName").toString(); bool b = BatchTest4Alg::batchTest(strObj, ptValve, paramOutput.nErrorType, strBase, lpTask->GetTaskInfo()->strImageName); BatchTest4Alg::saveResult(strObj, b, lpTask->GetTaskInfo()->strImageName, strBase + "\\" + strFile); } QVariantMap vMap = lpTask->GetTaskInfo()->property.toMap(); vMap.insert("model_cali", true); lpTask->GetTaskInfo()->property = vMap; //paramOutput.dAngleRes = (paramOutput.dAngle - paramInput.nValveOffset) / paramInput.nMaxAngle * 360.0; if (paramOutput.dAngle >= 3610) paramOutput.dAngleRes = 3610; else paramOutput.dAngleRes = (paramOutput.dAngle - paramInput.nStartOffset) / paramInput.nMaxAngle * 360.0; paramOutput.dAngleRes = m_objDetect.ruleData(paramOutput.dAngleRes, paramOutput.nErrorType);//随机数 paramOutput.strResultTip = m_objDetect.genResultTip(paramOutput.strResultTip, paramOutput.nErrorType); paramOutput.dTime = (double)(cv::getTickCount() - nStart) / cv::getTickFrequency() * 1000.0; m_objDetect.drawResult(mask, paramInput, paramOutput); //m_objDetect.saveResult(gray, paramInput, paramOutput, strObj); lpAlgorithm->SetOutParamValue("image", EngineBase::convMat2QImage(mask)); lpAlgorithm->SetOutParamValue("score", paramOutput.dScore); lpAlgorithm->SetOutParamValue("angle", paramOutput.dAngleRes); lpAlgorithm->SetOutParamValue("error", paramOutput.nErrorType); lpAlgorithm->SetOutParamValue("centerPoint", centerPoint); QString cLetter = paramOutput.strResultTip + "/" + QString::number(paramInput.dScoreThres); lpAlgorithm->SetOutParamValue("resultTip", cLetter); QString strImgName = lpTask->GetTaskInfo()->strImageName; lpAlgorithm->SetOutParamValue("imageName", lpTask->GetTaskInfo()->strImageName); qDebug() << "finish alg valve detect"; return true; } bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) { LP_ALGORITHM_PARAM param1_centeroffset("centerOffset", LP_INT, 25, QObject::tr("圆心偏差距离,单位像素")); lpAlgorithm->AddParam(¶m1_centeroffset, 1); LP_ALGORITHM_PARAM param1_1("backgroundThresh", LP_INT, 15, QObject::tr("背景差异性阈值")); lpAlgorithm->AddParam(¶m1_1, 1); LP_ALGORITHM_PARAM param1("scoreTh", LP_DOUBLE, 90, QObject::tr("相似度评价阈值,在0~100之间")); lpAlgorithm->AddParam(¶m1, 1); LP_ALGORITHM_PARAM param2_1("wheelType", LP_INT, 0, QObject::tr("轮毂类型,0摩伦,1汽轮")); lpAlgorithm->AddParam(¶m2_1, 1); LP_ALGORITHM_PARAM param3("flagCircle", LP_INT, 0, QObject::tr("0:无气门芯标识,绑定气门芯标定")); lpAlgorithm->AddParam(¶m3, 1); LP_ALGORITHM_PARAM param3_1("centerAlg", LP_INT, 0, QObject::tr("是否开启中心定位,0关闭,1开启")); lpAlgorithm->AddParam(¶m3_1, 1); LP_ALGORITHM_PARAM param3_2("center", LP_POINTF, QVariant(), QObject::tr("轮毂中心坐标,绑定气门芯标定")); lpAlgorithm->AddParam(¶m3_2, 1); LP_ALGORITHM_PARAM param3_3("centerRoi", LP_MAT, QVariant(), QObject::tr("轮毂中心模板, 绑定圆定位")); lpAlgorithm->AddParam(¶m3_3, 1); LP_ALGORITHM_PARAM param3_6("cirlceArea", LP_ROI, QVariant(), QObject::tr("轮毂区域框选")); lpAlgorithm->AddParam(¶m3_6, 1); LP_ALGORITHM_PARAM param3_7("cMatchScore", LP_DOUBLE, 0.2000, QObject::tr("轮毂型号匹配分值")); lpAlgorithm->AddParam(¶m3_7, 1); LP_ALGORITHM_PARAM param3_9("barScore", LP_INT, 0, QObject::tr("辐条得分值")); lpAlgorithm->AddParam(¶m3_9, 1); LP_ALGORITHM_PARAM param13_1("withinOffset", LP_INT, 0, QObject::tr(" ")); lpAlgorithm->AddParam(¶m13_1, 1); LP_ALGORITHM_PARAM param13_2("barNum", LP_INT, 0, QObject::tr(" ")); lpAlgorithm->AddParam(¶m13_2, 1); LP_ALGORITHM_PARAM param13("valveOffset", LP_INT, 0, QObject::tr(" ")); lpAlgorithm->AddParam(¶m13, 1); LP_ALGORITHM_PARAM param_start("startOffset", LP_INT, 0, QObject::tr(" ")); lpAlgorithm->AddParam(¶m_start, 1); LP_ALGORITHM_PARAM param23("valveWidth", LP_DOUBLE, 0, QObject::tr(" ")); lpAlgorithm->AddParam(¶m23, 1); LP_ALGORITHM_PARAM param33("valveDis", LP_DOUBLE, 0, QObject::tr(" "));//标定时气门芯的圆心坐标与轮毂中心的坐标距离 lpAlgorithm->AddParam(¶m33, 1); LP_ALGORITHM_PARAM param_startDis("startDis", LP_DOUBLE, 0, QObject::tr(" "));//标定时标定点的圆心坐标与轮毂中心的坐标距离 lpAlgorithm->AddParam(¶m_startDis, 1); LP_ALGORITHM_PARAM param43("valveTemplate", LP_MAT, QVariant(), QObject::tr(" ")); lpAlgorithm->AddParam(¶m43, 1); LP_ALGORITHM_PARAM param44("barTemplate", LP_MAT, QVariant(), QObject::tr(" ")); lpAlgorithm->AddParam(¶m44, 1); LP_ALGORITHM_PARAM param45("weightMat", LP_MAT, QVariant(), QObject::tr(" ")); lpAlgorithm->AddParam(¶m45, 1); LP_ALGORITHM_PARAM param46("baseImage", LP_MAT, QVariant(), QObject::tr(" ")); lpAlgorithm->AddParam(¶m46, 1); LP_ALGORITHM_PARAM param4_1("background", LP_MAT, QVariant(), QObject::tr(" ")); lpAlgorithm->AddParam(¶m4_1, 1); LP_ALGORITHM_PARAM param6("image", LP_IMAGE); lpAlgorithm->AddOutParam(¶m6, 1); LP_ALGORITHM_PARAM param7("score", LP_DOUBLE, 0, QObject::tr("相似度得分")); lpAlgorithm->AddOutParam(¶m7, 1); LP_ALGORITHM_PARAM param8("angle", LP_DOUBLE, 0, QObject::tr("结果角度")); lpAlgorithm->AddOutParam(¶m8, 1); LP_ALGORITHM_PARAM param9("error", LP_INT, 0, QObject::tr("错误类型")); lpAlgorithm->AddOutParam(¶m9, 1); LP_ALGORITHM_PARAM param10("resultTip", LP_STRING, 0, QObject::tr("结果提示")); lpAlgorithm->AddOutParam(¶m10, 1); QString AlgoName = QObject::tr("检测"); QString AlgoName2 = QObject::tr("圆心定位"); QString AlgoName3 = QObject::tr("气门芯标定"); return true; } void LpAlgoNewInstance(IAlgo** lppAlgo) { *lppAlgo = (IAlgo*)new algEg(); } bool LpAlgoDeleteInstance() { return true; }