计算机视觉实战项目——基于OpenCV的条形码区域分割

        计算机视觉实战项目——基于OpenCV的条形码区域分割

摘要:

本项目将讲解如何从一副图片中分割出含有条形码的区域,并使用矩形框来进行标注。

开发环境:

python3.7、OpenCV3图像处理库、pycharm

开发流程:

1、导入我们要用到的包

import cv2    # OpenCV
import matplotlib.pyplot as plt    # 绘制图像用到的包
import numpy as np    # 在进行黑帽运算、阈值处理、膨胀、闭运算时会用到

2、读取二维码图片

image = cv2.imread('./image/barcodes.jpg', cv2.IMREAD_GRAYSCALE)
 # cv2.IMREAD_GRAYSCALE读取一副灰度图
image_out = cv2.imread('image/barcodes.jpg')    # 后期重新读取图片用矩形标注二维码区域

 

读取出的图像

 

3、改变图片尺寸

scale = 800.0 / image.shape[1]
image = cv2.resize(image, (int(image.shape[1] * scale), int(image.shape[0] * scale)))#重新定义图片大小

4、对图像进行二值化运算,使用黑帽运算符增加较暗的图像元素。使用简单的全局阈值对图像进行二值化处理。黑帽运算符可以使我们获得非常低的阈值,从而不必过多的关注噪声。

kernel = np.ones((1,3), np.uint8)   # 创建一个一行三列的1矩阵  [[1,1,1]]
image = cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel, anchor=(1,0))   # 黑帽运算
thresh, image = cv2.threshold(image, 10, 255, cv2.THRESH_BINARY)    # 阈值处理,此处设置阈值为10,填充色为255,阈值类型设为二值化化,大于阈值使用255填充,小于阈值设为0
黑帽运算+阈值处理
 

5、对图像做膨胀运算和闭运算

kernel = np.ones((1,5), np.uint8)
image = cv2.morphologyEx(image, cv2.MORPH_DILATE, kernel, anchor=(2, 0), iterations=2)  # 膨胀运算
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel, anchor=(2, 0), iterations=2)   # 闭运算
膨胀+闭运算

6、使用很大的内核进行开运算,从而删除太少而无法适合条形码形状的元素

kernel = np.ones((21,35), np.uint8)
image = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel, iterations=1)
35*21内核开运算

7、检测二维码的轮廓

contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 只检测外轮廓,存储所有的轮廓点,相邻的两个点的像素差不超过1
# contours:轮廓本身,type:list; hierarchy:每条轮廓对应的属性,type:ndarray

8、过滤噪声,绘制轮廓

unscale = 1.0 / scale
if contours != None:    # 判断检测出的轮廓列表是否为空
    for contour in contours:    # 循环读取每个轮廓
        if cv2.contourArea(contour) <= 2000:    # 计算轮廓面积,如果小于2000,就丢弃掉,继续读取下一个轮廓
            continue
        rect = cv2.minAreaRect(contour) # 计算每个轮廓包含点集的最小面积
        # minAreaRect()返回一个Box2D结构rect:(最小外接矩形的中心(x,y),(宽度,高度),旋转角度)
        rect = ((int(rect[0][0] * unscale), int(rect[0][1] * unscale)),
                (int(rect[1][0] * unscale), int(rect[1][1] * unscale)),
                rect[2])
        box = np.int0(cv2.boxPoints(rect))  # 获取到外接矩形的四个顶点坐标
        cv2.drawContours(image_out, [box], 0, (0, 255, 0), thickness=2) # 绘制轮廓,(指明在哪幅图片上绘制轮廓,轮廓本身-是一个list,指明绘制轮廓的list中的哪条轮廓,线条颜色,线条宽度)

9、绘制图像,将标注完二维码轮廓的图像保存下来

plt.imshow(image_out)
cv2.imwrite('image/out.jpg', image_out)

结果:

二维码区域分割后的图片

结语:

至此,二维码区域分割已完成。虽然在此测试图像上表现比较好,但是此方法存在一些问题:

(1)他对条形码偏斜非常敏感,它可以很好地工作到45度,然后必须执行第二遍,修改内核的方向

(2)他只能在固定尺寸范围内找到条形码

(3)过滤效果差,仍然不能过滤掉某些非条形码

解决方法:将条形码特征输入给神经网络,并在第二时刻过滤掉噪声。

参考文章:https://blog.csdn.net/qq_42722197/article/details/108971078

完整项目下载:Github下载:https://github.com/Mr-Zhang-915/computer-vision/tree/master/tesk4-%E5%9F%BA%E4%BA%8EOpenCV%E7%9A%84%E6%9D%A1%E5%BD%A2%E7%A0%81%E5%8C%BA%E5%9F%9F%E5%88%86%E5%89%B2

CSDN下载:https://download.csdn.net/download/qq_39330829/16798820

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: OpenCV 4.5计算机视觉开发实战是一本基于VC的实用教材,主要介绍了OpenCV计算机视觉领域的应用和开发,适合开发人员、学生和研究者深入学习和应用计算机视觉技术。 本书主要介绍OpenCV库的基本知识,包括图像和视频处理、特征提取、计算机视觉算法和应用等。此外,书中还提供了大量的代码示例和实战案例,可帮助读者更好地理解和掌握OpenCV技术。 在本书的学习过程中,读者需要了解一些基本的计算机视觉知识和C++编程基础,同时需要了解Visual Studio编译器和OpenCV库的基础知识。 总之,本书是一本非常实用的计算机视觉开发教材,能够让读者深入了解OpenCV技术,并掌握如何使用该技术开发实用的计算机视觉应用程序。 ### 回答2: 《OpenCV 4.5计算机视觉开发实战(基于VC)pdf》是一本关于计算机视觉开发的实践指南,针对OpenCV 4.5版本进行讲解。OpenCV是一个开源的计算机视觉库,通过使用该库的各种功能和算法,开发者可以实现从图像处理到目标检测、跟踪和识别等多种计算机视觉任务。 这本书以基于VC(Visual C++)的开发环境为例,介绍了如何使用OpenCV库进行图像处理和计算机视觉开发。书中包括了基本的图像处理操作,如图像加载、保存、缩放、旋转和滤波等,并且讲解了如何使用OpenCV的特征检测算法,如SIFT、SURF和ORB等。 此外,本书还介绍了如何进行目标检测和跟踪,包括使用Haar特征级联分类器和HOG特征+SVM分类器进行物体检测,以及使用卡尔曼滤波器进行物体跟踪。另外,书中还包含了人脸检测和识别的内容,包括使用人脸级联分类器和特征描述子进行人脸检测,以及使用人脸识别算法进行人脸识别。 总之,这本书通过实例和案例的详细讲解,从基本的图像处理到高级的目标检测和人脸识别等计算机视觉任务,帮助读者掌握OpenCV的开发技巧和实践经验。通过学习这本书,读者可以快速入门OpenCV的开发,从而在计算机视觉领域有更深入的实践和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值