阿里网站备案寄材料,柳州免费做网站的公司,php开发手机网站,wordpress 自定义字段今天看到一篇关于条形码检测的文章#xff0c;还是存在一些问题的#xff0c;昨天我陪朋友去取快递的时候#xff0c;看到了关于条形码检测在现实场景中的应用#xff0c;于是#xff0c;便想着实现一波#xff0c;并且对程序中的一些问题做了一些修改。
首先要确定调用… 今天看到一篇关于条形码检测的文章还是存在一些问题的昨天我陪朋友去取快递的时候看到了关于条形码检测在现实场景中的应用于是便想着实现一波并且对程序中的一些问题做了一些修改。
首先要确定调用的包/库的版本这是在我电脑上程序的运行环境在今后的文章中我会特别注意版本问题这个非常重要
python3.6 win 10numpy 1.16.2imutils 0.5.2opencv 4.1.0图片来源于百度一、导入需要用到的包/库
import numpy as np
import imutils
import cv2
二、转化为灰度图
一般对图像的处理操作都是在灰度图的基础上进行的。
image cv2.imread(D:\image.jpg)
gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 三、使用Scharr算子进行边缘检测 条形码一般具有以下特点矩形形状条带是黑色背景为白色而且黑白相间。这就导致条形码区域光暗变化明显这对于Scharr算子非常合适因为Scharr算子对于图像梯度的变化更加敏感更有利于获取条形码的特征。
想要了解更多的边缘检测算法可以查看我的这篇博客https://blog.csdn.net/qq_40962368/article/details/81416954
ddepth cv2.CV_32F if imutils.is_cv2() else cv2.CV_32F
gradX cv2.Sobel(gray, ddepthddepth, dx1, dy0, ksize-1)
gradY cv2.Sobel(gray, ddepthddepth, dx0, dy1, ksize-1)
gradient cv2.subtract(gradX,gradY)
gradient cv2.convertScaleAbs(gradient) 四、去除噪声 1模糊与阈值化处理 通过均值滤波对图像进行模糊处理通过阈值化处理将图像转化为二值图像。以此来去除图像中的绝大部分噪声。cv2.threshold函数的第二个参数是为阈值化处理所设置的阈值为了尽可能的去除噪声所以尽量将此值设置的大一些但不能过大以免影响条形码特征本身。
关于更多的OpenCV中阈值分割的方法可以查看我的这篇博客https://blog.csdn.net/qq_40962368/article/details/80917250
blurred cv2.blur(gradient,(9, 9))
(_, thresh) cv2.threshold(blurred, 231, 255, cv2.THRESH_BINARY) 2形态学处理 通过形态学处理去除图像细小的噪声斑点。使用cv2.getStructuringElement函数定义结构元素经过一个开运算再经过四次腐蚀与四次膨胀更好的去除噪声。
关于形态学的操作一些方法可以查看我的这篇博客https://blog.csdn.net/qq_40962368/article/details/81276820
kernel cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
closed cv2.erode(closed, None, iterations4)
closed cv2.dilate(closed, None, iterations4) 五、确定检测轮廓画出检测框 OpenCV中提供了识别图像区域的函数非常好用找相应的区域根据区域大小进行排序保留最大的区域该区域就是我们要找的条形码区域。计算该轮廓的旋转边界框确定位置信息画出检测框。
cnts cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts imutils.grab_contours(cnts)
c sorted(cnts, keycv2.contourArea, reverseTrue)[0]rect cv2.minAreaRect(c)
box cv2.boxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)
box np.int0(box)cv2.drawContours(image, [box], -1, (0, 255, 0), 3)
cv2.imshow(Image, image)
cv2.waitKey(0)
cv2.destroyAllWindows() 总结从检测结果来看在特定的应用场景下检测效果还是挺好的但不适合应用于所有的应用场景但我们可以从条形码的检测过程可以看出解决这类问题的一般想法为以后解决类似的问题提供一种比较可靠的思路。 参考网址https://www.pyimagesearch.com/2014/11/24detecting-barcodes-images-python-opencv/