opencv图像识别算法(Opencv图像识别从零到精通)
首发

opencv图像识别算法(Opencv图像识别从零到精通)

优质
请用语音读文章

计算机视觉。我们前期文章分享了很多关于类似这方面的文章。包括人脸识别三部曲。目标检测。目标追踪等。本期文章。我们介绍一下如何使用opencv来进行条形码的检测。毕竟超市里面的物品都是有价格条形码。如何进行opencv条形码的检测。便成了无人超市需要重点关注并需要解决的问题

opencv条形码的检测

opencv条形码的检测

importnumpyasnp
importcv2
image=cv2.imread("11.jpg")
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

首先我们导入需要进行检测的图片。并把RGB颜色空间的图片转换成灰度照片

代码截图

ddepth=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)
gradient=cv2.subtract(gradX,gradY)
gradient=cv2.convertScaleAbs(gradient)
blurred=cv2.blur(gradient,(9,9))
(_,thresh)=cv2.threshold(blurred,225,255,cv2.THRESH_BINARY)

然后。我们使用cv.sobel算子进行图片的X Y 轴的边缘检测。并使用cv2.subtract(gradX, gradY)计算图片的梯度。以Sobel算子计算x。y方向上的梯度。之后在x方向上减去y方向上的梯度。通过这个减法。我们留下具有高水平梯度和低垂直梯度的图像区域。然后cv2.convertScaleAbs返回图片的unit8格式。参考图片如下。

高水平梯度和低垂直梯度的图像区域

函数原型:
dst=cv2.Sobel(src,ddepth,dx,dy[,dst[,ksize[,scale[,delta[,borderType]]]]])

函数参数

  1. src – 需要处理的图像

  2. ddepth – 图像的深度。-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度

  3. dx – 对x轴方向求导的阶数。一般为0、1、2。其中0表示这个方向上没有求导

  4. dy – 对y轴方向求导的阶数。一般为0、1、2。其中0表示这个方向上没有求导

  5. dst – 目标图像

  6. ksize – Sobel算子的大小。必须为1、3、5、7

  7. scale – 缩放导数的比例常数。默认情况下没有伸缩系数

  8. delta – 可选增量。 将会加到最终的dst中。同样。默认情况下没有额外的值加到dst中

  9. borderType – 图像边界的模式。这个参数默认值为cv2.BORDER_DEFAUL

在经过处理后。需要用convertScaleAbs()函数将其转回原来的uint8形式。否则将无法显示图像。而只是一副灰色的窗口。

函数原型:dst=cv2.convertScaleAbs(src[,dst[,alpha[,beta]]])
其中可选参数alpha是伸缩系数。beta是加到结果上的一个值。结果返回uint8类型的图片
#absX=cv2.convertScaleAbs(x)#转回uint8
#absY=cv2.convertScaleAbs(y)

代码截图

在图像的读取中。会存在一些噪噪声点。如一些白噪声。因此我们需要进行去噪操作

opencv4种去噪操作

1.cv2.blur(均值滤波)
2.cv2.boxfilter(方框滤波)
3.cv2.Guassiannblur(进行高斯滤波)
4.cv2.medianBlur(进行中值滤波)

1.cv2.blur(img,(3,3))进行均值滤波
参数说明:img表示输入的图片。(3,3)表示进行均值滤波的方框大小

2.cv2.boxfilter(img,-1,(3,3),normalize=True)表示进行方框滤波。
参数说明当normalize=True时。与均值滤波结果相同。normalize=False。
表示对加和后的结果不进行平均操作。大于255的使用255表示

3.cv2.Guassianblur(img,(3,3),1)表示进行高斯滤波。
参数说明:1表示σ。x表示与当前值得距离。计算出的G(x)表示权重值

4.cv2.medianBlur(img,3)#中值滤波。相当于将9个值进行排序。取中值作为当前值
参数说明:img表示当前的图片。3表示当前的方框尺寸

阈值处理(cv2.threshold) 后图片

opencv: 阈值处理(cv2.threshold)

cv2.threshold(src,thresh,maxval,type)
src:源图片。必须是单通道
thresh:阈值。取值范围0~255
maxval:填充色。取值范围0~255
type:阈值类型。具体见下表

阈值类型

图片形态学

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)

代码截图

通过以上操作。我们已经检测到了条形码的大致位置。然后使用内核函数获取图片外形的形态学。并分别执行4次形态学腐蚀与膨胀。获取更精确的图片形状位置

kernel=cv2.getStructuringElement这个函数的第一个参数表示内核的形状。
有三种形状可以选择
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIpsE;

第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前。先定义一个Mat类型的变量来获得

getStructuringElement函数的返回值: 对于锚点的位置。有默认值Point(-1,-1)。表示锚点位于中心点。element形状唯一依赖锚点位置。其他情况下。锚点只是影响了形态学运算结果的偏移。

