我不知道我写的这个程序是否符合查找缺陷的要求,但是,作为入门,我还是将它放上来。如有错误,还请指出,本人学生,水平有限。https://download.csdn.net/download/yyk219/10700961
首先,缺陷弧的查找,主要工作就是把弧提取出来,然后在进行相关操作来描述它是缺陷还是完美。我的结果是这样的::
void YK_R_R(vector<vector<Point>> &Number, Mat& image, double R_r, int Rec_or_Cir,int flog);
int main()
{
Mat img1 = imread("G:\\yk\\Desktop\\文件\\aI\\opencv\\opencv图\\新建文件夹\\2.bmp", 0);
Mat img2 = Mat::zeros(img1.rows, img1.cols, CV_8UC1);
Mat img3 = Mat::zeros(img1.rows, img1.cols, CV_8UC3);
Mat img4 = Mat::zeros(img1.rows, img1.cols, CV_8UC1);
Mat img5 = Mat::zeros(img1.rows, img1.cols, CV_8UC1);
int v = 0, position = 0;
imshow("2", img1);
for (int i = 0; i < img1.rows; i++)
{
for (int j = 0; j < img1.cols ; j++)
{
// img4.at<uchar>(i, j) = 0;
img3.at<Vec3b>(i, j)[0] = img1.at<uchar>(i, j);
img3.at<Vec3b>(i, j)[1] = img1.at<uchar>(i, j);
img3.at<Vec3b>(i, j)[2] = img1.at<uchar>(i, j);
}
}
for (int i = img1.rows / 2 - 200; i < img1.rows / 2 + 200; i++)
{
for (int j = img1.cols / 2 - 200; j < img1.cols / 2 + 200; j++)
{
if(img1.at<uchar>(i, j)>38)img2.at<uchar>(i, j) = img1.at<uchar>(i, j);
}
}
blur(img2, img2, Size(3, 3));
vector<vector<Point>>conts;
vector<Vec4i>hicouts;
Canny(img2, img2, 30, 70);
findContours(img2, conts, hicouts, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
double sum_X = 0.0, sum_Y = 0.0;
double X = 0.0, Y = 0.0;
for (int i = 0; i < conts.size(); i++)
{
for (int j = 0; j < conts[i].size(); j++)
{
sum_X += conts[i][j].x;
sum_Y += conts[i][j].y;
if (j + 1 >= conts[i].size())
{
X += sum_X / conts[i].size();
Y += sum_Y / conts[i].size();
sum_X = 0;
sum_Y = 0;
}
}
}
X = X / conts.size();
Y = Y / conts.size();
int temp = X, temp1 = Y, temp2 = X, temp3 = Y;
for (int i = 0; i < conts.size(); i++)
{
for (int j = 0; j < conts[i].size(); j++)
{
if (conts[i][j].x < temp)
{
temp = conts[i][j].x;
}
if (conts[i][j].y < temp1)
{
temp1 = conts[i][j].y;
}
if (conts[i][j].x > temp2)
{
temp2 = conts[i][j].x;
}
if (conts[i][j].y > temp3)
{
temp3 = conts[i][j].y;
}
}
}
Point heart((temp + temp2) / 2, (temp1 + temp3) / 2);
YKcircle(img4, heart, 130, 2);
YKcircle(img4, heart, 90, 3);
//Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
for (int i = 0; i < img1.rows; i++)
{
for (int j = 0; j < img1.cols; j++)
{
if (img4.at<uchar>(i, j) == 255)
{
if(img1.at<uchar>(i, j)>30) img5.at<uchar>(i, j) = img1.at<uchar>(i, j);
}
}
}
blur(img5, img5, Size(3, 3));
medianBlur(img5, img5, 9);
Canny(img5, img5, 80, 90);
vector<vector<Point>>contsq;
vector<Vec4i>hicoutsq;
findContours(img5, contsq, hicoutsq, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
double maX = 0.0, max_i = 0.0, max_i1 = 0.0;
int z = 0;
Mat image= Mat::zeros(img1.rows, img1.cols, CV_8UC3);
Mat image1 = Mat::zeros(img1.rows, img1.cols, CV_8UC3);
Mat image2 = Mat::zeros(img1.rows, img1.cols, CV_8UC1);
for (int i = 0; i < contsq.size(); i++)
{
double length = arcLength(contsq[i], true);
double area = contourArea(contsq[i], arcLength(contsq[i], true));
if (contsq[i].size() > maX)
{
maX = contsq[i].size();
max_i = i;
}
if (i + 1 >= contsq.size())
{
drawContours(image, contsq, max_i, Scalar(0, 0, 255), 2, 8, hicoutsq);
}
}
cvtColor(image, image, COLOR_BGR2GRAY);
Mat element1 = getStructuringElement(MORPH_RECT, Size(3, 3));
erode(image, image, element1);
vector<vector<Point>>contsq1;
vector<Vec4i>hicoutsq1;
findContours(image, contsq1, hicoutsq1, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
for(int i=0;i<contsq1.size();i++)
{
drawContours(image1, contsq1, i, Scalar(255, 255, 255), -1, 8, hicoutsq1);
}
cvtColor(image1, image1, COLOR_BGR2GRAY);
Canny(image1, image1, 30, 70);
contsq1.clear();
hicoutsq1.clear();
//imshow("f", image1);
findContours(image1, contsq1, hicoutsq1, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
vector<vector<Point>>hull(contsq1.size());
vector<Moments>MM(contsq1.size());
for (int i = 0; i< contsq1.size(); i++)
{
convexHull(Mat(contsq1[i]), hull[i], true);
MM[i] = moments(contsq1[i], false);
}
vector<Point2f>mc(contsq1.size());
for (int i = 0; i < contsq1.size(); i++)
{
mc[i] = Point2f(MM[i].m10 / MM[i].m00, MM[i].m01 / MM[i].m00);
}
Point heart1(mc[0].x, mc[0].y);
vector<vector<Point>>Number;
vector<Point>number;
number.clear();
for (int i = 0; i < contsq1.size(); i++)
{
for (int j = 0; j < contsq1[i].size()/2; j++)
{
if ((contsq1[i][j].x - heart1.x)*(contsq1[i][j].x - heart1.x) + (contsq1[i][j].y - heart1.y)*(contsq1[i][j].y - heart1.y) < ridu*ridu)
{
v = 0;
number.push_back(contsq1[i][j]);
}
else
{
if (v == 0)
{
Number.push_back(number);
number.clear();
position++;
v++;
}
}
}
}
YK_R_R(Number,img3,0.8400,0,1);
//imwrite("G:\\yk\\Desktop\\3result.bmp", image2);
imshow("1", img3);
waitKey(0);
return 0;
}