0
点赞
收藏
分享

微信扫一扫

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)


导读

本文将介绍使用OpenCV实现纺织物缺陷检测(脏污、油渍、线条破损缺陷)的详细步骤 + 代码。(来源公众号:OpenCV与AI深度学习)


OpenCV实现纺织物缺陷检测效果


背景介绍

    机器视觉应用场景中缺陷检测的应用是非常广泛的,通常涉及各个行业、各种缺陷类型。今天我们要介绍的是纺织物的缺陷检测,缺陷类型包含脏污油渍线条破损三种,这三种缺陷与LCD屏幕检测的缺陷很相似,处理方法也可借鉴。

详细实现步骤请参考下面文章:

​​实战 | OpenCV实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + Python/C++源码)_Color Space的博客-CSDN博客​​

下面给出对应的OpenCvSharp实现代码与效果:

脏污缺陷

    脏污缺陷图片如下:

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)_计算机视觉

OpenCvSharp脏污检测代码:

/// <summary>
/// 脏污缺陷检测
/// </summary>
/// <param name="img">测试图像</param>
/// <returns>结果图</returns> //也可设置bool类型表示OK或NG
static Mat DirtyDetection(Mat img)
{
Mat result = img.Clone();
Mat gray = new Mat();
Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY);
Cv2.GaussianBlur(gray, gray, new Size(7, 7), 0);
Cv2.Canny(gray, gray, 10, 30);
Point[][] contours; //轮廓查找结果变量
HierarchyIndex[] hierarchy; //轮廓拓扑结构变量

Cv2.FindContours(gray, out contours, out hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxNone);
//Console.WriteLine("contour_size = {0}", contours.Length); //输出轮廓个数

for(int i = 0; i < contours.Length; i++)
{
double length = Cv2.ArcLength(contours[i], true);
if (length >= 1)
Cv2.DrawContours(result, contours, i, new Scalar(0, 0, 255), 2);
}
return result;
}

检测结果:

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)_缺陷检测_02

油污缺陷

    油污缺陷图片如下:

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)_OpenCvSharp_03

OpenCvSharp油污检测代码: 

/// <summary>
/// 油污缺陷检测
/// </summary>
/// <param name="img">测试图像</param>
/// <returns>结果图</returns> //也可设置bool类型表示OK或NG
static Mat OilDetection(Mat img)
{
Mat result = img.Clone();
Mat imgLab = new Mat();
Cv2.CvtColor(img, imgLab, ColorConversionCodes.BGR2Lab);
Mat[] labArray = Cv2.Split(imgLab); //L, a, b
Mat blur = new Mat();
Mat thres = new Mat();
Cv2.GaussianBlur(labArray[2], blur, new Size(3, 3), 0); //b通道
Cv2.Threshold(blur, thres, 130, 255, ThresholdTypes.Binary);
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
Cv2.MorphologyEx(thres, thres, MorphTypes.Open, element, new Point(-1, -1), 1,
BorderTypes.Default, new Scalar());

Point[][] contours; //轮廓查找结果变量
HierarchyIndex[] hierarchy; //轮廓拓扑结构变量

Cv2.FindContours(thres, out contours, out hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxNone);
//Console.WriteLine("contour_size = {0}", contours.Length); //输出轮廓个数

for (int i = 0; i < contours.Length; i++)
{
double area = Cv2.ContourArea(contours[i]);
if (area >= 50)
Cv2.DrawContours(result, contours, i, new Scalar(0, 0, 255), 2);
}
return result;
}

检测结果: 

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)_图像处理_04

线条破损缺陷

    线条破损缺陷图片如下:

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)_图像处理_05

OpenCvSharp线条破损检测代码:  

/// <summary>
/// 线条破损缺陷检测
/// </summary>
/// <param name="img">测试图像</param>
/// <returns>结果图</returns> //也可设置bool类型表示OK或NG
static Mat LineDefectDetection(Mat img)
{
Mat result = img.Clone();
Mat imgLab = new Mat();
Cv2.CvtColor(img, imgLab, ColorConversionCodes.BGR2Lab);
Mat[] labArray = Cv2.Split(imgLab); //L, a, b
Mat blur = new Mat();
Mat edged = new Mat();
Cv2.GaussianBlur(labArray[2], blur, new Size(3, 3), 0); //b通道
Cv2.Canny(blur, edged, 5, 10);
Point[][] contours; //轮廓查找结果变量
HierarchyIndex[] hierarchy; //轮廓拓扑结构变量

Cv2.FindContours(edged, out contours, out hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxNone);
//Console.WriteLine("contour_size = {0}", contours.Length); //输出轮廓个数

for (int i = 0; i < contours.Length; i++)
{
double length = Cv2.ArcLength(contours[i], true);
if (length >= 10)
Cv2.DrawContours(result, contours, i, new Scalar(0, 0, 255), 2);
}
return result;
}

