开发参考线标定功能

master
bob.pan 5 years ago
parent 7a055b9a1c
commit 0bdcad180b

@ -27,8 +27,10 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
return false; return false;
} }
paramInput.roi = lpAlgorithm->GetParamValue("ROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>(); paramInput.valueROI = lpAlgorithm->GetParamValue("ROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
paramInput.barROI = lpAlgorithm->GetParamValue("barROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>(); paramInput.barROI = lpAlgorithm->GetParamValue("barROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
paramInput.startROI = lpAlgorithm->GetParamValue("StartROI", LP_ROI).value<LP_DETECTOR_ROI_DATA>();
paramInput.barNum = lpAlgorithm->GetParamValue("barNum", LP_INT).toInt(); paramInput.barNum = lpAlgorithm->GetParamValue("barNum", LP_INT).toInt();
paramInput.flagCircle = lpAlgorithm->GetParamValue("flagCircle", LP_INT).toInt(); paramInput.flagCircle = lpAlgorithm->GetParamValue("flagCircle", LP_INT).toInt();
paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", 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"; qWarning() << "cali valve, gray is empty";
return false; return false;
} }
if (gray.size() != paramInput.roi.img.size()) if (gray.size() != paramInput.valueROI.img.size())
{ {
qWarning() << "img size not compare"; qWarning() << "img size not compare";
return false; return false;
@ -92,6 +94,7 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
lpAlgorithm->SetOutParamValue("valveDis", paramOutput.fValveDis); lpAlgorithm->SetOutParamValue("valveDis", paramOutput.fValveDis);
lpAlgorithm->SetOutParamValue("valveWidth", paramOutput.fValveWidth); lpAlgorithm->SetOutParamValue("valveWidth", paramOutput.fValveWidth);
lpAlgorithm->SetOutParamValue("valveOffset", paramOutput.nValveOffset); lpAlgorithm->SetOutParamValue("valveOffset", paramOutput.nValveOffset);
lpAlgorithm->SetOutParamValue("startOffset", paramOutput.nStartOffset);
lpAlgorithm->SetOutParamValue("barTemplate", barImg); lpAlgorithm->SetOutParamValue("barTemplate", barImg);
lpAlgorithm->SetOutParamValue("withinOffset", paramOutput.withinOffset); lpAlgorithm->SetOutParamValue("withinOffset", paramOutput.withinOffset);
lpAlgorithm->SetOutParamValue("barNum", paramInput.barNum); 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("辐条模板")); LP_ALGORITHM_PARAM param3("barROI", LP_ROI, QVariant(), QObject::tr("辐条模板"));
lpAlgorithm->AddParam(&param3, 1); lpAlgorithm->AddParam(&param3, 1);
LP_ALGORITHM_PARAM param_StartROI("StartROI", LP_ROI, QVariant(), QObject::tr("参考线模板"));
lpAlgorithm->AddParam(&param_StartROI, 1);
LP_ALGORITHM_PARAM param4("flagCircle", LP_INT, 0, QObject::tr("无气门芯识别")); LP_ALGORITHM_PARAM param4("flagCircle", LP_INT, 0, QObject::tr("无气门芯识别"));
lpAlgorithm->AddParam(&param4, 1); lpAlgorithm->AddParam(&param4, 1);
@ -175,6 +181,9 @@ bool algEg::Init(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
LP_ALGORITHM_PARAM param21("background", LP_MAT); LP_ALGORITHM_PARAM param21("background", LP_MAT);
lpAlgorithm->AddOutParam(&param21, 1); lpAlgorithm->AddOutParam(&param21, 1);
LP_ALGORITHM_PARAM param_startOffset("startOffset", LP_INT, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param_startOffset, 1);
return true; return true;
} }

