目录

前言

一、系统介绍

1.1 设计目的

1.2 硬件配置

二、程序描述

2.1 视觉检测流程

2.2 程序描述

2.2.1 清空文件夹模块

2.2.2 ROI区域划分模块

2.2.3 黑白占比计算

2.2.4 图像处理模块

三、系统简易展示

3.1 合格展示

3.2 不合格展示

四、系统框架代码


前言

1. 由于受到软件著作权保护,本视觉检测系统仅提供部分算法设计思路。该系统建议作为一个框架使用,通过调整算法结构,具体参数和文件路径实现视觉检测。
 2. 完整版本已投入工业现场使用。

一、系统介绍

1.1 设计目的

本系统主要针对PCB进行检测,PCB在焊锡过程中可能出现以下问题:

- (1)焊点缺失
 - (2)焊点粘连

因此提出以下要求:

- (1)对PCB上的焊点进行检测
 - (2)对所有焊点进行判断是否存在缺陷,有缺陷则报警,无缺陷则显示合格
 - (3)将视觉检测系统与PLC进行通讯,通过三色灯显示检测结果

1.2 硬件配置

名称

型号规格

高清工业相机

AA1300 -90GC

相机镜头

HF1628-6MP

LED面光源

BL120*60

光源控制器

模拟恒流

工控机

CV-A6-08128

IO控制器

DAM0808D

二、程序描述

2.1 视觉检测流程

检测思路:

  1. 当系统启动时,首先判断寄存文件夹的文件数量,当文件数量不为1时,删除除了最新图片外的所有图片,然后进行图片读取。当文件数量为1时直接进行图片读取。
  2. 在读取到图片后对图片通过掩膜进行裁剪,然后进行图像处理,消除图片噪声,提取有用的特征。
  3. 用黑白像素的占比计算来作为合格条件进行判断,当白像素超出阈值时为不合格,通过与PLC通讯使得三色灯亮,低于阈值时三色灯绿灯亮,最终显示OK/NG结果,系统结束。

2.2 程序描述

2.2.1 清空文件夹模块

模块介绍:

1.通过python内置的os库来进行文件读取,获得目标文件夹长度list,通过len(list)计算文件夹长度。

2.当目标文件夹长度不为1时,显示长度(文件夹内图片数量),通过for循环递增文件夹长度的倒数第二个位置,用os.Remove()将图片删除,剩下最后一张即最新的图片。

3.当目标文件夹长度为1时,说明相机驱动软件MVS采集到最新图片,直接pass进入下一模块。

2.2.2 ROI区域划分模块

模块介绍:

1.图片在计算机中以数组形式显示,相机分辨率为1280*1024,受限于焦距和光圈限制,不能完全覆盖PCB大小,因此需要把 1280*1024的原图裁剪成 和PCB大小相同的 300*350 的图片。PCB板的焊锡分布为上面五个,中间三个,下面三个,生成目标区域的掩膜mask,并且将掩膜像素全置为255,三个mask区域大小分别为:

2.通过位操作cv.bitwise_and将图像和掩膜进行合并,分别提取出三个目标区域,最后通多cv.add()将区域相加,使得原本图像只剩下三个目标区域:

2.2.3 黑白占比计算

模块介绍:

用black-pixel和white-pixel两个变量储存黑白像素点的数量,通过遍历1280*1024即13,107,200个像素,使用PLI包内的Image模块,image.size()用于读取PIL方式image.open()打开的图片,该模式下读取图片的宽和长,将值返回到width和height两个变量中。通过image.getpixel()获取某点处像素,统计图片画幅中的像素点数量,当遍历完所有像素后,计算黑白占比并显示,流程结束。

2.2.4 图像处理模块

图像处理模块是一个线性流程,其中的图像处理算法为灰度处理 - 形态学处理(腐蚀 - 膨胀 - 开运算)- 高斯滤波 - 轮廓提取,分别使用到以下函数:

表2 — 图像处理函数表

类型

函数名称

结构元大小

腐蚀

cv.erode()

(5,5)

膨胀

cv.dilate()

(3,3)

开运算

cv.morphologyEx()

(7,7)

高斯滤波

cv.GaussianBlur()

(1,1)

二值化

cv.threshold()

发现轮廓

cv.findContours()

绘制轮廓

cv.drawContours()

具体函数的使用如下:

三、系统简易展示

处理前图片为PCB板,因涉及专利设计保护,因此使用SW模型代替。

3.1 合格展示

  

图1 处理前图片                                                      图2 处理后图片

图3 检测结果显示

3.2 不合格展示

  

图4 处理前图片                                         图5 处理后图片

图6 处理前图片

