#include "caliCenter.h" #include "lpbengine.h" using namespace luffy_base; CaliCenter::CaliCenter() { } CaliCenter::~CaliCenter() { } cv::Mat createCenterRoi(Mat &src, const Point2f ¢er, const float & radius) { Mat srcImg = src.clone(); //Mat centerMask(srcImg.size(), src.type(), Scalar::all(0)); if ((center.x - radius) < 0 || (center.y - radius) < 0 || (center.x - radius + 2 * radius) > srcImg.cols || (center.y - radius + 2 * radius) > srcImg.rows) return Mat(); return srcImg(Rect(center.x - radius, center.y - radius, 2*radius, 2*radius)); } bool CaliCenter::detect(Mat & imgSrc, InputParam ¶mIn, OutputParam ¶mOut, Mat &imgDst /*= Mat()*/) { Record_List records = paramIn.roi.records; int nCircleCount = records.size(); if (nCircleCount == 0) { qWarning() << "no circle count"; return false; } if (nCircleCount >= 2) { qWarning() << "circle count is more than 1"; } luffy_base::luffyCircle realCircle; for (int i = 0; i < nCircleCount; i++) { Item_List item = records.at(i); Feature_List feature = item.at(0); if (1 == feature.first) { realCircle.ptCenter = Point2f(feature.second.at(0), feature.second.at(1)); realCircle.fRadius = feature.second.at(2); break; } } //bob add abs() fRadius会出现负数 realCircle.fRadius = abs(realCircle.fRadius); Mat centerRoi = createCenterRoi(imgSrc, realCircle.ptCenter, realCircle.fRadius); paramOut.centerRoi = centerRoi; /*Mat imgBinary; cv::threshold(imgSrc, imgBinary, paramIn.nGray, 255.0, THRESH_BINARY); Mat imgHit; vector vecHits; luffy_hit::firstHit4Circle(imgBinary, imgHit, vecHits, realCircle.ptCenter, 10, realCircle.fRadius + 100, 60, luffy_hit::emHitIn2Out); vector vecRes = luffy_imageProc::fitModelbyRansac(vecHits, luffy_imageProc::emModelCircle, 0.4, 3, 20, 20, 30); luffy_imageProc::lsCircleFit(vecRes, realCircle.fRadius, realCircle.ptCenter);*/ paramOut.ptCenter = realCircle.ptCenter; if (!imgDst.empty()) { cv::circle(imgDst, realCircle.ptCenter, realCircle.fRadius, LP_COLOR_RED, 2); cv::circle(imgDst, realCircle.ptCenter, 5, LP_COLOR_BLUE, -1); } return true; }