You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.1 KiB
C++

#include "caliCenter.h"
#include "lpbengine.h"
using namespace luffy_base;
CaliCenter::CaliCenter()
{
}
CaliCenter::~CaliCenter()
{
}
cv::Mat createCenterRoi(Mat &src, const Point2f &center, 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 &paramIn, OutputParam &paramOut, 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<Point> vecHits;
luffy_hit::firstHit4Circle(imgBinary, imgHit, vecHits, realCircle.ptCenter, 10, realCircle.fRadius + 100, 60, luffy_hit::emHitIn2Out);
vector<Point> 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;
}