@ -320,18 +320,19 @@ bool CaliValve::cutValve(Mat & img2Rect, Mat &imgTemplate, Rect rtCut, int nAngl
} }
bool CaliValve::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst /*= Mat()*/) bool CaliValve::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst /*= Mat()*/)
{ {
Record_List records = paramIn.roi.records; Record_List valueRecords = paramIn.valueROI.records;//气门芯位置
Record_List barRecords = paramIn.barROI.records; Record_List barRecords = paramIn.barROI.records;//
int nCircleCount = records.size(); Record_List startRecords = paramIn.startROI.records;
int valueCircleCount = valueRecords.size();
int barCircleCount = barRecords.size(); int barCircleCount = barRecords.size();
if (nCircleCount == 0 && barCircleCount ==0) { if (valueCircleCount == 0 && barCircleCount ==0) {
return false; return false;
} }
luffy_base::luffyCircle realCircle; luffy_base::luffyCircle valueCircle;
realCircle.ptCenter = Point2f(0, 0); valueCircle.ptCenter = Point2f(0, 0);
realCircle.fRadius = 10000000000000.0; valueCircle.fRadius = 10000000000000.0;
for (int i = 0; i < nCircleCount; i++) { for (int i = 0; i < valueCircleCount; i++) {
Item_List item = records.at(i); Item_List item = valueRecords.at(i);
Feature_List feature = item.at(0); Feature_List feature = item.at(0);
if (1 == feature.first) { if (1 == feature.first) {
@ -342,10 +343,10 @@ bool CaliValve::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut,
} }
Point2f p = Point2f(feature.second.at(0), feature.second.at(1)); Point2f p = Point2f(feature.second.at(0), feature.second.at(1));
float r = abs(feature.second.at(2)); float r = abs(feature.second.at(2));
if (r < realCircle.fRadius) if (r < valueCircle.fRadius)
{ {
realCircle.fRadius = r; valueCircle.fRadius = r;
realCircle.ptCenter = p; valueCircle.ptCenter = p;
} }
continue; continue;
} }
@ -366,41 +367,69 @@ bool CaliValve::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut,
barCircle.fRadius = abs(circleFeature.second.at(2)); barCircle.fRadius = abs(circleFeature.second.at(2));
break; break;
} }
} }
cv::circle(imgDst, realCircle.ptCenter, realCircle.fRadius, LP_COLOR_RED, 2); luffy_base::luffyCircle startCircle;
cv::circle(imgDst, realCircle.ptCenter, 2, LP_COLOR_BLUE, 2); 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, barCircle.fRadius, LP_COLOR_RED, 2);
cv::circle(imgDst, barCircle.ptCenter, 2, LP_COLOR_BLUE, 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); 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 offset = 30;
int nImgHeight = realCircle.fRadius * 2 + 2 * offset; int nImgHeight = valueCircle.fRadius * 2 + 2 * offset;
Mat img2Rect; Mat img2Rect;
luffy_math::polar2rect(imgSrc, img2Rect, paramIn.ptCenter, luffy_math::polar2rect(imgSrc, img2Rect, paramIn.ptCenter, fRadius - nImgHeight / 2, fRadius + nImgHeight / 2, paramIn.nAngleMax);
fRadius - nImgHeight / 2, fRadius + nImgHeight / 2, paramIn.nAngleMax);
if (paramIn.flagCircle > 0) if (paramIn.flagCircle > 0)
{ {
qWarning() << "outPut param flagCircle :" << paramIn.flagCircle; qWarning() << "outPut param flagCircle :" << paramIn.flagCircle;
paramOut.nValveOffset = luffy_math::caculAngle(paramIn.ptCenter, barCircle.ptCenter) / 360.0 * paramIn.nAngleMax; 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); cutValve(img2Rect, paramOut.barTemplate, rTargetRoi, paramIn.nAngleMax);
paramOut.fValveWidth = realCircle.fRadius; paramOut.fValveWidth = valueCircle.fRadius;
paramOut.fValveDis = fRadius; paramOut.fValveDis = fRadius;
paramOut.withinOffset = 0; paramOut.withinOffset = 0;
} }
else else
{ {
//<! cut valve //<! cut valve//逆时针计算角度 0点在右侧
qWarning() << "outPut param flagCircle :" << paramIn.flagCircle; qWarning() << "outPut param flagCircle :" << paramIn.flagCircle;
paramOut.nValveOffset = luffy_math::caculAngle(paramIn.ptCenter, realCircle.ptCenter) / 360.0 * paramIn.nAngleMax; paramOut.nValveOffset = luffy_math::caculAngle(paramIn.ptCenter, valueCircle.ptCenter) / 360.0 * paramIn.nAngleMax;
paramOut.nStartOffset = luffy_math::caculAngle(paramIn.ptCenter, startCircle.ptCenter) / 360.0 * paramIn.nAngleMax;
float barCircleOffset = luffy_math::caculAngle(paramIn.ptCenter, barCircle.ptCenter) / 360 * paramIn.nAngleMax; float barCircleOffset = luffy_math::caculAngle(paramIn.ptCenter, barCircle.ptCenter) / 360 * paramIn.nAngleMax;
Rect rbarRoi(barCircleOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * realCircle.fRadius); Rect rbarRoi(barCircleOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * valueCircle.fRadius);
Rect rtRoi(paramOut.nValveOffset - realCircle.fRadius, offset, 2 * realCircle.fRadius, 2 * realCircle.fRadius); Rect rtRoi(paramOut.nValveOffset - valueCircle.fRadius, offset, 2 * valueCircle.fRadius, 2 * valueCircle.fRadius);
cutValve(img2Rect, paramOut.imgTemplate, rtRoi, paramIn.nAngleMax); cutValve(img2Rect, paramOut.imgTemplate, rtRoi, paramIn.nAngleMax);
cutValve(img2Rect, paramOut.barTemplate, rbarRoi, paramIn.nAngleMax); cutValve(img2Rect, paramOut.barTemplate, rbarRoi, paramIn.nAngleMax);
@ -420,7 +449,7 @@ bool CaliValve::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut,
int interval = luffy_math::mod(paramOut.nValveOffset - barCircleOffset, paramIn.nAngleMax); int interval = luffy_math::mod(paramOut.nValveOffset - barCircleOffset, paramIn.nAngleMax);
paramOut.withinOffset = interval; paramOut.withinOffset = interval;
paramOut.fValveWidth = realCircle.fRadius; paramOut.fValveWidth = valueCircle.fRadius;
paramOut.fValveDis = fRadius; paramOut.fValveDis = fRadius;
} }

