精华内容
下载资源
问答
  • OpenCV缺陷检测

    万次阅读 2018-12-06 18:34:30
    OpenCV缺陷检测代码: // An highlighted block #include "head.h" int main() { Mat img = imread("image/1204.bmp"); //assert(im.data); if (!img.data) { cout << "...

    新手上路,欢迎高手指点。
    原图:
    在这里插入图片描述

    OpenCV缺陷检测代码:

    // An highlighted block
    #include "head.h"
    
    int main() {
    	Mat img = imread("image/1204.bmp");
    	//assert(im.data);
    	if (!img.data) { cout << "cuowu!" << endl; return -1; }
    	Mat img_gray; Mat img2;
    	cvtColor(img,img_gray, COLOR_BGR2GRAY);
    	//二值化
    	threshold(img_gray, img2,100, 255, THRESH_BINARY_INV);
    	
    	//形态学处理 闭操作  先膨胀后腐蚀
    	Mat element = getStructuringElement(MORPH_RECT,Size(17, 17));
    	morphologyEx(img2, img2, MORPH_CLOSE, element);
    	
    	//腐蚀
    	Mat element1 = getStructuringElement(MORPH_RECT, Size(3, 1));
    	morphologyEx(img2, img2, MORPH_ERODE, element1);
    	
    	vector<vector<Point> > contours;
    	findContours(img2, contours, RETR_TREE, CHAIN_APPROX_SIMPLE);
    	drawContours(img, contours, -1, Scalar(0, 255, 0), 1, 8);
    	vector<vector<Point> > contours1;
    	for (int i=0; i <= contours.size() - 1; i++) {
    		float area = contourArea(contours[i]);
    		if ((area < 5500&&area>5000)||area>25000) {
    			contours1.push_back(contours[i]);
    		}
    	}
    	string str[2] = { "D","S" };
    	drawContours(img, contours1, -1, Scalar(0, 0, 255), 1, 8);
    	
    	for (int i = 0; i <= contours1.size() - 1; i++) {
    		Rect rect = boundingRect(contours1[i]);
    		rectangle(img, rect, Scalar(0, 0, 255), 1, 8);
    		putText(img,str[i] , Point(rect.x -20+ rect.width / 2, rect.y - 30), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 2);
    	}
    	namedWindow("1");
    	imshow("1", img);
    	namedWindow("2");
    	imshow("2", img_gray);
    	namedWindow("3");
    	imshow("3", img2);
    	waitKey(0);
    	return 0;
    }
    

    结果:
    在这里插入图片描述

    展开全文
  • Python opencv缺陷检测

    多人点赞 热门讨论 2021-04-22 17:52:31
    利用opencv或其他工具编写程序实现缺陷检测。 实现过程 # -*- coding: utf-8 -*- ''' 作者 : 丁毅 开发时间 : 2021/4/21 15:30 ''' import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont ...

    题目描述
    利用opencv或其他工具编写程序实现缺陷检测。


    实现过程

    # -*- coding: utf-8 -*-
    '''
    作者 : 丁毅
    开发时间 : 2021/4/21 15:30
    '''
    import cv2
    import numpy as np
    from PIL import Image, ImageDraw, ImageFont
    import matplotlib.pyplot as plt
    
    
    #用于给图片添加中文字符的函数
    def cv2ImgAddText(img, text, left, top, textColor=(0, 255, 0), textSize=20):
        # 判断是否OpenCV图片类型
        if (isinstance(img, np.ndarray)):
            img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
        # 创建一个可以在给定图像上绘图的对象
        draw = ImageDraw.Draw(img)
        # 字体的格式
        fontStyle=ImageFont.truetype("font/simsun.ttc",textSize, encoding="utf-8")
        # 绘制文本
        draw.text((left, top), text, textColor, font=fontStyle)
        # 转换回OpenCV格式
        return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
    
    # plt绘图显示中文
    plt.rcParams['font.family'] = 'SimHei'
    img0 = cv2.imread(r"C:\Users\pc\Desktop\0.bmp")
    cv2.imshow('img', img0)
    # 彩色图转灰度图
    img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)
    
    # 缺陷检测
    for i in range(1, 6):
        defect_img0 = cv2.imread(r"C:\Users\pc\Desktop\%d.bmp"%i)
        # 获取灰度图像
        defect_img1 = cv2.cvtColor(defect_img0, cv2.COLOR_BGR2GRAY)
        # 获取原图像的灰度直方图
        hist0 = cv2.calcHist([img1], [0], None, [256], [0.0, 255.0])
        # 获取待检测图像的灰度直方图
        hist1 = cv2.calcHist([defect_img1], [0], None, [256], [0.0, 255.0])
        # 为图像添加标题
        plt.title("原图与待检测img%d对比"%i)
        # 添加图例
        plt.plot(hist0, label='原图')
        plt.plot(hist1, label='待检测img%d'%i)
        # 相似度比较
        rst = cv2.compareHist(hist0, hist1, method=cv2.HISTCMP_CORREL)
        # res >= 0.95即认为合格
        cv2.imshow(str(i) + ".img", cv2ImgAddText(defect_img0, "合格" if rst >= 0.95 else "不合格", 20, 20, (255, 0, 0), 25))
        # 设置x轴的数值范围
        plt.xlim([0, 256])
        plt.legend(loc='upper left')
        plt.show()
    cv2.waitKey(0)
    

    运行结果

    原图
    检测1
    检测2
    检测3
    检测4
    检测5

    问题及解决方法
    1.获取原图的直方图
    参考链接
    方式:
    cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])

    • images:输入的图像
    • channels:选择图像的通道
    • mask:是一个大小和image一样的np数组,其中把需要处理的部分指定为1,不需要处理的部分指定为0,一般设置为None,表示处理整幅图像。
    • histSize:使用多少个bin(柱子),一般为256
    • ranges:像素值的范围,一般为[0,255]表示0~255

    该函数结果返回一个二维数组,该数组反应画面中亮度的分布和比例。


    2.比较两个直方图的相似度
    参考链接
    方式:
    cv2.compareHist(H1, H2, method)

    • H1:第一个直方图数组
    • H2:第二个直方图数组(与第一个纬度相同)
    • method:所使用的方式

    该函数返回一个[0,1]的相似度值,值越接近一就表名相似度越高。


    3.相似度参数微调
    由于compareHist函数返回一个[0,1]的值,需要自己调整一个阈值来选取哪些合格,经过调整后,发现阈值取[0.90, 0.95]能够正确选取与实验的结果,代码中取的是0.95,即待检测图与原图之间的相似度如果小于0.95则不合格。


    4.通过plot显示原图与待检测图的关系折线
    参考链接
    通过calcHist函数返回的hist数组值,运用matplotlib绘制原图和待检测图之间的关系折线图。对比两个曲线的差异。

    展开全文
  • openCV缺陷检测学习(一)

    千次阅读 2020-09-30 15:39:57
    《基于OpenCV的PCB元件缺陷检测》-- 郑帅兵,贾小军,季汉华 缺陷检测流程 · 平滑处理 · 图像二值化 · 边缘检测 · 缺陷检测 1.平滑处理 平滑处理也成为模糊处理。通常用来压制,弱化或消除图像中的细节,突变,...

    ·参考论文:

    《基于OpenCV的PCB元件缺陷检测》-- 郑帅兵,贾小军,季汉华

    缺陷检测流程

    · 平滑处理
    · 图像二值化
    · 边缘检测
    · 缺陷检测
    

    1.平滑处理

    平滑处理也成为模糊处理。通常用来压制,弱化或消除图像中的细节,突变,边缘和噪声。

    ·论文中选择使用中值滤波的方法进行平滑处理,因为其对脉冲噪声有较好的滤除作用,且边缘不会被模糊。

    平滑滤波函数:

    void cvSmooth(const CvArr* src,CvArr* dst,int smoothtype = CV_GAUSSIAN,
    		int param1,int param2,double param3,double param4)
    //src:输入图像
    //dst:输出图像
    //CV_BLUR_NO_SCALE(简单不带尺度的模糊)--每个像素的param1*param2领域求和
    //CV_BLUR(simple blur)--对每个像素param1*param2领域求和并做尺度变换1/(param1*param2)(将平均和/个数 放到中心点)
    //CV_GAUSSIAN(guassian blur)--对图像进行核大小为param1*param2的高斯滤波(加权平均和)
    //CV_MEDIAN(median blur)--对图像进行核大小为param1*param1的中值滤波(找中间值代替)
    //param1-平滑操作的第一个参数
    //param2-平滑操作的第二个参数,如果为0,则表示其设定为param1
    //param3--对应高斯参数的标准差,如果param1和2为0,核大小有param3计算
    

    相关知识:

    平滑处理后:
    ·图像经滤波处理后清晰度更高
    ·抽出图像的特征作为图像识别的特征模式

    噪声通常有两种:
    ·椒盐噪声:噪声的幅值基本上相同,但是噪声出现的位置是随机的(中值滤波效果好)
    ·高斯噪声:每一点都存在噪声,但噪声的幅值是随机分布的(用高斯滤波)

    空间滤波技术分类:

    1.平滑滤波:
    主要用来消除噪声,又可以用在提取较大的目标前过滤去除较小的细节或将目标中的小间断连接起来

    2.锐化滤波:
    可增加图像反差,让边缘更加明显。实际应用中,可用于增强图像中被模糊的细节或景物的边缘

    线性滤波原理:
    在这里插入图片描述
    假设有6X6的图像像素点矩阵。卷积过程,3X3的窗口从左到右,从上到下移动,黄色的每个像素点值之和取平均值赋给中心红色像素点作为卷积处理之后的新像素值
    在这里插入图片描述
    常用线性滤波:

    ·高斯滤波:
    高斯滤波是一种线性平滑滤波,适用于消除高斯噪声。

    具体操作: 用一个掩膜扫描图像中每一个像素,用掩膜确定的领域内像素的加权平均灰度值取替代模板中心像素的值。

    高斯滤波在保留信号的条件下减少噪声,**对于抑制服从正态分布的噪声非常有效。**但是在接近边缘处会无效。
    在这里插入图片描述
    二维高斯函数:
    在这里插入图片描述
    API:

    void GaussianBlur(InputArray src,      //输入图像
                 OutputArray dst,    //输出图像
                 Size ksize,       //内核的大小
                 double sigmaX,     //高斯核函数在X方向的标准偏差  
                 double sigmaY=0,    //高斯核函数在Y方向的标准偏差
                 intborderType=BORDER_DEFAULT )  //一般不用管
    

    非线性常用滤波:
    中值滤波:

    将中心像素的值用所有像素值(邻域窗口内)的中间值(不是平均值)替换。

    中值滤波通过选择中间值避免图像孤立噪声点的影响,对脉冲噪声,斑点噪声,椒盐噪声有良好的滤除效果,在一定条件下可以克服线性滤波器带给图像的细节模糊影响。在降噪方面效果也不错

    void medianBlur(InputArray src,OutputArray dst,int ksize)
    

    2.阈值分割:

    通过阈值分割/图像二值化提取有效部分处理,提高缺陷检测的识别精度和准确度

    void cvThreshold(const CvArr* src,CvArr* dst,double threshold,double max_value,int threshold_type)
    

    3.边缘检测:

    实验中采用Canny算子提取边缘
    Canny算子有如下优点:
    1.图像边缘信息的漏检,误检率比较小,整体效果较好
    在这里插入图片描述

    2.实现高精度的定位,location越大越好
    在这里插入图片描述

    3.响应次数最少,保证只有唯一像素点响应

    在这里插入图片描述
    API:

    void cvCanny(const CvArr* image,CvArr* edges,double threshold1.double threshold2,int aperture_size=3)
    
    //threshold:第一个阈值
    //threshold2:第二个阈值
    //aperture_size:算子内核带下
    

    4.瑕疵检测:

    完成了以上步骤后,可以将边缘检测后的PCB元件图像与标准模板PCB图像进行匹配,匹配成功后得到函数的返回值,确定元件是否有缺陷:

    Double cvMatchShapes(const void* object1,const void* object2,int method,double parameter = 0);
    
    //其中:
    //object1:第一个轮廓或灰度图像
    //object2:第二个轮廓或灰度图像
    //method:比较方式有以下三种方法:CV_CONTOUR_MATCH_I1,
    		//CV_CONTOURS_MATCH_I2,CV_CONTOURS_MATCH_I3,
    //Parameter:数值参数,函数匹配完成后会返回一个匹配的数值,表示匹配程度
    

    三种匹配方式分别如下:
    在这里插入图片描述
    在这里插入图片描述

    5.实验注意事项:

    ·模板的选择会影响匹配的结果,如果模板选的太大,对较小的缺陷就会不敏感,太小的话,像素点采集也会不够。实验中采用600<X,Y<1500像素的图像作为模板

    定义一个变量pcbResult,获取函数的返回值。当PCB元件没有缺陷时,pcbResult的值为0,但是实际结果与理论存在一定误差,因此设置临界值为0.2,当值大于0.2时,认为PCB元件存在缺陷

    展开全文
  • 【图像识别与处理】opencv缺陷检测

    千次阅读 2019-02-22 09:01:20
    2.缺陷检测算法 根据不同的需求来进行不同的处理 空洞 这个肯定是像素颜色和周边的不同 建议用阈值分割 然后轮廓检测 褶皱 这个褶皱肯定会有梯度的变化 建议检测边缘 再计算褶皱的梯度信息 划痕 这个和上一个...

    1.啤酒瓶口

    啤酒瓶口是否破损依据:轮廓周长,面积,圆形度,相对圆心距离等.

    2.缺陷检测算法

    根据不同的需求来进行不同的处理

    1. 空洞 这个肯定是像素颜色和周边的不同 建议用阈值分割 然后轮廓检测
    2. 褶皱 这个褶皱肯定会有梯度的变化 建议检测边缘 再计算褶皱的梯度信息
    3. 划痕 这个和上一个问题相似 但是也有不同 应该是梯度的方向和强度不同(一个是凹一个是凸)
    4. 斑点 如果只是点点星星的 opencv里也有很多角点检测算法 比如 surf fast ORB等

    3.管道腐蚀视觉测量图像边缘检测

    利用标准图像和经传统边缘检测算法检测得到的边缘图像作为输入输出
    数据,并用大量数据进行训练,构建了可实现图像边缘检测的 BP 神经网络…用训练好的神经网络实现管道内表面腐蚀图像边缘检测…
    **利用神经网络进行图像边缘检测的关键是训练样本图像的选取和神经网络模型的建立 。**典型的 BP 神经网络的算法流程如图 2 所示。

    4.基于BP神经网路的水果自动识别

    图像数据获取 -> 对比度增强 -> 去噪 -> 二值化处理 - >Sobel算子进行边缘提取以接合断边(弥补二值化后图像中出现的断边,孔洞) - > 形态学算子填充孔洞 -> 标签化处理图像 -> 提取水果的颜色、形状、边缘特征 用200幅水果图像提取上述特征构造训练样本和测试样本,然后利用构造的样本对BP神经网络进行训练和测试

    展开全文
  • opencv材料缺陷检测简单实例

    千次阅读 2020-03-10 19:18:27
    Opencv材料缺陷检测简单实例 先展示原图以及最终结果(蓝色小圈部分为缺陷所在): 基于python语言, windows系统, 传统识别方法 附上代码: import cv2 as cv import numpy as np from matplotlib import pyplot...
  • opencv 轮廓 缺陷检测

    千次阅读 2018-10-17 08:32:11
    1.凸性缺陷 物体与凸壳任何偏差都可以认为是凸性缺陷。 cv.convexityDefects() import cv2 as cv import numpy as np img = cv.imread('star.jpg') img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) ret,thresh = cv....
  • python opencv 图片缺陷检测!

    千次阅读 2020-04-07 14:12:34
    一、利用直方图的方式进行批量的图片缺陷检测(方法简单) 转存失败重新上传取消 二、步骤(完整代码见最后) 2.1灰度转换(将原图和要检测对比的图分开灰度化) 灰度化的作用是因为后面的直方图比较需要以像素...
  • Opencv Python瓶口缺陷检测 这是最近在课程作业中做的小项目,放在这里和大家分享一下。 主要任务 判断瓶口是否完好,寻找瓶口缺陷部分,并将其框出(以下图为例进行演示) 解决步骤 1.通过Hough圆检测,获取瓶口...
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测 Halcon缺陷检测实例转OpenCV实现(三)---凸缺陷检测 Halcon缺陷检测实例转OpenCV实现(四)---同颜色...
  • python-opencv 垫片缺陷检测

    千次阅读 2019-11-21 22:45:15
    # 5.param1 canny检测的双阈值中的高阈值,低阈值是它的一半 # 6.param2 最小投票数(基于圆心的投票数) # 7.minRadius 需要检测圆的最小半径 # 8.maxRadius 需要检测圆的最大半径 circles = cv2 . ...
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)--- PCB印刷缺陷检测 Halcon缺陷检测实例转OpenCV实现(三)-凸缺陷​​检测 Halcon缺陷检测实例转OpenCV实现(四...
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测 Halcon缺陷检测实例转OpenCV实现(三)---凸缺陷检测 本期文章继续介绍缺陷检测专题的第四个案例,用...
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测 本期文章继续介绍缺陷检测专题的第三个案例,用OpenCV实现Halcon中一个物体凸缺陷检测的实例,前两个...
  • python + opencv试纸缺陷检测——思路

    千次阅读 2019-10-24 20:52:05
    用于检测试纸生产线对合格与不合格产品进行分拣,实时检测。 先要对整个区域进行分割,只对研究对象进行处理,是否用ROI? 1)选择数据:将数据分成三组:训练数据、验证数据、测试数据 2)模型数据:使用训练数据来...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 186
精华内容 74
关键字:

opencv缺陷检测