|
|
|
|
@ -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
|
|
|
|
|
{
|
|
|
|
|
//<! cut valve
|
|
|
|
|
//<! cut valve//逆时针计算角度 0点在右侧
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
Rect rbarRoi(barCircleOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * realCircle.fRadius);
|
|
|
|
|
Rect rtRoi(paramOut.nValveOffset - realCircle.fRadius, offset, 2 * realCircle.fRadius, 2 * realCircle.fRadius);
|
|
|
|
|
Rect rbarRoi(barCircleOffset - barCircle.fRadius, offset, 2 * barCircle.fRadius, 2 * valueCircle.fRadius);
|
|
|
|
|
Rect rtRoi(paramOut.nValveOffset - valueCircle.fRadius, offset, 2 * valueCircle.fRadius, 2 * valueCircle.fRadius);
|
|
|
|
|
cutValve(img2Rect, paramOut.imgTemplate, rtRoi, paramIn.nAngleMax);
|
|
|
|
|
cutValve(img2Rect, paramOut.barTemplate, rbarRoi, paramIn.nAngleMax);
|
|
|
|
|
|
|
|
|
|
@ -420,7 +449,7 @@ bool CaliValve::detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut,
|
|
|
|
|
|
|
|
|
|
int interval = luffy_math::mod(paramOut.nValveOffset - barCircleOffset, paramIn.nAngleMax);
|
|
|
|
|
paramOut.withinOffset = interval;
|
|
|
|
|
paramOut.fValveWidth = realCircle.fRadius;
|
|
|
|
|
paramOut.fValveWidth = valueCircle.fRadius;
|
|
|
|
|
paramOut.fValveDis = fRadius;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|