PYTHON OPEN-CV 视觉处理
1、具体操作步骤
先将图片转换为灰度图像
通过OTSU转换为二值图像
通过发现轮廓函数,对二值图像使用轮廓发现得到轮廓
根据二维码三个区域的特征,对轮廓进行面积与比例过滤,最终得到结果
2、思路(主要根据二维码的三个顶点来判断)
定位点的轮廓有三层轮廓
每个定位点的轮廓中心点一样的
三个定位点可以围成一个等腰直角三角形
3、存在的问题(以现在摆盘机的扫描情况来看)
只能对单个二维码来进行扫描
只能处理摄像头拍照很清楚的图片进行识别(对imei和二维码的清晰度要求高),拍摄位置的角度偏差比较小,同时考虑光线等元素的干扰
4、针对上面的问题有以下的改善
阈值分割
可以对图像进行腐蚀或者膨胀的处理
扣取所有正方形区域,逐个检测
然后再进行步骤2中的思路来检测,定位
5、涉及到的函数说明
(1)参数说明:
Src:输入图,只能输入单通道图像,通常来说为灰度图
Thresh:阈值
Maxval:当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
Type:二值化操作的类型,包含以下5种类型:
cv2.THRESH_BINARY; (两极化)
cv2.THRESH_BINARY_INV;(对调两极化)
cv2.THRESH_TRUNC; (过度)
cv2.THRESH_TOZERO;(亮色过度)
cv2.THRESH_TOZERO_INV;(对调亮色过度)
(2)返回值:dst 输出图
img, countour,hierarchy =cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])
(1)参数说明:
Image:表示寻找轮廓的图像;
Mode:表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
cv2.RETR_EXTERNAL表示只检测外轮廓
cv2.RETR_LIST检测的轮廓不建立等级关系
cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE建立一个等级树结构的轮廓。
Method:表示轮廓的近似办法
cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法
(2)返回值:
Img:表示返回的图像;
Coutour:是一个list,每个元素都是一个轮廓(彻底围起来算一个轮廓),用numpy中的ndarray表示。
Hierarchy:也是一个ndarry,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。
1、膨胀:调整分割区域的形状以获得比较理想的结果,每一个位置的矩形领域内值的最大值作为该位置的输出灰度值,总体亮度会比原图上升,亮的区域变大,暗的区域减少或消失
2、腐蚀:(类似于膨胀)每一个位置的矩形领域内值的最小值作为该位置的输出灰度值,总体亮度比原图低,亮的区域变小,暗的区域变大
3、opencv 中的层次结构:https://www.kancloud.cn/aollo/aolloopencv/362441
介绍:OpenCV使用一个含有四个元素的数组表示父子关系,【Next,Previous,First_Child,Parent】