在OpenCV里实现条码区域识别的方法示例

yipeiwu_com5年前Python基础

在我们识别条码的过程里,首先要找到条码所在的区域,那么怎么样来找到这个条码的区域呢?如果仔细地观察条码,会发现条码有一个特性,就是水平的梯度和垂值的梯度会不一样,如果进行相减,会发现差值比较大。如果其它位置的图像一般不会这样。利用这个特性,就可以把条码所在区域求出来。

演示的代码如下:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#9073204@qq.com
#
import numpy as np
import cv2
from matplotlib import pyplot as plt
 
#读取图片
img = cv2.imread('barcode6.jpg')
#
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
 
gradX = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=1, dy=0, ksize=-1)
gradY = cv2.Sobel(gray, ddepth=cv2.CV_32F, dx=0, dy=1, ksize=-1)
 
gradient = cv2.subtract(gradX, gradY)
gradient = cv2.convertScaleAbs(gradient)
cv2.imshow('gradient', gradient)
 
blurred = cv2.blur(gradient, (9, 9))
(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)
cv2.imshow('thresh', thresh)
 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
 
closed = cv2.erode(closed, None, iterations = 4)
closed = cv2.dilate(closed, None, iterations = 4)
cv2.imshow('closed', closed)
 
cnts,hierarchy = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,
	cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts, key = cv2.contourArea, reverse = True)[0]
 
#找最大的边框
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
box = np.int0(box)
 
# 画一个找到的方框
cv2.drawContours(img, [box], -1, (0, 255, 0), 3)
  
cv2.imshow('img', img)
 
#
cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

转换为灰度图

X轴梯度减去Y轴梯度求绝对值

经过阈值处理后的图片

经过形态学处理后的图片

最后的输出结果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python调用系统ffmpeg实现视频截图、http发送

python 调用系统ffmpeg进行视频截图,并进行图片http发送ffmpeg ,视频、图片的各种处理。  最近在做视频、图片的版权等深度学习识别,用到了ffmpeg部...

Django框架教程之中间件MiddleWare浅析

前言 Django中的中间件是一个轻量级、底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出。 中间件的设计为开发者提供了一种无侵入式的开发方式,增强...

Python3 Tkinter选择路径功能的实现方法

Python3 Tkinter选择路径功能的实现方法

效果基于Python3。 在自己写小工具的时候因为这个功能纠结了一会儿,这里写个小例子,供有需要的参考。 小例子,就是点击按钮打开路径选择窗口,选择后把值传给Entry输出。 效果预览...

Python中单例模式总结

一、单例模式     a、单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现    ...

Python利用正则表达式实现计算器算法思路解析

  (1)不使用eval()等系统自带的计算方法   (2)实现四则混合运算、括号优先级解析 思路:   1、字符串预处理,将所有空格去除   2、判断是否存在括号运算,若存在进行第3步...