1. 程式人生 > >opencv 學習(4)缺陷弧的查詢

opencv 學習(4)缺陷弧的查詢

我不知道我寫的這個程式是否符合查詢缺陷的要求,但是,作為入門,我還是將它放上來。如有錯誤,還請指出,本人學生,水平有限。

首先,缺陷弧的查詢,主要工作就是把弧提取出來,然後在進行相關操作來描述它是缺陷還是完美。我的結果是這樣的::

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