检测结果:  

OpenCvSharp (C# OpenCV)实现纺织物缺陷检测->脏污、油渍、线条破损(详细步骤 + 源码)_缺陷检测_06

 完整源码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using OpenCvSharp;

namespace Defects_Detection
{
class Program
{
/// <summary>
/// 脏污缺陷检测
/// </summary>
/// <param name="img">测试图像</param>
/// <returns>结果图</returns> //也可设置bool类型表示OK或NG
static Mat DirtyDetection(Mat img)
{
Mat result = img.Clone();
Mat gray = new Mat();
Cv2.CvtColor(img, gray, ColorConversionCodes.BGR2GRAY);
Cv2.GaussianBlur(gray, gray, new Size(7, 7), 0);
Cv2.Canny(gray, gray, 10, 30);
Point[][] contours; //轮廓查找结果变量
HierarchyIndex[] hierarchy; //轮廓拓扑结构变量

Cv2.FindContours(gray, out contours, out hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxNone);
//Console.WriteLine("contour_size = {0}", contours.Length); //输出轮廓个数

for(int i = 0; i < contours.Length; i++)
{
double length = Cv2.ArcLength(contours[i], true);
if (length >= 1)
Cv2.DrawContours(result, contours, i, new Scalar(0, 0, 255), 2);
}
return result;
}

/// <summary>
/// 油污缺陷检测
/// </summary>
/// <param name="img">测试图像</param>
/// <returns>结果图</returns> //也可设置bool类型表示OK或NG
static Mat OilDetection(Mat img)
{
Mat result = img.Clone();
Mat imgLab = new Mat();
Cv2.CvtColor(img, imgLab, ColorConversionCodes.BGR2Lab);
Mat[] labArray = Cv2.Split(imgLab); //L, a, b
Mat blur = new Mat();
Mat thres = new Mat();
Cv2.GaussianBlur(labArray[2], blur, new Size(3, 3), 0); //b通道
Cv2.Threshold(blur, thres, 130, 255, ThresholdTypes.Binary);
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(3, 3), new Point(-1, -1));
Cv2.MorphologyEx(thres, thres, MorphTypes.Open, element, new Point(-1, -1), 1,
BorderTypes.Default, new Scalar());

Point[][] contours; //轮廓查找结果变量
HierarchyIndex[] hierarchy; //轮廓拓扑结构变量

Cv2.FindContours(thres, out contours, out hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxNone);
//Console.WriteLine("contour_size = {0}", contours.Length); //输出轮廓个数

for (int i = 0; i < contours.Length; i++)
{
double area = Cv2.ContourArea(contours[i]);
if (area >= 50)
Cv2.DrawContours(result, contours, i, new Scalar(0, 0, 255), 2);
}
return result;
}

/// <summary>
/// 线条破损缺陷检测
/// </summary>
/// <param name="img">测试图像</param>
/// <returns>结果图</returns> //也可设置bool类型表示OK或NG
static Mat LineDefectDetection(Mat img)
{
Mat result = img.Clone();
Mat imgLab = new Mat();
Cv2.CvtColor(img, imgLab, ColorConversionCodes.BGR2Lab);
Mat[] labArray = Cv2.Split(imgLab); //L, a, b
Mat blur = new Mat();
Mat edged = new Mat();
Cv2.GaussianBlur(labArray[2], blur, new Size(3, 3), 0); //b通道
Cv2.Canny(blur, edged, 5, 10);
Point[][] contours; //轮廓查找结果变量
HierarchyIndex[] hierarchy; //轮廓拓扑结构变量

Cv2.FindContours(edged, out contours, out hierarchy, RetrievalModes.External,
ContourApproximationModes.ApproxNone);
//Console.WriteLine("contour_size = {0}", contours.Length); //输出轮廓个数

for (int i = 0; i < contours.Length; i++)
{
double length = Cv2.ArcLength(contours[i], true);
if (length >= 10)
Cv2.DrawContours(result, contours, i, new Scalar(0, 0, 255), 2);
}
return result;
}

static void Main(string[] args)
{
Mat img = Cv2.ImRead("Line.jpg");
if(img.Empty())
{
Console.WriteLine("read image failed, try again!\n");
return;
}
Cv2.ImShow("src", img);
//Mat result = DirtyDetection(img); //脏污缺陷检测
//Mat result = OilDetection(img); //油渍缺陷检测
Mat result = LineDefectDetection(img); //油渍缺陷检测
Cv2.ImShow("result", result);
Cv2.WaitKey();
}
}
}

举报

相关推荐

C# OpenCvSharp 实现迷宫解密

0 条评论