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

    千次阅读 2019-07-16 14:38:33
    用于表面缺陷检测,判定产品的良率、是否合格等。 介绍: gray_opening_shape(开运算)/gray_closing_shape(闭运算) Image (input_object) Image for which the minimum gray values are to be ...

    简介:

                用于表面缺陷的检测,判定产品的良率、是否合格等。

     

    介绍:

    gray_opening_shape(开运算)/gray_closing_shape(闭运算)
    Image (input_object)  Image for which the minimum gray values are to be calculated. 灰度图像
    ImageOpening(output_object)  Image containing the minimum gray values. 输出的灰色图像
    MaskHeight (input_control) Height of the filter mask.
    Default value: 11
    Suggested values: 3, 5, 7, 9, 11, 13, 15
    Typical range of values: 1.0 ≤ MaskHeight ≤ 511.0
    运算的高参数
    MaskWidth (input_control)  Width of the filter mask.
    Default value: 11
    Suggested values: 3, 5, 7, 9, 11, 13, 15
    Typical range of values: 1.0 ≤ MaskWidth ≤ 511.0
    运算的宽参数
    MaskShape (input_control)   Shape of the mask.
    Default value: 'octagon'
    List of values: 'octagon', 'rectangle', 'rhombus'
    形状
    dyn_threshold(局部阈值)
    OrigImage (input_object)   Input image. 图像
    ThresholdImage (input_object)  Image containing the local thresholds. 要对比的图想
    RegionDynThresh (output_object)   Segmented regions. 输出的对比后区域
    Offset (input_control)  Offset applied to ThresholdImage.
    Default value: 5.0
    Suggested values: 1.0, 3.0, 5.0, 7.0, 10.0, 20.0, 30.0
    Typical range of values: -255.0 ≤ Offset ≤ 255.0 (lin)
    Minimum increment: 0.01
    Recommended increment: 5
    Restriction: (-255 < Offset) && (Offset < 255)
    偏离量
    LightDark (input_control)  

    Extract light, dark or similar areas?
    Default value: 'light'
    List of values: 'dark', 'equal', 'light', 'not_equal'

     

    g_{o} = g_{OrigImage}and g_{t} = g_{ThresholdImage}
    light(亮)

    go ≥ gt + Offset(缺陷点所在的灰度值大于周围,即亮点)

    dark(暗) go ≤ gt - Offset(缺陷点所在的灰度值小于周围,即暗点)
    equal(区间) gt - Offset ≤ go ≤ gt + Offset
    not_equal(非区间) gt - Offset > go && go > gt + Offset
    暗亮选择

     

    使用:

    1. 彩色图像要转成灰色图像。
    2. 提取包含目标的图片或选择此目标的图片。
    3. 开和闭运算(参数需要根据实际更改),然后对比。
    4. 根据实际判断某个特征,例如面积,判定缺陷。
    read_image (Image, 'E:/照片/缺陷')
    
    *RGB图像转换
    decompose3 (Image, Image1, Image2, Image3)
    trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
    
    dev_set_draw ('margin')
    dev_set_color ('red')
    
    *对比检测缺陷
    openvalue := 1
    closevalue := 100
    gray_opening_shape (ImageResult3, ImageOpening, openvalue, openvalue, 'rectangle')
    gray_closing_shape (ImageResult3, ImageClosing, closevalue, closevalue, 'rectangle')
    dyn_threshold (ImageOpening, ImageClosing, RegionDynThresh, 50, 'dark')
    connection (RegionDynThresh, ConnectedRegions)
    count_obj (ConnectedRegions, Number)
    
    *通过面积判定缺陷
    for Index := 1 to Number by 1
        select_obj (ConnectedRegions, ObjectSelected, Index)
        area_center (ObjectSelected, Area1, Row1, Column1)
        if (Area1 > 1000)
            set_tposition (3600, Row1, Column1)
            write_string (3600, Area1)
        endif
    endfor
    
    dev_display (ImageResult3)
    dev_display (RegionDynThresh)

     

    缺陷
    缺陷检测结果

     

     

    展开全文
  • halcon缺陷检测

    千次阅读 2019-04-02 23:57:24
    dev_close_window () ...read_image (Image3, 'C:/Users/Administrator/Desktop/药品检测.png') get_image_size (Image3, Width, Height) dev_open_window_fit_image (Image3, 0, 0, -1, -1, WindowHandl...

    dev_close_window ()
    dev_update_off ()
    read_image (Image3, 'C:/Users/Administrator/Desktop/药品检测.png')
    get_image_size (Image3, Width, Height)
    dev_open_window_fit_image (Image3, 0, 0, -1, -1, WindowHandle)
    dev_set_draw ('fill')
    dev_set_line_width (3)
    dev_display (Image3)
    *处理图片
    threshold (Image3, Regions, 5, 62)
    connection (Regions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 227.96, 79863.2)
    union1 (SelectedRegions, RegionUnion)
    orientation_region (RegionUnion, Phi)
    area_center (RegionUnion, Area, Row, Column)
    vector_angle_to_rigid (Row, Column,Phi, Row, Column,rad(0), HomMat2D)
    affine_trans_image (Image3, ImageAffineTrans, HomMat2D, 'constant', 'false')
    affine_trans_region (RegionUnion, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
    dev_display (ImageAffineTrans)
    gen_empty_obj (Chambers)
    for I:=0 to 1 by 1
        Rows :=191+I*102
         for J:=0 to 5 by 1
             columns :=166.3+J*80
            gen_circle (circle,  Rows, columns, 30.991)
            concat_obj (Chambers, circle, Chambers)
            dev_display (ImageAffineTrans)
         endfor
    endfor
    difference (RegionAffineTrans, Chambers, RegionDifference)
    union1 (Chambers, ChambersUnion)
    orientation_region (ChambersUnion, PhiRef)
    PhiRef1 := rad(180) + PhiRef
    area_center (ChambersUnion, AreaRef, RowRef, ColumnRef)
    read_image (Image3, 'C:/Users/Administrator/Desktop/药品检测.png')
    dev_display(Image3)
    *预处理
    threshold (Image3, Regions1, 9, 90)
    connection (Regions1, ConnectedRegions1)
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 227.96, 91109.4)
    union1 (SelectedRegions1, RegionUnion1)
    fill_up (RegionUnion1, RegionFillUp)
    orientation_region (RegionFillUp, Phi1)
    area_center (RegionFillUp, Area1, Row1, Column1)
    vector_angle_to_rigid (Row1, Column1, Phi1, RowRef, ColumnRef, PhiRef1, HomMat2D1)
    affine_trans_image (Image3, ImageAffineTrans1, HomMat2D1, 'constant', 'false')
    reduce_domain (ImageAffineTrans1,  ChambersUnion, ImageReduced)
    *4进行图像分割(blob)
    threshold (ImageReduced, Regions2, 3, 109)
    connection (Regions2, ConnectedRegions2)
    select_shape (ConnectedRegions2, SelectedRegions2, ['area','circularity'], 'and', [727.96,0.7682], [2000,0.9962])
    count_obj (Chambers, Number)
    sort_region (SelectedRegions2, SortedRegions, 'character', 'true', 'row')
     gen_empty_obj (WrongPill)
     gen_empty_obj (MissingPill)
     gen_empty_obj (CrackPill)
     for Index :=1 to Number by 1
         select_obj (Chambers, charms, Index)
         intersection (charms,SortedRegions, pill)
         area_center (pill, Area2, Row2, Column2)
         area_holes (pill, AreaHoles)
         if(AreaHoles>0)
             concat_obj (CrackPill, pill, CrackPill)

          else
             
            if(Area2>0)
                if(Area2<1400 or Area2>1600)
                concat_obj (WrongPill, pill, WrongPill) 
                else
                 concat_obj (MissingPill, pill, MissingPill)   
             
                 endif
        
             endif
          endif
         
       
         
     endfor
     *显示
     
     count_obj (SortedRegions, Number1)
     count_obj (MissingPill, NumberMP)
     count_obj (CrackPill, NumberCP)
     count_obj (WrongPill, NumberWP)
     *显示
     if (NumberWP > 0)
         disp_message (WindowHandle, '错误药片'+NumberWP, 'image', 0, 0, 'red', 'true')
     endif
     if(NumberMP >0)
          disp_message (WindowHandle, '好药片'+NumberMP, 'image', 20, 0, 'red', 'true')
     endif
     if(NumberCP>0)
         disp_message (WindowHandle, '破碎药片'+NumberCP, 'image', 40, 0, 'red', 'true')
     endif
            



    展开全文
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测 Halcon缺陷检测实例转OpenCV实现(三)---凸缺陷检测 Halcon缺陷检测实例转OpenCV实现(四)---同颜色...

    图片


        Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测

        Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测

        Halcon缺陷检测实例转OpenCV实现(三)---凸缺陷检测

        Halcon缺陷检测实例转OpenCV实现(四)---同颜色药片缺陷检测

        Halcon缺陷检测实例转OpenCV实现(五)---混合颜色药片缺陷检测


        本期文章继续介绍缺陷检测专题的第六个案例,用OpenCV实现Halcon中一个瓶口缺陷检测的实例,前面案例链接如上↑↑↑。

        Halcon中对应的例子为inspect_bottle_mouth.hdev,用于检测酒瓶瓶口是否出现破损等缺陷情形,检测效果如下:

       (1) 正常情瓶口完整,无破损

    图片

       (2) 异常情况包含不同情况的破损

    图片

    图片

    图片

        Halcon实例主要步骤包含五步,分别是:

    • 使用阈值处理和形态学粗定位品口位置;

    • XLD轮廓拟合最近似的圆形区域作为瓶口的轮廓;

    • 极坐标变换,转换到水平或垂直方向进行处理;

    • 均值滤波图与原图做差分,根据阈值提取;

    • 将绘制的缺陷部分通过反极坐标变换投影到原图上。


        具体的实现代码大家有兴趣看下Halcon的实例代码,这里有几个重要步骤需要对比说明:

        (1) 瓶口轮廓粗定位,OpenCV实现是根据瓶口部分区域为黑色且明显易于提取所以选择了HSV提取黑色轮廓的方法,然后通过计算轮廓的最小外接圆来近似,大部分效果还可以,如下:

    图片

    但有一些情况圆边上多出一部分杂讯,如下:

    图片

    Halcon中通过拟合圆算子可以过滤,OpenCV中需要自己写

    图片

        (2) 所以,第一步和第二步这里直接同霍夫圆变换来替换(最重要的就是参数要设置合适):

    •  
    •  
    •  
    •  
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)gray = cv2.medianBlur(gray,3)circles = cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,100,\         param1=200,param2=30,minRadius=150,maxRadius=500)

    图片

    我测试了一下,16张测试图,效果都不错,暂时采用它。
        (3) 第三步,极坐标变换。这里的重点就是基于上一步骤要准确找到圆,将圆心作为极坐标变换的中心。

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    x = circles[0][i][0] - circles[0][i][2]y = circles[0][i][1] - circles[0][i][2]w = h = 2 * circles[0][i][2]center = (circles[0][i][0], circles[0][i][1])radius = circles[0][i][2]
    ROI = img[y:y+h,x:x+w].copy()cv2.imshow('ROI',ROI)trans_center = (center[0]-x, center[1]-y)polarImg = cv2.warpPolar(ROI,(300,600),trans_center,radius,cv2.INTER_LINEAR + cv2.WARP_POLAR_LINEAR)cv2.imshow('polarImg',polarImg)

    变换前:

    图片

    变换后:

    图片

        (3) 均值滤波做差分,注意这里的均值滤波核大小,一般我们都是设置(3,3)或(5,5)等,这里物体垂直方向较长,参考Halcon例子中设置为(3, 501),看效果:

    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    •  
    blur = cv2.blur(gray,(3,501))cv2.imshow('blur',blur)diff = cv2.absdiff(gray,blur)cv2.imshow('diff',diff)cv2.imwrite("diff.png",diff)ret,thres = cv2.threshold(diff,55,255,cv2.THRESH_BINARY)thres = cv2.medianBlur(thres, 3)
    contours2,hierarchy2 = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt2 in contours2:  (x2, y2, w2, h2) = cv2.boundingRect(cnt2)    #print(x, y, w, h)  if w2 > 13:    cv2.drawContours(polarImg,cnt2,-1,(0,0,255),2)    isNG = True

    图片

    然后做差分,阈值处理,绘制轮廓:

    图片

    图片

        (4) 反极坐标变换,结果投影到原图:

    图片

        (5) 最后把ROI图贴到结果图中:

    图片

    完整测试效果见下面视频:

    https://www.bilibili.com/video/BV1Qv41147uV/

    核心代码上面已展示,如果对完整源码感兴趣,欢迎加入知识星球获取和讨论,感谢。

    展开全文
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)--- PCB印刷缺陷检测 Halcon缺陷检测实例转OpenCV实现(三)-凸缺陷​​检测 Halcon缺陷检测实例转OpenCV实现(四...

    图片


        Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测

        Halcon缺陷检测实例转OpenCV实现(二)--- PCB印刷缺陷检测

        Halcon缺陷检测实例转OpenCV实现(三)-凸缺陷​​检测

        Halcon缺陷检测实例转OpenCV实现(四)---同色药片缺陷检测


        本期文章继续介绍缺陷检测专题的第五个案例,用OpenCV实现Halcon中一个混合颜色缺陷检测的实例,前面案例链接如上↑↑↑

        Halcon中对应的例子为check_blister_mixed.hdev,用于检测替换包装中是否有错的替换或漏装的替代,检测效果如下:

       (1)正常情况黄色胶囊3个,红色和绿色胶囊各6个

    图片

       (2 )异常情况包括漏装,少装和错装

    图片

    图片

    图片

    图片

        Halcon实例中使用GMM分类方法来实现,GMM(高斯混合模型)常用图像分割分类,某些常见的运动物体检测中的前景和背景分割等,如下:

    图片

        使用OpenCV实现方法我们用简单的HSV颜色提取和轮廓分析即可,毕竟这个实例中颜色只有3种,我们可以避免准备和训练样本的步骤。当然,如果有更多的颜色或形状的胶囊混合,也可以加一个CNN分类网络来做每一个ROI的识别。我们这里只介绍HSV颜色提取方法,步骤也简单:

        (1)设置黄色,红色,绿色的HSV值范围(记得用我上篇文章给大家的工具或自己写个滑动条调试工具),能区分颜色的同时,不要将几种颜色替换;

        (2)按照上篇文章的方法,将分割成分段的ROI,然后提取对应的颜色轮廓比对;

        (3)比对颜色是否对应,同时轮廓的宽高是否满足要求,然后将每个满足要求的颜色轮廓计数,最后做结果确定即可。

        如下是核心代码和运行效果:

        (1)HSV颜色取值范围:

    lower_yellow = np.array([0,40,40])upper_yellow = np.array([50,255,255])
    lower_red = np.array([0,10,10])upper_red = np.array([10,255,255])
    lower_green = np.array([20,60,50])upper_green = np.array([80,255,255])

        (2)颜色轮廓提取:

    hsv_roi=cv2.cvtColor(small_roi,cv2.COLOR_BGR2HSV)mask_yellow = cv2.inRange(hsv_roi,lower_yellow,upper_yellow)mask_red = cv2.inRange(hsv_roi,lower_red,upper_red)mask_green = cv2.inRange(hsv_roi,lower_green,upper_green)mask_yellow = cv2.medianBlur(mask_yellow, 3)#中值滤波mask_red = cv2.medianBlur(mask_red, 3)#中值滤波mask_green = cv2.medianBlur(mask_green, 3)#中值滤波

        (3)单个胶囊判断与最终结果判断逻辑:

    isRed = isGreen = False    if check_yellow:        #cv2.imshow("mask_yellow",mask_yellow)        contours2,hierarchy2 = cv2.findContours(mask_yellow, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)           for cnt2 in contours2:          (x2, y2, w2, h2) = cv2.boundingRect(cnt2)          if w2 > 5 and h2 > 5:            cv2.rectangle(img,(x1,y1),(x1+width+5,y1+height+13),(32,165,218),2)            yellow_num = yellow_num + 1            break##          else:##            cv2.rectangle(img,(x1,y1),(x1+width+5,y1+height+13),(0,0,255),2)##            isNG = True        if(len(contours2) < 1):          cv2.rectangle(img,(x1,y1),(x1+width+5,y1+height+13),(0,0,255),4)          isNG = True            if check_red:        contours2,hierarchy2 = cv2.findContours(mask_red, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)           #cv2.imshow("mask_red",mask_red)            for cnt2 in contours2:          (x2, y2, w2, h2) = cv2.boundingRect(cnt2)          if w2 > 30 and w2 < 60 and h2 > 20 and h2 < 45:            cv2.rectangle(img,(x1,y1),(x1+width+5,y1+height+13),(34,34,178),2)            red_num = red_num + 1            isRed = True            break
        if check_green:        #cv2.imshow("mask_green",mask_green)        contours2,hierarchy2 = cv2.findContours(mask_green, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)           for cnt2 in contours2:          (x2, y2, w2, h2) = cv2.boundingRect(cnt2)          #print(x2, y2, w2, h2)          if w2 > 30 and w2 < 60 and h2 > 20 and h2 < 45:            cv2.rectangle(img,(x1,y1),(x1+width+5,y1+height+13),(35,142,107),2)            green_num = green_num + 1            isGreen = True            break    if not isRed and not isGreen and i>0:      cv2.rectangle(img,(x1,y1),(x1+width+5,y1+height+13),(0,0,255),4)      isNG = True        cv2.putText(img,str(index), (x1,y1), font, 0.7, (255,0,0), 2)     #cv2.imshow("img",img)    #cv2.waitKey()if yellow_num != 3:  isNG = True  cv2.putText(img,"yellow pillow : %d"%yellow_num, (10,20), font, 0.7, (0,0,255), 2)else:  cv2.putText(img,"yellow pillow : %d"%yellow_num, (10,20), font, 0.7, (255,255,0), 2)      if red_num != 6:  isNG = True  cv2.putText(img,"red pillow : %d"%red_num, (10,40), font, 0.7, (0,0,255), 2)else:  cv2.putText(img,"red pillow : %d"%red_num, (10,40), font, 0.7, (255,255,0), 2)      if green_num != 6:  isNG = True  cv2.putText(img,"green pillow : %d"%green_num, (10,60), font, 0.7, (0,0,255), 2)else:  cv2.putText(img,"green pillow : %d"%green_num, (10,60), font, 0.7, (255,255,0), 2)print("yellow=%d,red=%d,green=%d"%(yellow_num,red_num,green_num))

        运行效果:

    图片

    图片

    图片

    图片

    图片

    图片

    核心代码上面已展示,如果对完整原始码作者,欢迎加入知识星球获取,感谢。

    展开全文
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测 Halcon缺陷检测实例转OpenCV实现(三)---凸缺陷检测 本期文章继续介绍缺陷检测专题的第四个案例,用...
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 Halcon缺陷检测实例转OpenCV实现(二)---PCB印刷缺陷检测 本期文章继续介绍缺陷检测专题的第三个案例,用OpenCV实现Halcon中一个物体凸缺陷检测的实例,前两个...
  • Halcon缺陷检测实例转OpenCV实现(一)---网格缺陷检测 本期来用OpenCV实现Halcon中一个简单的PCB印刷缺陷检测实例。 Halcon中对应的例子为pcb_inspection.hdev,源图和结果图如下: Halcon代码比较简单,...
  • Halcon 缺陷检测概述

    2021-04-27 19:43:39
    缺陷检测概述 1. 什么缺陷检测 2. 缺陷检测的方法总结
  • halcon编程入门四——halcon缺陷检测

    万次阅读 多人点赞 2019-08-05 17:27:27
    1.边缘凹凸检测 2.内部凸凹点、瑕疵、污点、内部烫伤、孔洞 3.划痕(用低角度环形光进行打光,将划痕打亮,背景打暗;也可用同轴光,让表面反光不明显) 缺陷图像处理 1.blob分析+特征提取 2.blob分析+特征提取...
  • 本期来用OpenCV实现Halcon中一个简单的网格缺陷检测实例。 Halcon中对应的例子为novelty_detection_dyn_threshold.hdev,如下: 属于Blob分析中的一个缺陷检测实例,用于检测网格缺陷,如下图所示: 正常网格...
  • 产品表面三角缺陷检测 Demo.hdev //读取一张图像 read_image (Image, '1.jpg') //将RGB图像转化为灰度图 rgb1_to_gray (Image, GrayImage) //使用自动阈值分割图像前景区域 bin_threshold (GrayImage, ...
  • 缺陷检测——差分+定位 1. 简单的差分 案例1:检测毛刺 案例2:电路板线路缺陷检测 案例3:瓶口破损缺陷检测 2. 模板匹配定位+差分 案例1:印刷质量缺陷检测(standard) 案例2:检测工件孔洞毛刺缺陷 - 局部变形...
  • 缺陷检测——频域和空间域1. 理解傅里叶变换2. 读懂频谱图3. 使用频域处理图像的案例3.1 脏污检测3.2 检测表面微小凸起3.3 检测磨砂表面的缺陷4. 资源下载 1. 理解傅里叶变换 为了理解频域处理的相关概念,我向大家...
  • 背景网格产品刮伤缺陷检测 DEMO.hdev // 关闭窗口 dev_close_window () //关闭程序计数器,图形变量更新,窗口图形更新 dev_update_off () //设置图像路径 Path := 'lcd/mura_defects_blur_' //读取一张...
  • 缺陷检测——测量拟合1. 简单聊一聊测量的那些事2. 做几个测量判断缺陷的项目案例1. 测量液体线高度 1. 简单聊一聊测量的那些事 测量为什么也能做缺陷检测的工作呢?仔细想一想,这不是废话吗?缺陷其中就包含了被...
  • 光度立体法 1. 了解一些概念 2. 认识两个算子 3. 初试光度立体法 4. 药片外包装破损的检测halcon案例)
  • 缺陷检测——机器学习1. ocr识别1.1 ocr识别就只能识别ocr吗?1.2 简单的图形分类 halcon提供了三套机器学习的算子,它们都可以用来检测缺陷 1. ocr识别 1.1 ocr识别就只能识别ocr吗? 首先halcon在ocr识别中提供了...
  • // fin.hdev: Detection of a fin //关闭程序计数器,变量更新,图像更新窗口 dev_update_window ('off') //一次性读取3张图像 read_image (Fins, 'fin' + [1:3]) //获取图像宽高 get_image_size (Fins, Width, ...
  • halcon缺陷检测(一)

    2020-10-26 23:00:50
    缺陷的种类: 1.凸凹缺陷; 2.污点/瑕疵/孔洞/破损缺陷; 3.划痕缺陷; 划痕打光:低角度环形光,划痕打白,背景为黑;同轴光打光。 图像处理: 1.blob分析+特征分析; 2.blob分析+差分; 3.频域+空间域; 4.光度...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 289
精华内容 115
关键字:

halcon缺陷检测