|
|
#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<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;
|
|
|
}
|