『工程项目实践』条形码的检测与识别

机器视觉

共 7506字,需浏览 16分钟

 · 2023-01-03

击上方“机器视觉”,点右上角...选择“置顶/星标公众号
接收最新推文!

  • 导读

    • 条形码的检测与识别

    • 工件裂纹、裂缝的“终极克星”,确保工程部件整体性能

    • Basler定制高效解决方案,精准视觉赋能玻璃瓶检测

    • 高速下的极致性能,堡盟机器视觉技术把脉汽车尾翼检测

    • 使用 NVIDIA Jetson 和 VC MIPI® 摄像模组识别和读取雕刻字符

    • 科惠力Coherix 3D Mini微型胶条检测系统

    • 人工智能方向,金融还是CV? 

条形码的检测与识别

前言

在日常生活中,经常会看到条形码的应用,比如超市买东西的生活,图书馆借书的时候。那么这些东西是如何做到准确检测出条形码的位置呢?本篇博文的目标是演示使用计算机视觉和图像处理技术实现条形码的检测。


通过本篇文章的学习,我们能学到的内容包括:

  • 图像处理中常用的一些操作流程,包括滤波、阈值化处理、膨胀、腐蚀和轮廓查找等;

  • 更重要的一点,希望通过这个案例,能够帮助大家建立分析问题和处理问题的思路。

需要注意的是,这个算法并不适用于所有的条形码,但是它应该能给你一个基本的直觉,告诉你应该应用什么类型的技术。


一、条形码的检测


1.1 目标:找到条形码的位置,而去除掉干扰的因素。


1.2 思路:利用条形码的自身特点,一般都是矩形形状,而且条码的条带是黑色的,矩形区域是白色的。


1.3 代码

step 1: 得到只剩下高水平梯度和低垂直梯度的图像区域。


import argparse
import imutils
import cv2

# 构造参数解析并分析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to the image file")
args = vars(ap.parse_args())

image = cv2.imread(args["image"])
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 计算图片 x 和 y 方向的 Scharr 梯度大小
# 使用 Scharr 操作符(这里制定ksize=1)去构造图片在水平和垂直方向上的梯度幅值表示。
ddepth = cv2.cv.CV_32F if imutils.is_cv2() else cv2.CV_32F
gradX = cv2.Sobel(gray, ddepth=ddepth, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gray, ddepth=ddepth, dx=0, dy=1, ksize=-1)

# 用 x 方向的梯度减去 y 方向的梯度 -> 得到只剩下了高水平梯度和低垂直梯度的图像区域。
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
cv2.imwrite('./test_img/gradient.jpg', gradient)


step 2: 如何过滤掉图片中的噪声,重点关注条形码区域。

# 对图片进行模糊和阈值化操作
# 使用一个卷积核大小为 9x9 的均值滤波作用于梯度图片。对图片进行这个操作将有助于平滑图片中的高频噪声。
# 然后将模糊化后的图片进行阈值化,
blurred = cv2.blur(gradient, (9, 9))
cv2.imwrite('./test_img/blurred.jpg', blurred)
(_, thresh) = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)
# thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 5, 3)
cv2.imwrite('./test_img/thresh.jpg', thresh)

# 进行阈值化操作,更加容易的检测出条形码的“斑点”状区域
# 核的宽度大于高度,因此允许我们缩小条形码垂直条带之间的间隙
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
cv2.imwrite('./test_img/closed.jpg', closed)


step 3: 进行腐蚀与膨胀操作,腐蚀操作将会“腐蚀”掉图片中的白色像素点,因此将会清除这些小的斑点,而膨胀操作将会“扩张”剩余的白色像素,并使白色区域变长。如果在腐蚀过程中去除了小的斑点,则在膨胀的过程中不会再次出现。在一系列的腐蚀和膨胀操作之后,这些小斑点已经被成功的移除了,只剩下条形码的区域。





step 4: 最后寻找一下图片中条形码的区域的轮廓。

# 找到阈值化后图片中的轮廓,然后进行根据区域进行排序,仅保留最大区域
cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]

# 计算最大轮廓的旋转边界框
rect = cv2.minAreaRect(c)
box = cv2.cv.BoxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)
box = np.int0(box)

# 在检测到的条形码周围绘制边界框并显示图片
cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
cv2.imwrite('./test_img/bar_det.jpg', image)

二、条形码的识别

识别图片中的条码(pyzbar)及条码图片矫正和增强。


step 1: 导入所需要的包



2.1 正常角度



2.2 180度旋转



2.3 45度旋转

def barcode(gray):
texts = pyzbar.decode(gray)
if not texts:
angle = barcode_angle(gray)
if angle < -45:
angle = -90 - angle
texts = bar(gray, angle)
if not texts:
gray = np.uint8(np.clip((1.1 * gray + 10), 0, 255))
angle = barcode_angle(gray)
if angle < -45:
angle = -90 - angle
texts = bar(gray, angle)
return texts