@ -7,8 +7,9 @@ using namespace luffy_base;
struct InputParam struct InputParam
{ {
LP_DETECTOR_ROI_DATA roi; LP_DETECTOR_ROI_DATA valueROI;//其门下模板参数
LP_DETECTOR_ROI_DATA barROI; LP_DETECTOR_ROI_DATA barROI;//辐条模板参数
LP_DETECTOR_ROI_DATA startROI;//参考线位置标定参数
int flagCircle; int flagCircle;
Point2f ptCenter; Point2f ptCenter;
@ -24,7 +25,8 @@ struct OutputParam
float fValveDis; float fValveDis;
float fValveWidth; float fValveWidth;
Mat imgTemplate; Mat imgTemplate;
int nValveOffset; int nValveOffset;//气门芯距离圆心坐标系的角度偏移值
int nStartOffset;//参考点距离圆心坐标系的角度偏移值
Mat barTemplate; Mat barTemplate;
int withinOffset; int withinOffset;
int barNum; int barNum;

@ -43,7 +43,8 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
paramInput.cMatchScore = lpAlgorithm->GetParamValue("cMatchScore", LP_DOUBLE).toDouble(); paramInput.cMatchScore = lpAlgorithm->GetParamValue("cMatchScore", LP_DOUBLE).toDouble();
paramInput.wheelType = lpAlgorithm->GetParamValue("wheelType", LP_INT).toInt(); paramInput.wheelType = lpAlgorithm->GetParamValue("wheelType", LP_INT).toInt();
paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt(); paramInput.backgroundThresh = lpAlgorithm->GetParamValue("backgroundThresh", LP_INT).toInt();
Mat mask; Mat gray; Mat mask;
Mat gray;
if (!lpTask->GetTaskInfo()->detectImg.empty()) { if (!lpTask->GetTaskInfo()->detectImg.empty()) {
luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray); luffy_imageProc::createImage(lpTask->GetTaskInfo()->detectImg, gray, luffy_imageProc::emCreateGray);
qDebug() << "luffy_imageProc::createImage"; qDebug() << "luffy_imageProc::createImage";
@ -109,12 +110,13 @@ bool algEg::Exec(IDetectorTask *lpTask, IDetectorAlgorithm* lpAlgorithm)
paramOutput.flag = 1; paramOutput.flag = 1;
} }
} }
paramInput.nValveOffset = lpAlgorithm->GetParamValue("valveOffset", 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.fValveWidth = lpAlgorithm->GetParamValue("valveWidth", LP_DOUBLE).toDouble();
paramInput.fValveDis = lpAlgorithm->GetParamValue("valveDis", LP_DOUBLE).toDouble(); paramInput.fValveDis = lpAlgorithm->GetParamValue("valveDis", LP_DOUBLE).toDouble();
Mat tmp = lpAlgorithm->GetParamValue("valveTemplate", LP_MAT).value<cv::Mat>(); Mat tmp = lpAlgorithm->GetParamValue("valveTemplate", LP_MAT).value<cv::Mat>();
Mat barTemp = lpAlgorithm->GetParamValue("barTemplate", LP_MAT).value<cv::Mat>(); Mat barTemp = lpAlgorithm->GetParamValue("barTemplate", LP_MAT).value<cv::Mat>();
///////
Mat weightMat = lpAlgorithm->GetParamValue("weightMat", LP_MAT).value<cv::Mat>(); Mat weightMat = lpAlgorithm->GetParamValue("weightMat", LP_MAT).value<cv::Mat>();
Mat baseImage = lpAlgorithm->GetParamValue("baseImage", LP_MAT).value<cv::Mat>(); Mat baseImage = lpAlgorithm->GetParamValue("baseImage", LP_MAT).value<cv::Mat>();
int num = lpTask->GetSystemInfoValue("station").toInt(); 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.strResultTip = m_objDetect.genResultTip(paramOutput.strResultTip, paramOutput.nErrorType);
paramOutput.dTime = (double)(cv::getTickCount() - nStart) / cv::getTickFrequency() * 1000.0; paramOutput.dTime = (double)(cv::getTickCount() - nStart) / cv::getTickFrequency() * 1000.0;
m_objDetect.drawResult(mask, paramInput, paramOutput); m_objDetect.drawResult(mask, paramInput, paramOutput);
m_objDetect.saveResult(gray, paramInput, paramOutput, strObj); m_objDetect.saveResult(gray, paramInput, paramOutput, strObj);
lpAlgorithm->SetOutParamValue("image", EngineBase::convMat2QImage(mask)); 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(" ")); LP_ALGORITHM_PARAM param13("valveOffset", LP_INT, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param13, 1); lpAlgorithm->AddParam(&param13, 1);
LP_ALGORITHM_PARAM param_start("startOffset", LP_INT, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param_start, 1);
LP_ALGORITHM_PARAM param23("valveWidth", LP_DOUBLE, 0, QObject::tr(" ")); LP_ALGORITHM_PARAM param23("valveWidth", LP_DOUBLE, 0, QObject::tr(" "));
lpAlgorithm->AddParam(&param23, 1); lpAlgorithm->AddParam(&param23, 1);

