|
楼主 |
发表于 2023-10-11 15:59:25
|
显示全部楼层
using System;
using System.Drawing;
using Emgu.CV;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
class Program
{
static void Main(string[] args)
{
// 加载图像
Mat image = CvInvoke.Imread("wafer_cutting_edge.jpg", ImreadModes.Color);
// 转换为灰度图像
Mat gray = new Mat();
CvInvoke.CvtColor(image, gray, ColorConversion.Bgr2Gray);
// 高斯模糊
Mat blur = new Mat();
CvInvoke.GaussianBlur(gray, blur, new Size(5, 5), 0);
// Canny边缘检测
Mat edges = new Mat();
CvInvoke.Canny(blur, edges, 50, 150);
// Hough直线检测
LineSegment2D[] lines = CvInvoke.HoughLinesP(edges, 1, Math.PI / 180, 50, 50, 10);
// 计算缺陷到边的距离
int defectDistanceThreshold = 10; // 设置缺陷到边的距离阈值
foreach (LineSegment2D line in lines)
{
// 计算直线的长度
double lineLength = Math.Sqrt(Math.Pow(line.P1.X - line.P2.X, 2) + Math.Pow(line.P1.Y - line.P2.Y, 2));
// 计算直线的斜率
double slope = (double)(line.P2.Y - line.P1.Y) / (line.P2.X - line.P1.X);
// 计算直线的截距
double intercept = line.P1.Y - slope * line.P1.X;
// 判断左侧缺陷到边的距离是否小于阈值
if (Math.Abs(intercept) < defectDistanceThreshold)
{
Console.WriteLine("Left defect detected!");
}
// 判断右侧缺陷到边的距离是否小于阈值
if (Math.Abs(image.Width - slope * image.Width - intercept) < defectDistanceThreshold)
{
Console.WriteLine("Right defect detected!");
}
}
// 显示结果图像
CvInvoke.Imshow("Result", image);
CvInvoke.WaitKey(0);
CvInvoke.DestroyAllWindows();
}
}
|
|