四、系统框架代码

import os
import time
import cv2 as cv
import numpy as np
from PIL import Image
from appdirs import unicode'''
算法设计:
(1)形态学处理 -- 1、(腐蚀5*5,膨胀3*3,开运算7*7,均为矩形结构元) 2、高斯滤波
(2)blob筛选 -- 提取并绘制轮廓,减少图片噪声
''''''
检测流程:
(1)从文件夹内读取RGB图片
(2)对RGB图片进行灰度处理,形态学处理,高斯滤波和轮廓提取,其中灰度处理后需要进行掩膜处理,提取目标区域.
(3)对处理完的图片进行黑白占比计算,焊锡点缺失会导致焊锡处反光,导致亮度过高.当白色占比超过阈值,判断为焊锡缺失
(4)输出合格与不合格后,与PLC通过modbus通讯
'''def cut(cut):'''主要功能:把 1024*1280 的原图 裁剪成 PCB大小的 300*350 的图片然后将三个焊锡区域提取出来并合并'''img = cut[350:650, 500:850]  # 把 1280*1024 的原图 裁剪成 PCB大小的 300*350 的图片# 分割区域1 -- 上面五个焊锡点mask1 = np.zeros(img.shape[:2], np.uint8)mask1[10:60, 10:330] = 255mask1_img = cv.bitwise_and(img, img, mask=mask1)# cv.imshow('mask1',mask1_img)# 分割区域2 -- 中间三个焊锡点mask2 = np.zeros(img.shape[:2], np.uint8)mask2[80:130, 70:270] = 255mask2_img = cv.bitwise_and(img, img, mask=mask2)# cv.imshow('mask2',mask2_img)# 分割区域3 -- 下面三个焊锡点mask3 = np.zeros(img.shape[:2], np.uint8)mask3[240:290, 70:270] = 255mask3_img = cv.bitwise_and(img, img, mask=mask3)# cv.imshow('mask3',mask3_img)pic1 = cv.add(mask1_img, mask2_img)  # 区域1+区域2pic = cv.add(pic1, mask3_img)  # 区域(1+2)+区域3return picdef remove():'''主要功能:保证文件夹内只有最新的那一张图片'''# 时间在0.01以内,因此不记录时间path = r'C:\Users\-libr\Desktop\PCB\PCB input_dir'file = unicode(path)files = os.listdir(file)  # 创建由文件名组成的列表#print('filelist:', files)if len(os.listdir(path)) > 1:print(f"图片数量为:{len(os.listdir(path))}")for i in range(len(os.listdir(path))-1):#设置 len(os.listdir(path))-1 是为了保证i递增到倒数第二,留下最新的图片i += 1#print(i)os.remove(os.path.join(path, f'PCB{i}.jpg'))elif len(os.listdir(path)) == 1:print(f"图片数量为:1 ")#文件夹内只有最新的那张图片passdef count(image):'''主要功能;输入单张图片图片,计算并输出'黑白占比的计算结果'和'计算一次的时间''''start = time.time()white_pixel = 0black_pixel = 0width, height = image.sizefor i in range(width):for j in range(height):if image.getpixel((i,j)):white_pixel += 1else:black_pixel += 1black = black_pixel / (width * height)white = white_pixel / (width * height)end = time.time()cost = end - startprint('黑白检测时间:%s'%cost)print('黑色占比:%s\n白色占比:%s'%(black,white))#判断黑白占比阈值,输出检验结果if black > 0.99:return(print('合格\n'))else:return(print('不合格\n'))def convert(input_dir, output_dir):for filename in os.listdir(input_dir):'''主要功能:读取文件夹内的图片,进行图像处理后,并将其保存到指定文件'''path = input_dir + "/" + filename  # 获取文件路径gray_img = cv.imread(path, 0)  # 读取图片,参数0为直接以灰度模式读取cut_pic = cut(gray_img)  #提取三个焊锡区域后的图片# 腐蚀kernel1 = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))img_erode = cv.erode(cut_pic, kernel1)# 膨胀kernel2 = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))img_dilate = cv.dilate(img_erode, kernel2)# 开运算kernel3 = cv.getStructuringElement(cv.MORPH_RECT, (7, 7))img_open = cv.morphologyEx(img_dilate, cv.MORPH_OPEN, kernel3, iterations=1)# 高斯滤波img_gaussian = cv.GaussianBlur(img_open, (1, 1), 2)# 二值化ret, img_turn = cv.threshold(img_gaussian, 127, 255, 0)# 发现轮廓contours, heriachy = cv.findContours(img_turn, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for i, contour in enumerate(contours):# 绘制每条轮廓cv.drawContours(img_turn, contours, i, (0, 0, 255), 2)cv.imwrite(output_dir + '/' + filename, img_turn)cv.imshow("PCB", img_turn)cv.waitKey()cv.destroyAllWindows()# cv.destroyAllWindows(1)def read_path(output_dir):for filename in os.listdir(output_dir):'''主要功能:定义读取路径的函数,为用PIL打开图片获得'''path = output_dir + "/" + filename  # 获取文件路径image = Image.open(path).convert('L')count(image)if __name__ == '__main__':# 输入RGB图片input_dir = r'C:\Users\-libr\Desktop\PCB\PCB input_dir'  # 输入文件夹output_dir = r'C:\Users\-libr\Desktop\PCB\PCB output_dir'  # 输出文件夹#1、保持文件夹内只有最新图片remove()#2、对图片进行读取,处理和保存convert(input_dir, output_dir)#3、对图片进行黑白占比计算并判断read_path(r'C:\Users\-libr\Desktop\PCB\PCB output_dir')

