项目一之零件划痕检测

本文总结了一个项目,旨在通过检测零件侧面和正面的划痕来判断是否合格。侧面检测采用边缘检测算法,包括三通道检测和Sobel、Canny算子的应用。正面检测则更复杂,涉及圆拟合、轮廓提取等步骤,以识别并排除带有划痕的零件。目前存在手动确定圆环的问题,有待进一步优化。
摘要由CSDN通过智能技术生成

    今天总结一下之前做过的一个项目,项目的主要目的是检测零件正面及侧面有无划痕凹槽之类的,如果有则向系统发出一个指令,从而丢弃这个零件。有损坏的零件如下图所示:

 

 

 

 一、侧面检测

    侧面检测比较简单,通过边缘检测算法即可看到零件的划痕。

1、三通道检测

做边缘检测前用了下三通道,代码如下:

 

int main()
{
	Mat srcImage;
	srcImage = imread("1.jpg");
	namedWindow("素材图", WINDOW_NORMAL);
	imshow("素材图", srcImage);

	int bins = 256;
	int hist_size[] = { bins };
	float range[] = { 0, 256 };
	const float* ranges[] = { range };
	MatND redHist, grayHist, blueHist;
	int channels_r[] = { 0 };

	//进行直方图的计算(红色分量部分)
	calcHist(&srcImage, 1, channels_r, Mat(),
	redHist, 1, hist_size, ranges,true, false);

	//进行直方图的计算(绿色分量部分)
	int channels_g[] = { 1 };
	calcHist(&srcImage, 1, channels_g, Mat(),
		grayHist, 1, hist_size, ranges, true, false);

	//进行直方图的计算(蓝色分量部分)
	int channels_b[] = { 2 };
	calcHist(&srcImage, 1, channels_b, Mat(),
		blueHist, 1, hist_size, ranges,true, false);

	//-----------------------绘制出三色直方图------------------------
	//参数准备
	double maxValue_red, maxValue_green, maxValue_blue;
	minMaxLoc(redHist, 0, &maxValue_red, 0, 0);
	minMaxLoc(grayHist, 0, &maxValue_green, 0, 0);
	minMaxLoc(blueHist, 0, &maxValue_blue, 0, 0);
	int scale = 1;
	int histHeight = 256;
	Mat histImage = Mat::zeros(histHeight, bins * 3, CV_8UC3);

	//正式开始绘制
	for (int i = 0; i<bins; i++)
	{
		//参数准备
		float binValue_red = redHist.at<float>(i);
		float binValue_green = grayHist.at<float>(i);
		float binValue_blue = blueHist.at<float>(i);
		int intensity_red = cvRound(binValue_red*histHeight / maxValue_red);  //要绘制的高度
		int intensity_green = cvRound(binValue_green*histHeight / maxValue_green);  //要绘制的高度
		int intensity_blue = cvRound(binValue_blue*histHeight / maxValue_blue);  //要绘制的高度

		//绘制红色分量的直方图
		rectangle(histImage, Point(i*scale, histHeight - 1),Point((i + 1)*scale - 1, 
			histHeight - intensity_red),Scalar(255, 0, 0));
		//绘制绿色分量的直方图
		rectangle(histImage, Point((i + bins)*scale, histHeight - 1),Point((i + bins + 1)*scale - 1, 
			histHeight - intensity_green),Scalar(0, 255, 0));
		//绘制蓝色分量的直方图
		rectangle(histImage, Point((i + bins * 2)*scale, histHeight - 1),Point((i + bins * 2 + 1)*scale - 1,
			histHeight - intensity_blue),Scalar(0, 0, 255));
	}

	//在窗口中显示出绘制好的直方图
	namedWindow("图像的RGB直
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值