缺陷识别

简介:
这个项目是我的本科毕业设计,主要针对传送带上的木质圆形工件的缺陷识别和分类,并且进行工件的计数和缺陷工件的计数。这里我主要是识别污渍和划痕

缺陷类型

污渍:

划痕:

最后的成果

  • sum:为工件的总个数
  • scratch_num:为含有划痕工件的总个数
  • blot_num:为含有污渍工件的总个数
  • 黄颜色圈住的缺陷为划痕
  • 蓝颜色圈住的缺陷为污渍

简单思路

  1. 通过边缘检测,得到每个工件的坐标,并计算出工件的中心来标记工件的ID
  2. 通过工件的每一帧位移量来确定是否为同一个工件
  3. 将每一个工件截取出来,进行缺陷的提取
  4. 将提取的缺陷进行直方图计算,通过直方图来值归一化,通过颜色值分布来分类缺陷

缺陷识别和分类

缺陷一:污渍的直方图
提取缺陷

缺陷处的直方图

提取缺陷

缺陷处的直方图

缺陷二:划痕的直方图
提取缺陷

缺陷处的直方图

提取缺陷

缺陷处的直方图

由上方缺陷的直方图值分析可得,污渍的颜色值主要分布在50左右,划痕的颜色值主要分布在100左右。因此通过颜色分布即可对对缺陷进行分类,将直方图归一化方便确定颜色的分布,代码如下

ret = img[y:y + h, x: x + w]
# 提取缺陷
gray = cv2.cvtColor(ret, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 135, 250, cv2.THRESH_BINARY_INV)[1]
contours, hierarchy =cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
mask = np.zeros(gray.shape).astype(gray.dtype)
cv2.fillPoly(mask, contours, (255, 255, 255))
result = cv2.bitwise_and(gray, mask)# 直方图计算
hist = cv2.calcHist([result], [0], None, [255], [1, 256])
s = sum(hist)
# 归一化
for i in range(len(hist)):if hist[i] > 0:hist[i] = hist[i] / s# 判断缺陷
hist_sum_scratch = 0
hist_sum_blot = 0
for i in range(90, 135):hist_sum_scratch = hist_sum_scratch + hist[i]for i in range(15, 90):hist_sum_blot = hist_sum_blot + hist[i]if hist_sum_scratch > 0.6:d = defects.Defect(1, x, y, w, h)self.defects.append(d)self.state = 1print("此处缺陷划痕")if hist_sum_blot > 0.6:d = defects.Defect(2, x, y, w, h)self.defects.append(d)self.state = 2print("此处缺陷污渍")

全部程序

主程序:

import numpy as np
import cv2
import Products as product# 加载视频
cap = cv2.VideoCapture("F:/FFOutput/8-1.mp4")# 变量
font = cv2.FONT_HERSHEY_SIMPLEX
products = []
pid = 1
areaTh = 18000
# 获取图像width, height
width = cap.get(3)
height = cap.get(3)while cap.isOpened():ret, frame = cap.read()try:# 复制图片,用于绘制img = frame.copy()gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]except:print("EOF")break# 边缘检测,识别工件contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)if area > areaTh:M = cv2.moments(cnt)cx = int(M['m10'] / M['m00'])cy = int(M['m01'] / M['m00'])x, y, w, h = cv2.boundingRect(cnt)new = Trueif cx > 100:for i in products:if abs(cx - i.getX()) <= 25 and abs(cy - i.getY()) <= 25:new = Falsei.updateCoords(cx, cy, x, y, w, h)if new:p = product.Product(pid, cx, cy, x, y, w, h)p.save_pic(frame)products.append(p)product.count = piddefects = p.defect_detect()pid += 1cv2.circle(img, (cx, cy), 5, (0, 0, 255), -1)img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)for i in products:# 标记IDif i.getX() <= 600:cv2.putText(img, str(i.getId()), (i.getX(), i.getY()), font, 1.0, i.getRGB(), 1, cv2.LINE_AA)# 绘制缺陷for j in i.defects:if j.getState() == 1:img = cv2.rectangle(img, (i.getBoundX() + j.getX(), i.getBoundY() + j.getY()),(i.getBoundX() + j.getX() + j.getW() + 5,i.getBoundY() + j.getY() + j.getH() + 5),(0, 255, 255),1)elif j.getState() == 2:img = cv2.rectangle(img, (i.getBoundX() + j.getX(), i.getBoundY() + j.getY()),(i.getBoundX() + j.getX() + j.getW() + 5,i.getBoundY() + j.getY() + j.getH() + 5),(255, 255, 0),1)# 绘制sumcv2.putText(img, "sum:" + str(product.count), (10, 30), font, 0.7, (255, 255, 255), 1, cv2.LINE_AA)cv2.putText(img, "scratch_sum:" + str(product.Product.scratch_sum), (10, 50), font, 0.7, (0, 255, 255), 1,cv2.LINE_AA)cv2.putText(img, "blot_sum:" + str(product.Product.blot_sum), (10, 70), font, 0.7, (255, 255, 0), 1,cv2.LINE_AA)cv2.imshow("test", img)k = cv2.waitKey(10) & 0xffif k == 27:break
cv2.destroyAllWindows()

