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.

92 lines
3.0 KiB
C++

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