opencv 学习(4)缺陷弧的查找

我不知道我写的这个程序是否符合查找缺陷的要求,但是,作为入门,我还是将它放上来。如有错误,还请指出,本人学生,水平有限。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;
}

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
进行缺陷检测的Opencv机器学习过程中,需要以下几个文件: 1. 数据集文件:数据集文件包含用于训练和测试模型所需的图片或图像样本。这些样本应包含正常和缺陷的图像,以便训练模型能够学习识别和分类缺陷。数据集文件可以是图像文件夹,每个文件夹中包含一类图像,或者是一个CSV文件,其中每行包含图像的路径和对应的标签。 2. 标签文件:在进行机器学习训练时,需要为每个样本提供相应的标签,以指示其是否为正常或缺陷的图像。标签文件可以是一个CSV文件或者在数据集文件的文件夹结构中使用子文件夹来表示不同的类别。 3. 训练配置文件:训练配置文件包含了机器学习算法的参数设置以及训练过程的相关参数。这些参数包括模型选择,训练迭代次数,学习率,损失函数等。根据具体的任务和算法选择不同的配置文件。 4. 模型文件:训练完成后,Opencv机器学习可以输出训练好的模型文件。这个模型文件用于预测和检测新的图像样本中的缺陷。模型文件可以是保存为特定格式(如XML、YAML等)的文件,以便在其他应用程序中使用。 5. 测试集文件:测试集文件包含一部分被隔离出来的用于评估模型性能的图像样本。这些样本不参与训练过程,用于测试训练好的模型的预测准确性,从而评估其缺陷检测能力。 以上是进行Opencv机器学习缺陷检测的主要文件,它们在实际应用中起到了不同的作用,帮助我们训练和使用精确的缺陷检测模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值