def bar(image, angle):
gray = image
bar = rotate_bound(gray, 0 - angle)
roi = cv2.cvtColor(bar, cv2.COLOR_BGR2RGB)
texts = pyzbar.decode(roi)
return texts


def barcode_angle(image):
gray = image
ret, binary = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY_INV)
kernel = np.ones((8, 8), np.uint8)
dilation = cv2.dilate(binary, kernel, iterations=1)
erosion = cv2.erode(dilation, kernel, iterations=1)
erosion = cv2.erode(erosion, kernel, iterations=1)
erosion = cv2.erode(erosion, kernel, iterations=1)
contours, hierarchy = cv2.findContours(erosion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
if len(contours) == 0:
rect = [0, 0, 0]
else:
rect = cv2.minAreaRect(contours[0])
return rect[2]


def rotate_bound(image, angle):
(h, w) = image.shape[:2]
(cX, cY) = (w // 2, h // 2)
M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
cos = np.abs(M[0, 0])
sin = np.abs(M[0, 1])
nW = int((h * sin) + (w * cos))
nH = int((h * cos) + (w * sin))
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
return cv2.warpAffine(image, M, (nW, nH))


image = cv2.imread("./test_img/test03.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
texts = barcode(gray)
print(texts)
if not texts:
print("未识别成功")
else:
tt = ''
for text in texts:
tt = text.data.decode("utf-8")
print("识别成功")
print(tt)
仅用于学术分享,版权属于原作者。

工件裂纹、裂缝的“终极克星”,确保工程部件整体性能--机器视觉网 2022-12-28 11:13:13

2022-12-28 11:13:13 来源: 中国机器视觉网

马波斯Tecna泄漏测试解决方案

对于车间生产而言,能否控制部件上的裂纹、裂缝、孔洞或通道等缺陷对生产过程十分重要。这些缺陷会影响工程部件的整体性能。同时,未检测到的泄漏也很可能危及产品的质量,产生不合格产品,进而引发一系列的索赔活动。

泄漏测试的目的

检查、预防和解决质量问题:检查零件的好坏、预防和解决质量问题是泄露测试的首要目的。在初步的质量实验过程中,及时发现有缺陷的部分,可以大幅度提高生产过程可靠性,提高产品质量,避免造成工件浪费、或引发商业索赔。防止出现安全问题:同时,泄漏测试也关乎安全问题。对含有气体或流体的部件进行测试,可以防止材料泄漏损失、避免意外泄漏造成的爆炸、环境污染。

泄漏测试的应用

当前,泄漏测试几乎涵盖了大量生

......长按二维码访问原文

Basler定制高效解决方案,精准视觉赋能玻璃瓶检测--机器视觉网 2022-12-28 11:32:15

2022-12-28 11:32:15 来源: 中国机器视觉网

应用背景

在原玻璃瓶生产线中,经常需要人工对玻璃瓶品质进行检测,但由于生产线速度快,昼夜不停工,工人很容易视觉疲劳,同时伴随着检测精度日益提高,人眼难以充分识别瑕疵,从而造成漏检,严重影响产品质量。

佛山市三力智能设备科技有限公司使用Basler产品和视觉方案,研发生产出视觉检测设备,可快速精准地识别多种玻璃瓶外观缺陷,实现 24小时稳定的产线检测工作,极大地提高了产品出厂品质。

检测需求

瓶口破损、双口、口不足等缺陷;瓶身和瓶底结石,杂质,气泡,脏污,裂纹等缺陷;瓶身尺寸测量。

应用难点

检测速度高,每分钟检测不少于250个玻璃瓶;检测内容复杂,需要多工位多相机同步工作,对触发精度要求高;生产车间温度高,视觉检测设备在高温环境下作业

......长按二维码访问原文

高速下的极致性能,堡盟机器视觉技术把脉汽车尾翼检测--机器视觉网 2022-12-28 13:30:43

2022-12-28 13:30:43 来源: 中国机器视觉网

新年将至,你是不是在想着是时候给自己换一辆配置更好新车了呢?在经历了三年的消费降级后,我们迎来了全面的放开,消费对经济的拉动正在成为明年经济发展的主旋律,而汽车正是拉动城乡居民消费的重要商品之一。堡盟工业视觉产品在汽车行业中有着诸多行业解决方案,而今天我们要介绍的尾翼导流板检测方案正是其中极具创意的解决方案之一。

让汽车性能发挥到极致

汽车尾翼导流板,也叫扰流板,是一种能够在汽车高速行驶下帮助汽车获得稳定姿态的性能型配件,近年来厂商为了能够让车辆拥有更极致的性能往往在出厂即加装了此类配件。

因此,车辆尾翼的选材以及形状设计相对而言就变得非常关键,对于有效降低车辆风阻和车尾空气形成的涡流有着至关重要的作用,但如果这时尾翼出现形状或质量的缺陷很

......长按二维码访问原文

使用 NVIDIA Jetson 和 VC MIPI® 摄像模组识别和读取雕刻字符―技术与应用频道- 视觉系统设计 2022/12/27 23:49:36

挑战:难以读懂的字符

识别和阅读用过的和经常脏的机器零件上的刻字,户外装置中的煤气表等。

解决方案:深度学习和 VC MIPI®

Vision Components和日本 MITECH 集团开发了一种基于 NVIDIA Jetson 纳米处理器板和 VC MIPI®IMX296 相机的解决方案。

MITECH Group:寻找和阅读刻字

在这个手持边缘设备中,VC MIPI®IMX296 相机拍摄物体的图像。NVIDIA Jetson 纳米处理器板上的深度学习算法可以查找和读取刻字(字母和数字0-9),并将结果输出到显示器上。该设备将用于识别金属零件上的数字和字母。特别是在户外应用和在潮湿或肮脏的环境中安装了数年的设备,这些字符通常很难被肉眼识别出来,因此寻找和识别需要花费很长时间。深度学习有助于快速

......长按二维码访问原文

科惠力Coherix 3D Mini微型胶条检测系统―产品聚焦频道- 视觉系统设计 2022/12/28 9:49:47

Coherix 3D Mini微型胶条检测系统,针对0.2~2.5mm的小型精密涂胶应用,能够提供100%稳健的3D在线检测。系统在涂胶的同时实时检测,并提供有关胶条三维数据和位置的实时信息。利用三维可视化技术,更好地控制和优化工艺。

Coherix 3D Mini能够测量胶条的高度、宽度、体积和位置,提供优化点胶过程所需的重要数据。Coherix 3D Mini涂胶检测,安装在点胶喷嘴的周围,配备有四个高速3D传感器,在任意点胶方向提供360°胶条视图,不增加机器人编程的复杂性,也不需要额外的计算机。

Coherix 3D Mini采用特制“光”技术,不惧胶“透明”;强大的3D防错系统无需进一步验证。

结构紧凑,重量轻,机器人携带式安装;支持各种工业协议;不受零部件颜色和环境光变化的影响。

......长按二维码访问原文

人工智能方向,金融还是CV? 2022-12-27 01:41

东南某cv组,现在在家学python

cv已经完蛋了!完蛋了懂吗?师兄师姐找的啥工作我都不想说了,不知道cv能不能去研究所之类的,以后再说吧,总不能东南都失业,做个cv是真emo了,天天调参总觉得啥都不会是个水货

师兄原话:cv算法岗清北华五可以一战,其他的没实习没顶会趁早滚蛋转开发。

今年组内情况:师姐找的软开,师兄没找到满意的准备选调了。

都这吧,不要再给我推这个话题了,现在看见cv就烦。

更:连我的python能力都质疑,我虽然觉得自己渣但也没各位想的那么水,现在晚上一点多了我还在练代码。

信院就那么几个做cv的导师,我也不能再多说了,不过目前我们cv整个组背地里情绪都有点暴躁,原因可能是当时进cv组的都挺优秀的,然而现在卷不过通信的又卷不过计算机,够不着算法岗,旁边IC几个组都是60—70w

......长按二维码访问原文


热门文章推荐:点击直接进入相关文章

001:计算机视觉领域研究资源及期刊、会议介绍

003:120图勾勒全球AI产业完整图谱!

004:Facebook 开源计算机视觉系统,从像素水平理解图像(附论文及代码)

005:想成为机器学习工程师?这份自学指南你值得收藏

006:十一种通用滤波算法

007:图像处理与计算机视觉基础,经典以及最近发展

008:机器人行业深度报告(完整版)

009:从洗衣妹到谷歌首席科学家,她靠孤独改变了人工智能界!

010:工业级机器视觉行业研究报告

011:双远心工业镜头的原理简述

012:如何装备一个学术型的 iPad ?

013:机器视觉系统概述

015:为什么最好的机械臂是7个自由度,而不是6个?

016:史上最给力的技术视频!

017:机器人10大流行编程语言对比,你掌握了哪种?

018:新奇复杂机械原理图!

019:机器人控制系统相关知识大汇集
020:机器人的工作原理,史上最详细的解析!

021:光源选型知识点
022:这才是机械手,这才是自动化,你那算什么?
023:摄像机和镜头的基础知识
024:物联网产业链全景图(附另13大电子行业全景图,必收藏)
025:日本到底强大到什么地步?让人窒息!看后一夜未眠

026:德国机械用行动惊艳全世界:无敌是多么寂寞


一切有为法,如梦幻泡影,如露亦如电,应作如是观!
欢迎转发、留言、点赞、分享,感谢您的支持!
浏览 30
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报