Python+Opencv的工业级机器视觉检测系统相关推荐

  1. Python基于OpenCV的异常行为检测系统[源码&部署教程]

    1.项目背景 智能视频监控(Intelligent Video Surveillance , IVS)[1.2·3.4是计算机视觉技术5l在安防领域的应用,实现了由"被动监控"到& ...

  2. Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.明厨亮灶: 餐饮企业的厨房卫生状况一直饱受消 ...

  3. python+opencv+dlib实现人脸检测与表情识别

    python+opencv+dlib实现人脸检测与表情识别 一,dlib简单介绍:Dlib包含广泛的机器学习算法.所有的设计都是高度模块化的,快速执行,并且通过一个干净而现代的C ++ API,使用起 ...

  4. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  5. 基于Opencv的车距检测系统(源码&教程)

    1.研究背景 对本车前方车辆的识别及距离检测是计算机视觉技术在智能网联汽车中的一个重要内容.要想在错综繁杂的交通环境中实现无人驾驶,对行车环境中其他车辆信息的获取是十分重要的.因此,对本车前方车辆的识 ...

  6. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

  7. 基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.算法原理: 该博客提出的移动侦测即是根据视频 ...

  8. 基于C++MFC的活塞环外观表面缺陷机器视觉检测系统

    目 录 1 绪论 1 1.1 课题研究背景和意义 1 1.2国内外研究现状和发展 2 1.3研究内容 2 2 活塞环生产过程介绍与缺陷分析 4 2.1活塞环工作原理 4 2.2活塞环的的加工特点 5 ...

  9. OpenCV定制和调试检测系统

    OpenCV定制和调试检测系统 定制和调试检测系统 定制和调试检测系统 图表检测中涉及许多超参数.选择默认值可使平均情况下的检测最大化.但是这些可能不是最适合您的用例.可以将这些值配置为提高特定用例的 ...

最新文章

  1. linux切换目录使用命令,linux命令切换目录的使用方法
  2. id,clientid 和 uniqueid 的区别
  3. [Ext JS 7]基于NPM的开发
  4. LeetCode(728)——自除数(JavaScript)
  5. IntelliJ IDEA库存在却报错找不到的解决办法
  6. linux裸磁盘的配置,【存储】nas模拟裸磁盘挂载swift
  7. 调试工具之UDP/TCP网络调试助手NetAssist
  8. R语言批量下载PubMed摘要
  9. 深入原理64式:40 概率论公式总结
  10. windows10升级助手_微软官网下载与安装windows10系统的操作步骤
  11. 常用的计算机网络设备有,常用网络设备有哪些,初学者必须要知道的五大网络设备...
  12. rebase操作使用方法
  13. 华硕 梅林系统 wan FTP 端口转发
  14. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)
  15. 软件工程师典藏 C# 程序开发范例宝典 第3版
  16. 构建gcc交叉编译工具链
  17. 无线网卡丢失的两个奇葩解决办法
  18. Win7开机自动拨号连接宽带
  19. 部落文化:足球经济的底层逻辑
  20. TensorFlow2.0 教程-图像分类

热门文章

  1. Datax 插件二次开发之parquet日志问题处理
  2. 【luogu CF1693D】Decinc Dividing(DP)
  3. FICO概念及主要流程
  4. 8.python之列表与字典
  5. python学习总结--字典
  6. 4卡GPU服务器 硬件推荐
  7. html css 矩形边框,html – CSS:在纯CSS箭头上创建边框
  8. 身处微信小程序红海,如何才能防止“溺亡”?
  9. jdk各个版本及其代号
  10. 自用推荐 !这7个电脑软件,好用到爆