@ -110,6 +110,7 @@ Point getNextMinMax(Mat *img, Point maxLoc, double minVal, InputParam InputParam
minMaxLoc(*img, &minValue, &maxValue, &iminLoc, &imaxLoc); minMaxLoc(*img, &minValue, &maxValue, &iminLoc, &imaxLoc);
return imaxLoc; return imaxLoc;
} }
void findCandidateValsInMat(const Mat &_img, vector<Point> &canPoints, InputParam InputParameter) void findCandidateValsInMat(const Mat &_img, vector<Point> &canPoints, InputParam InputParameter)
{ {
Mat result = _img.clone(); Mat result = _img.clone();
@ -770,9 +771,6 @@ cv::Point2f ValveDetector::getCenterPoints(Mat &_Img, const Mat &centerTempl, In
cv::circle(rst, Point(newCenterX, newCenterY), 3, Scalar(255), -1);*/ cv::circle(rst, Point(newCenterX, newCenterY), 3, Scalar(255), -1);*/
return Point2f(newCenterX, newCenterY); return Point2f(newCenterX, newCenterY);
} }
} }
cv::Mat ValveDetector::getForeImage(const Mat & src, const Mat &backgroundImg) 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)); cv::resize(dst, dst, cv::Size(nWidth, nWidth));
} }
} }
return dst; return dst;
} }
@ -1247,7 +1244,6 @@ bool imageRotateMatch(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut,
bool ValveDetector::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst /*= Mat()*/) bool ValveDetector::detect(Mat & imgSrc, InputParam &paramIn, OutputParam &paramOut, Mat &imgDst /*= Mat()*/)
{ {
int rtWidth = 100; int rtWidth = 100;
if (paramIn.ptCenter.x - rtWidth < 0 || paramIn.ptCenter.y - rtWidth < 0) if (paramIn.ptCenter.x - rtWidth < 0 || paramIn.ptCenter.y - rtWidth < 0)
return false; return false;

@ -13,6 +13,7 @@ struct InputParam
QString strObj; QString strObj;
Mat imgTemplate; //ÆøÃÅоģ°å Mat imgTemplate; //ÆøÃÅоģ°å
int nValveOffset; int nValveOffset;
int nStartOffset;
float fValveWidth; float fValveWidth;
float fValveDis; float fValveDis;
Point2f ptCenter; Point2f ptCenter;
@ -35,7 +36,6 @@ struct InputParam
Mat weightMat; Mat weightMat;
double cMatchScore; double cMatchScore;
int wheelType; int wheelType;
}; };
struct OutputParam struct OutputParam

Loading…
Cancel
Save