#include #include #include #include "ED.h" #include "EDLines.h" #include "EDCircles.h" #include #include "core.hpp" using namespace std; using namespace cv; int main() { Mat SrcImg = imread("C:\\Users\\Administrator\\Desktop\\Source(7)\\Image_20211224182012613.bmp", 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 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 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); }