|
|
|
|
@ -104,8 +104,10 @@ QAlgDetect::~QAlgDetect()
|
|
|
|
|
|
|
|
|
|
#define REAIZE 4
|
|
|
|
|
|
|
|
|
|
void QAlgDetect::detect(QImage img, AlgCallBack func)
|
|
|
|
|
void QAlgDetect::detect(QImage img, QVariantMap param, AlgCallBack func)
|
|
|
|
|
{
|
|
|
|
|
bool bEqual = param.value("equal").toBool();
|
|
|
|
|
|
|
|
|
|
Mat srcImg = QImageToMat(img);
|
|
|
|
|
if(srcImg.channels()!=1)
|
|
|
|
|
cv::cvtColor(srcImg, srcImg, CV_RGB2GRAY);
|
|
|
|
|
@ -115,7 +117,8 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
|
|
|
|
|
cv::resize(src, detectImg, cv::Size(src.cols / REAIZE, src.rows / REAIZE));
|
|
|
|
|
int bBaseX = detectImg.cols;
|
|
|
|
|
int bBaseY = detectImg.rows;
|
|
|
|
|
// equalizeHist(detectImg, detectImg);//根据图像的实际情况使用 图像暗一点不需要,亮一点的需要
|
|
|
|
|
if(bEqual == true)
|
|
|
|
|
equalizeHist(detectImg, detectImg);//根据图像的实际情况使用 图像暗一点不需要,亮一点的需要
|
|
|
|
|
detectImg = _EnhanImg_sharpen(detectImg);
|
|
|
|
|
|
|
|
|
|
EDCircles edcircles(detectImg);
|
|
|
|
|
@ -130,6 +133,8 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
|
|
|
|
|
continue;
|
|
|
|
|
if (EDCircle[i].center.x + EDCircle[i].r > bBaseX || EDCircle[i].center.y + EDCircle[i].r > bBaseY)
|
|
|
|
|
continue;
|
|
|
|
|
if(EDCircle[i].r< 50 )
|
|
|
|
|
continue;
|
|
|
|
|
if (EDCircle[i].r > maxR)
|
|
|
|
|
{
|
|
|
|
|
maxR = EDCircle[i].r;
|
|
|
|
|
@ -147,56 +152,25 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
|
|
|
|
|
centerP.setX(EDCircle[nIndex].center.x * REAIZE);
|
|
|
|
|
centerP.setY(EDCircle[nIndex].center.y * REAIZE);
|
|
|
|
|
double r = radius * REAIZE;
|
|
|
|
|
Mat aa = DetectCircle(srcImg, centerP, r);
|
|
|
|
|
Mat aa = DetectCircle(srcImg, centerP, r, bEqual);
|
|
|
|
|
QImage rltImg = cvMat2QImage(aa);
|
|
|
|
|
if (func) {
|
|
|
|
|
func(rltImg);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (startX > 0 && startY > 0 && hight > 0 \
|
|
|
|
|
&& startX < src.cols &&startY < src.rows \
|
|
|
|
|
&& hight < src.cols&&hight < src.rows \
|
|
|
|
|
&& (startX + hight) < src.cols && (startY + hight) < src.rows)
|
|
|
|
|
{
|
|
|
|
|
Mat cutMat = src(Rect(startX, startY, hight, hight));
|
|
|
|
|
if (cutMat.data != NULL)
|
|
|
|
|
{
|
|
|
|
|
// if (hight < 50)
|
|
|
|
|
// return Mat();
|
|
|
|
|
|
|
|
|
|
// pCircle->ptCenter = center;
|
|
|
|
|
// pCircle->fRadius = radius * REAIZE;
|
|
|
|
|
|
|
|
|
|
//2021-05-10 增加图像大小判断 对超过900像素的图像进行再一次压缩
|
|
|
|
|
if (cutMat.cols >= 900 || cutMat.rows >= 900)
|
|
|
|
|
{
|
|
|
|
|
Mat newCutImg;
|
|
|
|
|
cv::resize(cutMat, newCutImg, cv::Size(cutMat.cols / REAIZE, cutMat.rows / REAIZE));
|
|
|
|
|
// pCircle->fRadius = pCircle->fRadius / REAIZE;
|
|
|
|
|
// return newCutImg;
|
|
|
|
|
|
|
|
|
|
QImage rltImg = cvMat2QImage(newCutImg);
|
|
|
|
|
if (func) {
|
|
|
|
|
func(rltImg);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
QImage rltImg = cvMat2QImage(cutMat);
|
|
|
|
|
QPointF centerP;
|
|
|
|
|
centerP.setX(srcImg.cols/2);
|
|
|
|
|
centerP.setY(srcImg.rows/2);
|
|
|
|
|
double r = 0;
|
|
|
|
|
Mat aa = DetectCircle(srcImg, centerP, r, bEqual);
|
|
|
|
|
QImage rltImg = cvMat2QImage(aa);
|
|
|
|
|
if (func) {
|
|
|
|
|
func(rltImg);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (func)
|
|
|
|
|
{
|
|
|
|
|
@ -205,10 +179,12 @@ void QAlgDetect::detect(QImage img, AlgCallBack func)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Mat QAlgDetect::DetectCircle(Mat img, QPointF center, double radius)
|
|
|
|
|
Mat QAlgDetect::DetectCircle(Mat img, QPointF center, double radius,bool bEqual)
|
|
|
|
|
{
|
|
|
|
|
Mat detectImg;
|
|
|
|
|
//equalizeHist(img, detectImg);
|
|
|
|
|
if(bEqual == true)
|
|
|
|
|
equalizeHist(img, detectImg);
|
|
|
|
|
else
|
|
|
|
|
detectImg = img;
|
|
|
|
|
CircleDetector cd;
|
|
|
|
|
cd.setAlgoType(CircleDetector::PeakCircle);
|
|
|
|
|
@ -237,6 +213,10 @@ Mat QAlgDetect::DetectCircle(Mat img, QPointF center, double radius)
|
|
|
|
|
Rect rect;
|
|
|
|
|
rect.x = cen.x() - r;
|
|
|
|
|
rect.y = cen.y() - r;
|
|
|
|
|
if (rect.x < 0)
|
|
|
|
|
rect.x = 0;
|
|
|
|
|
if (rect.y < 0)
|
|
|
|
|
rect.y = 0;
|
|
|
|
|
rect.width = 2 * r;
|
|
|
|
|
rect.height = 2 * r;
|
|
|
|
|
Mat s = img(rect);
|
|
|
|
|
|