From 0bdcad180b424ee87379839e007d16ce831481ce Mon Sep 17 00:00:00 2001 From: "bob.pan" Date: Wed, 18 Aug 2021 18:36:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=8F=82=E8=80=83=E7=BA=BF?= =?UTF-8?q?=E6=A0=87=E5=AE=9A=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tpvs17/caliValve/algEg.cpp | 13 +++- tpvs17/caliValve/caliValve.cpp | 83 +++++++++++++++++--------- tpvs17/caliValve/caliValve.h | 8 ++- tpvs17/valveDetector/algEg.cpp | 11 +++- tpvs17/valveDetector/valveDetector.cpp | 6 +- tpvs17/valveDetector/valveDetector.h | 2 +- 6 files changed, 83 insertions(+), 40 deletions(-) diff --git a/tpvs17/caliValve/algEg.cpp b/tpvs17/caliValve/algEg.cpp index cca0e7e..7ff0729 100644 --- a/tpvs17/caliValve/algEg.cpp +++ b/tpvs17/caliValve/algEg.cpp @@ -27,8 +27,10 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) return false; } - paramInput.roi = lpAlgorithm->GetParamValue("ROI", LP_ROI).value(); + paramInput.valueROI = lpAlgorithm->GetParamValue("ROI", LP_ROI).value(); paramInput.barROI = lpAlgorithm->GetParamValue("barROI", LP_ROI).value(); + paramInput.startROI = lpAlgorithm->GetParamValue("StartROI", LP_ROI).value(); + paramInput.barNum = lpAlgorithm->GetParamValue("barNum", LP_INT).toInt(); paramInput.flagCircle = lpAlgorithm->GetParamValue("flagCircle", LP_INT).toInt(); paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt(); @@ -51,7 +53,7 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) qWarning() << "cali valve, gray is empty"; return false; } - if (gray.size() != paramInput.roi.img.size()) + if (gray.size() != paramInput.valueROI.img.size()) { qWarning() << "img size not compare"; return false; @@ -92,6 +94,7 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) lpAlgorithm->SetOutParamValue("valveDis", paramOutput.fValveDis); lpAlgorithm->SetOutParamValue("valveWidth", paramOutput.fValveWidth); lpAlgorithm->SetOutParamValue("valveOffset", paramOutput.nValveOffset); + lpAlgorithm->SetOutParamValue("startOffset", paramOutput.nStartOffset); lpAlgorithm->SetOutParamValue("barTemplate", barImg); lpAlgorithm->SetOutParamValue("withinOffset", paramOutput.withinOffset); lpAlgorithm->SetOutParamValue("barNum", paramInput.barNum); @@ -113,6 +116,9 @@ bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) LP_ALGORITHM_PARAM param3("barROI", LP_ROI, QVariant(), QObject::tr("辐条模板")); lpAlgorithm->AddParam(¶m3, 1); + LP_ALGORITHM_PARAM param_StartROI("StartROI", LP_ROI, QVariant(), QObject::tr("参考线模板")); + lpAlgorithm->AddParam(¶m_StartROI, 1); + LP_ALGORITHM_PARAM param4("flagCircle", LP_INT, 0, QObject::tr("无气门芯识别")); lpAlgorithm->AddParam(¶m4, 1); @@ -175,6 +181,9 @@ bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) LP_ALGORITHM_PARAM param21("background", LP_MAT); lpAlgorithm->AddOutParam(¶m21, 1); + LP_ALGORITHM_PARAM param_startOffset("startOffset", LP_INT, 0, QObject::tr(" ")); + lpAlgorithm->AddParam(¶m_startOffset, 1); + return true; } diff --git a/tpvs17/caliValve/caliValve.cpp b/tpvs17/caliValve/caliValve.cpp index e8b3ae0..6ff2d2f 100644 --- a/tpvs17/caliValve/caliValve.cpp +++ b/tpvs17/caliValve/caliValve.cpp @@ -320,18 +320,19 @@ bool CaliValve::cutValve(Mat & img2Rect, Mat &imgTemplate, Rect rtCut, int nAngl } bool CaliValve::detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, Mat &imgDst /*= Mat()*/) { - Record_List records = paramIn.roi.records; - Record_List barRecords = paramIn.barROI.records; - int nCircleCount = records.size(); + Record_List valueRecords = paramIn.valueROI.records;//оλ + Record_List barRecords = paramIn.barROI.records;// + Record_List startRecords = paramIn.startROI.records; + int valueCircleCount = valueRecords.size(); int barCircleCount = barRecords.size(); - if (nCircleCount == 0 && barCircleCount ==0) { + if (valueCircleCount == 0 && barCircleCount ==0) { return false; } - luffy_base::luffyCircle realCircle; - realCircle.ptCenter = Point2f(0, 0); - realCircle.fRadius = 10000000000000.0; - for (int i = 0; i < nCircleCount; i++) { - Item_List item = records.at(i); + luffy_base::luffyCircle valueCircle; + valueCircle.ptCenter = Point2f(0, 0); + valueCircle.fRadius = 10000000000000.0; + for (int i = 0; i < valueCircleCount; i++) { + Item_List item = valueRecords.at(i); Feature_List feature = item.at(0); if (1 == feature.first) { @@ -342,10 +343,10 @@ bool CaliValve::detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, } Point2f p = Point2f(feature.second.at(0), feature.second.at(1)); float r = abs(feature.second.at(2)); - if (r < realCircle.fRadius) + if (r < valueCircle.fRadius) { - realCircle.fRadius = r; - realCircle.ptCenter = p; + valueCircle.fRadius = r; + valueCircle.ptCenter = p; } continue; } @@ -366,41 +367,69 @@ bool CaliValve::detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, barCircle.fRadius = abs(circleFeature.second.at(2)); break; } + } - cv::circle(imgDst, realCircle.ptCenter, realCircle.fRadius, LP_COLOR_RED, 2); - cv::circle(imgDst, realCircle.ptCenter, 2, LP_COLOR_BLUE, 2); + luffy_base::luffyCircle startCircle; + int startCircleCount = startRecords.size(); + for (int i = 0; i < startCircleCount; i++) { + Item_List circleItem = startRecords.at(i); + Feature_List circleFeature = circleItem.at(0); + + if (1 == circleFeature.first) { + int size = circleFeature.second.size(); + if (size < 3) + { + continue; + } + startCircle.ptCenter = Point2f(circleFeature.second.at(0), circleFeature.second.at(1)); + startCircle.fRadius = abs(circleFeature.second.at(2)); + break; + } + + } + //о궨Բ + cv::circle(imgDst, valueCircle.ptCenter, valueCircle.fRadius, LP_COLOR_RED, 2); + cv::circle(imgDst, valueCircle.ptCenter, 2, LP_COLOR_BLUE, 2); + //Ʒ궨Բ cv::circle(imgDst, barCircle.ptCenter, barCircle.fRadius, LP_COLOR_RED, 2); cv::circle(imgDst, barCircle.ptCenter, 2, LP_COLOR_BLUE, 2); + //ƲοԲ + cv::line(imgDst,cv::Point(startCircle.ptCenter.x- startCircle.fRadius,startCircle.ptCenter.y), cv::Point(startCircle.ptCenter.x+ startCircle.fRadius, startCircle.ptCenter.y),LP_COLOR_BLUE, 2); + cv::line(imgDst, cv::Point(startCircle.ptCenter.x, startCircle.ptCenter.y - startCircle.fRadius), cv::Point(startCircle.ptCenter.x, startCircle.ptCenter.y + startCircle.fRadius), LP_COLOR_BLUE, 2); + cv::circle(imgDst, startCircle.ptCenter, startCircle.fRadius, LP_COLOR_GREEN, 2); + cv::circle(imgDst, startCircle.ptCenter, 2, LP_COLOR_GREEN, 2); + //ƲοԲĵֱ + cv::line(imgDst, startCircle.ptCenter, paramIn.ptCenter, LP_COLOR_GREEN, 2); + //Բĵ cv::circle(imgDst, paramIn.ptCenter, 2, LP_COLOR_RED, 2); - - float fRadius = luffy_math::disofPoints(realCircle.ptCenter, paramIn.ptCenter); + //оеԲеľ + float fRadius = luffy_math::disofPoints(valueCircle.ptCenter, paramIn.ptCenter); int offset = 30; - int nImgHeight = realCircle.fRadius * 2 + 2 * offset; + int nImgHeight = valueCircle.fRadius * 2 + 2 * offset; Mat img2Rect; - luffy_math::polar2rect(imgSrc, img2Rect, paramIn.ptCenter, - fRadius - nImgHeight / 2, fRadius + nImgHeight / 2, paramIn.nAngleMax); - + luffy_math::polar2rect(imgSrc, img2Rect, paramIn.ptCenter, fRadius - nImgHeight / 2, fRadius + nImgHeight / 2, paramIn.nAngleMax); if (paramIn.flagCircle > 0) { qWarning() << "outPut param flagCircle :" << paramIn.flagCircle; paramOut.nValveOffset = luffy_math::caculAngle(paramIn.ptCenter, barCircle.ptCenter) / 360.0 * paramIn.nAngleMax; - Rect rTargetRoi(paramOut.nValveOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * realCircle.fRadius); + Rect rTargetRoi(paramOut.nValveOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * valueCircle.fRadius); cutValve(img2Rect, paramOut.barTemplate, rTargetRoi, paramIn.nAngleMax); - paramOut.fValveWidth = realCircle.fRadius; + paramOut.fValveWidth = valueCircle.fRadius; paramOut.fValveDis = fRadius; paramOut.withinOffset = 0; } else { - //GetParamValue("cMatchScore", LP_DOUBLE).toDouble(); paramInput.wheelType = lpAlgorithm->GetParamValue("wheelType", LP_INT).toInt(); paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt(); - Mat mask; Mat gray; + Mat mask; + Mat gray; if (!lpTask->GetTaskInfo()->detectImg.empty()) { luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray); qDebug() << "luffy_imageProc::createImage"; @@ -109,12 +110,13 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) paramOutput.flag = 1; } } + 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(); 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(); @@ -195,6 +197,8 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) 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)); @@ -254,6 +258,9 @@ bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm) 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); diff --git a/tpvs17/valveDetector/valveDetector.cpp b/tpvs17/valveDetector/valveDetector.cpp index c3fa398..89ecf40 100644 --- a/tpvs17/valveDetector/valveDetector.cpp +++ b/tpvs17/valveDetector/valveDetector.cpp @@ -110,6 +110,7 @@ Point getNextMinMax(Mat *img, Point maxLoc, double minVal, InputParam InputParam minMaxLoc(*img, &minValue, &maxValue, &iminLoc, &imaxLoc); return imaxLoc; } + void findCandidateValsInMat(const Mat &_img, vector &canPoints, InputParam InputParameter) { Mat result = _img.clone(); @@ -770,9 +771,6 @@ cv::Point2f ValveDetector::getCenterPoints(Mat &_Img, const Mat ¢erTempl, In cv::circle(rst, Point(newCenterX, newCenterY), 3, Scalar(255), -1);*/ return Point2f(newCenterX, newCenterY); } - - - } cv::Mat ValveDetector::getForeImage(const Mat & src, const Mat &backgroundImg) @@ -887,7 +885,6 @@ cv::Mat ValveDetector::findCircleObject(const Mat &src, const Mat& backgroundImg cv::resize(dst, dst, cv::Size(nWidth, nWidth)); } } - return dst; } @@ -1247,7 +1244,6 @@ bool imageRotateMatch(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, bool ValveDetector::detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, Mat &imgDst /*= Mat()*/) { - int rtWidth = 100; if (paramIn.ptCenter.x - rtWidth < 0 || paramIn.ptCenter.y - rtWidth < 0) return false; diff --git a/tpvs17/valveDetector/valveDetector.h b/tpvs17/valveDetector/valveDetector.h index dd1ba9e..100391e 100644 --- a/tpvs17/valveDetector/valveDetector.h +++ b/tpvs17/valveDetector/valveDetector.h @@ -13,6 +13,7 @@ struct InputParam QString strObj; Mat imgTemplate; //оģ int nValveOffset; + int nStartOffset; float fValveWidth; float fValveDis; Point2f ptCenter; @@ -35,7 +36,6 @@ struct InputParam Mat weightMat; double cMatchScore; int wheelType; - }; struct OutputParam