cv2.morphologyEx(src,op,kernel)进行各类形态学的变化
参数说明:
src传入的图片
op进行变化的方式
kernel表示方框的大小
2.op=cv2.MORPH_OPEN进行开运算。指的是先进行腐蚀操作。再进行膨胀操作
3.op=cv2.MORPH_CLOSE进行闭运算。指的是先进行膨胀操作。再进行腐蚀操作
开运算:表示的是先进行腐蚀。再进行膨胀操作
闭运算:表示先进行膨胀操作。再进行腐蚀操作

cv2.morphologyEx后图片

形态学图片转换完成后。进行图片的腐蚀与膨胀。这里主要是获取更精确的外形。

腐蚀与膨胀属于形态学操作。所谓的形态学。就是改变物体的形状。形象理解一些:腐蚀=变瘦 膨胀=变胖。主要是采用 cv2.erode()cv2.dilate()。需要注意一点的是。腐蚀和膨胀主要针对二值化图像的白色部分

腐蚀与膨胀后图片

图片外轮廓的绘制

cnts=cv2.findContours(closed.copy(),cv2.RETR_EXTERNAL,
	cv2.CHAIN_appROX_SIMPLE)
cnts=cnts[0]
c=sorted(cnts,key=cv2.contourArea,reverse=True)[0]
rect=cv2.minAreaRect(c)
box=cv2.boxPoints(rect)
box=np.int0(box)
cv2.drawContours(image,[box],-1,(0,255,0),3)
cv2.imshow("Image",image)
cv2.waitKey(0)

代码截图

我们通过以上的步骤。已经成功锁定图片条形码的位置。然后使用cv2.findContours函数找到图片的外形。并画出图片的外形。

(_,cnts,_)=cv2.findContours(
参数一:二值化图像
closed.copy(),
参数二:轮廓类型
#cv2.RETR_EXTERNAL,#表示只检测外轮廓
#cv2.RETR_CCOMP,#建立两个等级的轮廓,上一层是边界
#cv2.RETR_LIST,#检测的轮廓不建立等级关系
#cv2.RETR_TREE,#建立一个等级树结构的轮廓
#cv2.CHAIN_APPROX_NONE,#存储所有的轮廓点。相邻的两个点的像素位置差不超过1
参数三:处理近似方法
#cv2.CHAIN_APPROX_SIMPLE,#例如一个矩形轮廓只需4个点来保存轮廓信息
#cv2.CHAIN_APPROX_TC89_L1,
#cv2.CHAIN_APPROX_TC89_KCOS
)

然后对找到的所有轮廓点进行重新排序

sorted(iterable,key=None,reverse=False)
参数说明:
iterable--可迭代对象。
key--主要是用来进行比较的元素。只有一个参数。具体的函数的参数就是取自于可迭代对象中。
指定可迭代对象中的一个元素来进行排序。
reverse--排序规则。reverse=True降序。reverse=False升序(默认)。
返回值
返回重新排序的列表。

排序完成后的list传递给cv2.minAreaRect(Points)函数

其中points是点集。数据类型为ndarray。array((x1,y1),(x2,y2),….,(xn,yn))

而minAreaRect就是求出在上述点集下的最小面积矩形

rect[0]返回矩形的中心。(x,y)。实际上为y行x列的像素点

利用cv2.boxPoints(rect)可以返回矩形四个点的值。
其中cv2.boxPoints(rect)[0]为point[0]。
cv2.boxPoints(rect)[1]为point[1].
rect[1]返回矩形的长和宽
rect[2]返回矩形的旋转角度

有了box的外形4个图形点。便可以使用cv2.drawContours函数把4个点连接起来。形成一个矩形轮廓。最后显示图片

opencv条形码的检测

以上就是由优质生活领域创作者 生活常识网 整理编辑的,如果觉得有帮助欢迎收藏转发~

分享到 :
相关推荐

回首往事感慨的句子(关于回首往事的优美句子)

请用语音读文章一、回忆是一点一点积累起来的。就如一个剧本。每个人都是故事里的主角。[...

透蜜八方美白祛斑霜有效果吗(剑网三新手纯小白攻略)

请用语音读文章色斑一直以来都是妹子们护肤之路上的一大敌人。随着年龄的不断增长。色斑[...

好看的多肉植物排行榜(最好看的多肉植物排行)

请用语音读文章多肉植物是植物的一种。和普通的植物相比。多肉植物的叶片非常肥厚多汁。[...

火影忍者忍术中文谐音(附:火影忍者的手势和口诀)

请用语音读文章有人曾说日本国就是秦王嬴政派出去寻找长生不老药徐福的后代。不过这种说[...

发表评论

您的电子邮箱地址不会被公开。