皮革表面划痕检测是质量控制中的重要环节,利用计算机视觉技术能够快速、精准地识别皮革表面的缺陷。本文将详细讲解如何通过OpenCVSharp实现皮革划痕的自动检测。
实现方案
环境准备
首先,确保安装以下NuGet包:
- OpenCvSharp4
- OpenCvSharp4.Windows

完整代码实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
namespace AppScratchInspection
{
publicclass LeatherScratchDetector
{
/// <summary>
/// 显示图像处理的每个阶段
/// </summary>
/// <param name="imagePath">皮革图像路径</param>
public void DetectScratchWithVisualization(string imagePath)
{
// 读取原始图像
Mat originalImage = Cv2.ImRead(imagePath, ImreadModes.Color);
ShowImage("原始图像", originalImage);
// 图像预处理:转换为灰度图
Mat grayImage = new Mat();
Cv2.CvtColor(originalImage, grayImage, ColorConversionCodes.BGR2GRAY);
ShowImage("灰度图", grayImage);
// 图像去噪
Mat denoiseImage = new Mat();
Cv2.GaussianBlur(grayImage, denoiseImage, new Size(3, 3), 0);
ShowImage("去噪图像", denoiseImage);
// 边缘检测(使用Canny算法)
Mat edges = new Mat();
Cv2.Canny(denoiseImage, edges, 50, 90);
ShowImage("边缘检测", edges);
// 形态学操作:膨胀和腐蚀,突出划痕特征
Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(11, 11));
Mat dilatedEdges = new Mat();
Cv2.Dilate(edges, dilatedEdges, kernel, iterations: 2);
ShowImage("膨胀处理", dilatedEdges);
// 查找轮廓
Point[][] contours;
HierarchyIndex[] hierarchies;
Cv2.FindContours(dilatedEdges, out contours, out hierarchies,
RetrievalModes.External,
ContourApproximationModes.ApproxSimple);
// 过滤和分析轮廓(划痕)
List<Point[]> scratches = new List<Point[]>();
Mat contourImage = originalImage.Clone();
foreach (var contour in contours)
{
double area = Cv2.ContourArea(contour);
// 根据面积和形状过滤可能的划痕
if (area > 50)
{
double perimeter = Cv2.ArcLength(contour, true);
double ratio = 4 * Math.PI * area / (perimeter * perimeter);
// 长条状特征判断
if (ratio < 0.5)
{
scratches.Add(contour);
// 绘制每个检测到的轮廓
Cv2.DrawContours(contourImage, new Point[][] { contour }, -1,
Scalar.Red, 2);
}
}
}
// 显示最终结果
ShowImage("划痕检测结果", contourImage);
// 输出划痕数量
Console.WriteLine($"检测到 {scratches.Count} 个划痕");
}
/// <summary>
/// 封装图像窗口显示方法
/// </summary>
/// <param name="windowName">窗口名称</param>
/// <param name="image">待显示图像</param>
private void ShowImage(string windowName, Mat image)
{
// 调整图像大小以适应屏幕
Mat resizedImage = new Mat();
Cv2.Resize(image, resizedImage, new Size(640, 480));
// 显示窗口
Cv2.ImShow(windowName, resizedImage);
// 等待按键
Cv2.WaitKey(1000); // 每个窗口停留1秒
}
}
}
调用
using OpenCvSharp;
namespace AppScratchInspection
{
internal class Program
{
static void Main(string[] args)
{
var detector = new LeatherScratchDetector();
detector.DetectScratchWithVisualization("example.jpeg");
// 保持最后一个窗口直到用户关闭
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}

Cv2.Canny 函数参数
void Cv2.Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false);
参数说明
示例
在您的代码中,您使用的参数如下:
Cv2.Canny(denoiseImage, edges, 50, 90);
这意味着:
- 任何梯度低于50的点将被抛弃;
- 任何梯度超过90的点将被标记为边缘;
- 凡是介于50和90之间的点,只有当它与一个标记为边缘的点相连时,才会被视为边缘。
注意
- 根据实际产品表面特征调整参数
- 光照和拍摄条件会影响检测效果
- 建议采集大量样本进行算法训练和优化
结语
通过OpenCVSharp,我们可以构建一个高效的产品表面划痕检测系统。结合计算机视觉技术和实际工业需求,可以显著提高产品质量检测的准确性和效率。
阅读原文:原文链接
该文章在 2025/3/24 17:01:33 编辑过