opencv图像识别算法 opencv图像识别检测( 二 )


opencv图像识别算法 opencv图像识别检测

文章插图

opencv图像识别算法 opencv图像识别检测

文章插图
阈值类型
图片形态学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)
opencv图像识别算法 opencv图像识别检测

文章插图

opencv图像识别算法 opencv图像识别检测

文章插图
代码截图
通过以上操作 。我们已经检测到了条形码的大致位置 。然后使用内核函数获取图片外形的形态学 。并分别执行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进行闭运算 。指的是先进行膨胀操作 。再进行腐蚀操作开运算:表示的是先进行腐蚀 。再进行膨胀操作闭运算:表示先进行膨胀操作 。再进行腐蚀操作
opencv图像识别算法 opencv图像识别检测

文章插图

opencv图像识别算法 opencv图像识别检测

文章插图
cv2.morphologyEx后图片
形态学图片转换完成后 。进行图片的腐蚀与膨胀 。这里主要是获取更精确的外形 。
腐蚀与膨胀属于形态学操作 。所谓的形态学 。就是改变物体的形状 。形象理解一些:腐蚀=变瘦 膨胀=变胖 。主要是采用 cv2.erode() 和 cv2.dilate() 。需要注意一点的是 。腐蚀和膨胀主要针对二值化图像的白色部分
opencv图像识别算法 opencv图像识别检测

文章插图

opencv图像识别算法 opencv图像识别检测

文章插图
腐蚀与膨胀后图片
图片外轮廓的绘制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)
opencv图像识别算法 opencv图像识别检测

文章插图

opencv图像识别算法 opencv图像识别检测

文章插图
代码截图
我们通过以上的步骤 。已经成功锁定图片条形码的位置 。然后使用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]返回矩形的旋转角度

推荐阅读