工件对象:

from random import randint
import cv2
import numpy as np
import Defects as defects
from matplotlib import pyplot as pltclass Product:scratch_sum = 0blot_sum = 0count = 0def __init__(self, p, xi, yi, x, y, w, h):# 工件IDself.pid = p# 中心坐标self.centre_x = xiself.centre_y = yi# 边框self.bound_x = xself.bound_y = yself.bound_w = wself.bound_h = h# 颜色self.R = randint(0, 255)self.G = randint(0, 255)self.B = randint(0, 255)# 运动轨迹self.tracks = []# 0代表正常,1代表工件存在划痕,2代表工件存在污渍self.state = 0self.sample = 0# 储存缺陷对象self.defects = []# 获取IDdef getId(self):return self.piddef getBoundX(self):return self.bound_xdef getBoundY(self):return self.bound_ydef getBoundW(self):return self.bound_wdef getBoundH(self):return self.bound_hdef getX(self):  # 获取中心xreturn self.centre_xdef getY(self):  # 获取中心yreturn self.centre_y# 更新位置def updateCoords(self, xn, yn, x, y, w, h):self.centre_x = xnself.centre_y = ynself.bound_x = xself.bound_y = yself.bound_w = wself.bound_h = h# 增加轨迹位置self.tracks.append([self.centre_x, self.centre_y])# 获取轨迹def getTracks(self):return self.tracks# 获取标记颜色def getRGB(self):return self.R, self.G, self.B# 保存def save_pic(self, frame):pic = frame[self.bound_y:self.bound_y + self.bound_h, self.bound_x:self.bound_x + self.bound_w]self.sample = pic# 改变图像大小cv2.imwrite("F:/image" + str(self.pid) + ".jpg", pic)# 缺陷识别和分类def defect_detect(self):gray = cv2.cvtColor(self.sample, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 135, 250, cv2.THRESH_BINARY)[1]contour, hierar = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)img = self.sample.copy()for cnt in contour:area = cv2.contourArea(cnt)if 100 < area <= 15000:x, y, w, h = cv2.boundingRect(cnt)ret = img[y:y + h, x: x + w]# 提取缺陷gray = cv2.cvtColor(ret, cv2.COLOR_BGR2GRAY)thresh = cv2.threshold(gray, 135, 250, cv2.THRESH_BINARY_INV)[1]contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)mask = np.zeros(gray.shape).astype(gray.dtype)cv2.fillPoly(mask, contours, (255, 255, 255))result = cv2.bitwise_and(gray, mask)# 直方图计算hist = cv2.calcHist([result], [0], None, [255], [1, 256])s = sum(hist)# 判断缺陷for i in range(len(hist)):if hist[i] > 0:hist[i] = hist[i] / s# 判断缺陷hist_sum_scratch = 0hist_sum_blot = 0for i in range(90, 135):hist_sum_scratch = hist_sum_scratch + hist[i]for i in range(15, 90):hist_sum_blot = hist_sum_blot + hist[i]if hist_sum_scratch > 0.6:d = defects.Defect(1, x, y, w, h)self.defects.append(d)self.state = 1# print("此处缺陷划痕")if hist_sum_blot > 0.6:d = defects.Defect(2, x, y, w, h)self.defects.append(d)self.state = 2# print("此处缺陷污渍")if self.state == 1:Product.scratch_sum = Product.scratch_sum + 1elif self.state == 2:Product.blot_sum = Product.blot_sum + 1return self.defects

缺陷对象:

class Defect:def __init__(self, state, x, y, w, h):self.state = stateself.bound_x = xself.bound_y = yself.bound_w = wself.bound_h = hdef getX(self):return self.bound_xdef getY(self):return self.bound_ydef getW(self):return self.bound_wdef getH(self):return self.bound_hdef getState(self):return self.state

