|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
#include <opencv2/opencv.hpp>
|
|
|
|
|
|
#include <opencv2/opencv_modules.hpp>
|
|
|
|
|
|
#include "ED.h"
|
|
|
|
|
|
#include "EDLines.h"
|
|
|
|
|
|
#include "EDCircles.h"
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
#include "core.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
|
using namespace cv;
|
|
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
|
{
|
|
|
|
|
|
Mat SrcImg = imread("F:\\LeaperProject\\1EDCircle\\Source\\NG_223_79_041835877.png", 1); //要注意读入图片的通道数量
|
|
|
|
|
|
if (SrcImg.empty())//要判断是否读取成功
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("Could not load image.");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (SrcImg.channels() != 1)//转成灰度图,确保是一张灰度图
|
|
|
|
|
|
cvtColor(SrcImg, SrcImg, COLOR_BGR2GRAY);
|
|
|
|
|
|
int Channel = SrcImg.channels();//当前一个像素是几个通道(字节)
|
|
|
|
|
|
resize(SrcImg, SrcImg,Size(SrcImg.cols / 2,SrcImg.rows/2));
|
|
|
|
|
|
cv::Scalar mu, sigma;
|
|
|
|
|
|
cv::meanStdDev(SrcImg, mu, sigma);
|
|
|
|
|
|
|
|
|
|
|
|
double val = mu.val[0];
|
|
|
|
|
|
double rate = (100 - val)*2.0 / 100;
|
|
|
|
|
|
SrcImg = SrcImg + 1.5 * SrcImg;
|
|
|
|
|
|
|
|
|
|
|
|
cv::meanStdDev(SrcImg, mu, sigma);
|
|
|
|
|
|
double val2 = mu.val[0];
|
|
|
|
|
|
|
|
|
|
|
|
blur(SrcImg, SrcImg, Size(3,3));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// DWORD start_time1 = GetTickCount();
|
|
|
|
|
|
// vector<Vec3f> HoughCircle;
|
|
|
|
|
|
// HoughCircles(SrcImg, HoughCircle, HOUGH_GRADIENT, 1, 50, 150, 120, 0,0);
|
|
|
|
|
|
// DWORD end_time1 = GetTickCount();
|
|
|
|
|
|
// cout << "The HoughCircle run time is:" << (end_time1 - start_time1) << "ms!" << endl;//输出运行时间
|
|
|
|
|
|
// Mat HoughCircleImg(SrcImg.size(), CV_8UC(Channel), Scalar(0));//定义一张画布,用于画圆,颜色初始化为黑
|
|
|
|
|
|
// for (int i = 0; i < HoughCircle.size(); i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// Point center(round(HoughCircle[i][0]), round(HoughCircle[i][1]));//提取出圆心坐标
|
|
|
|
|
|
// int radius = round(HoughCircle[i][2]); //提取出圆半径
|
|
|
|
|
|
// circle(HoughCircleImg, center, radius, Scalar(255));
|
|
|
|
|
|
//
|
|
|
|
|
|
// Mat cutMat = SrcImg(Rect(center.x - radius, center.y - radius, 2 * radius, 2 * radius));
|
|
|
|
|
|
// if (cutMat.data != NULL)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// namedWindow("CutImg", WINDOW_AUTOSIZE);
|
|
|
|
|
|
// imshow("CutImg", cutMat);
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// namedWindow("HoughCircleImg", WINDOW_AUTOSIZE);
|
|
|
|
|
|
// imshow("HoughCircleImg", HoughCircleImg);
|
|
|
|
|
|
|
|
|
|
|
|
DWORD start_time2 = GetTickCount();
|
|
|
|
|
|
EDCircles edcircles(SrcImg);
|
|
|
|
|
|
DWORD end_time2 = GetTickCount();
|
|
|
|
|
|
cout << "The EDCircle run time is:" << (end_time2 - start_time2) << "ms!" << endl;//输出运行时间
|
|
|
|
|
|
vector<mCircle> EDCircle = edcircles.getCircles();
|
|
|
|
|
|
Mat EDCircleImg(SrcImg.size(), CV_8UC(Channel),Scalar(0));//定义一张画布,用于画圆,颜色初始化为黑
|
|
|
|
|
|
double maxR = 0;
|
|
|
|
|
|
int nIndex = -1;
|
|
|
|
|
|
for (int i = 0; i < EDCircle.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (EDCircle[i].r > maxR)
|
|
|
|
|
|
{
|
|
|
|
|
|
maxR = EDCircle[i].r;
|
|
|
|
|
|
nIndex = i;
|
|
|
|
|
|
}
|
|
|
|
|
|
circle(EDCircleImg, EDCircle[i].center, EDCircle[i].r, Scalar(255));
|
|
|
|
|
|
}
|
|
|
|
|
|
if (nIndex != -1)
|
|
|
|
|
|
{
|
|
|
|
|
|
Mat cutMat = SrcImg(Rect(EDCircle[nIndex].center.x - EDCircle[nIndex].r, EDCircle[nIndex].center.y - EDCircle[nIndex].r, 2 * EDCircle[nIndex].r, 2 * EDCircle[nIndex].r));
|
|
|
|
|
|
if (cutMat.data != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
namedWindow("CutImg", WINDOW_AUTOSIZE);
|
|
|
|
|
|
imshow("CutImg", cutMat);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
namedWindow("EDCircleImg", WINDOW_AUTOSIZE);
|
|
|
|
|
|
imshow("EDCircleImg", EDCircleImg);
|
|
|
|
|
|
|
|
|
|
|
|
waitKey(0);
|
|
|
|
|
|
}
|