总结

做出这些东西,所有的灵感都是来自csdn上各种关于图像处理的文章。可能做得并不是很好,但是还是想分享出来,也许会帮到更多的人。

基于python-opencv实现木质工件的污渍和划痕识别和分类相关推荐

  1. 基于python+OpenCV的车牌号码识别

    基于python+OpenCV的车牌号码识别 车牌识别行业已具备一定的市场规模,在电子警察.公路卡口.停车场.商业管理.汽修服务等领域已取得了部分应用.一个典型的车辆牌照识别系统一般包括以下4个部分: ...

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

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

  3. 基于Python+OpenCV车道线检测(直道和弯道)

    基于Python+OpenCV车道线检测(直道和弯道) 基于Python+OpenCV车道线检测(直道和弯道)

  4. 【开源分享】基于Python+OpenCV+PyQt5车牌识别(GUI界面)

    亲测无错:基于Python+OpenCV+PyQt5车牌识别(GUI界面)绝对可以用的!!!!! 基于Python+OpenCV+PyQt5车牌识别(GUI界面) 参考文档

  5. java识别图片中的图形形状_基于Java+OpenCV技术对几何图像颜色与形状识别

    基于 Java+OpenCV 技术对几何图像颜色与形状识别 杨思阳 黄军 吴春秋 (黔东南民族职业技术学院,贵州 凯里 556000) [摘 要] 通过 Java 调用 OpenCV 视觉库实现几何图 ...

  6. 基于python+opencv的图像目标区域自动提取

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 一.提取纸张中的内容 一张照片中的感兴趣区域总是沿着x,y,z三个轴都有一定倾斜(如下图),要 ...

  7. 基于Python+opencv实现的人脸识别系统

    前言:因为python课设我选择的是关于人脸识别的这个课题,然后做出来也是根据一些博客主们的经验,其中自己也踩了一些坑,然后自己也想写一个关于这个课题的一些总结,讲一下在其中存在的一些问题,以及怎样解 ...

  8. 基于python+openCV的中值滤波

    先直接来一个3×3的吧 def median(src_img, filter_size, channels):# 首先,定义一个大小为9的0数组# list = [[0, 0, 0, 0, 0, 0, ...

  9. 基于python+opencv+pyautogui的图像识别点击

    第一次发文没啥经验 很多都是借鉴若有侵权请告知 必更改 开源代码只供学习交流请勿用作其他用途!!! get_img()#这个函数是获取rgb格式屏幕截图,可用于截图一次识别多个元素 imgclick( ...

最新文章

  1. Jquery前端分页插件pagination同步加载和异步加载
  2. 全流程攻略:如何构建人工智能产品?
  3. 思科无线AP胖瘦互转
  4. A53 cache的架构解读
  5. Bear and Finding Criminals
  6. leetcode majority number
  7. AND、OR运算符的组合使用
  8. PHP、C#、通用的DES加密
  9. Java集合框架概述及Collection接口方法讲解
  10. 数据结构和算法详解(四)——五大基本算法思想
  11. 大数据实效_普洱市以“大数据”思维全面提升新时代干部管理监督实效
  12. Python 实验1-8
  13. 教授专栏44 | 李家涛:企业高层性别均衡,发展趋势可憧憬
  14. 英国脱欧 光伏人怎么看?
  15. oracle pl sql面试题,Oracle 面试题库—PL/SQL
  16. 高效治理垃圾渗滤液将成为环保产业的重要支撑力量
  17. 各大互联网公司校园招聘笔试面试题
  18. Ubuntu18.04重启后无法进入图形化界面
  19. 9.5 考试 第三题 奇袭题解(codeforce 526f)
  20. 自动化测试 - 黑马头条测试项目

热门文章

  1. 程序和数据在计算机中用二进制数表示对吗,程序和数据在计算机中用什么表示...
  2. WSL下安装ubuntu 18.04 +meep进行FDTD仿真计算
  3. vue+elementui项目中遇到的坑/难题
  4. IEEE国际智能交通系统大会
  5. uni-app 超详细教程(三)(从菜鸟到大佬)
  6. jpa配置之ddl-auto属性
  7. Java锁?分布式锁?乐观锁?行锁?
  8. 角色权限分配与路由配置
  9. 计算机桌面隔几秒闪一下,win7游戏窗口化隔一段时间就会闪一下屏幕怎么办
  10. 转发:python的八荣八耻