【图像识别】初探数字识别-水表(3)

轮廓检测

之前用的方法还是不能直接分割出待识别的数字区,下面尝试新的方法。

  1. 运用OpenCV findContours函数检测图像所有轮廓;
  2. 对于检测出的轮廓,contourArea限制轮廓所包围的面积的大小;
  3. boundingRect识别出正矩形,通过矩形的宽度和高度筛选出想要的图片区域。

findContours

_,contours,hierarchy = cv2.findContours(thresh3,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
  1. thresh3 是处理过的灰度值矩阵
  2. cv2.RETR_LIST 检测模式,检测所有的轮廓,并且不建立包含被包含的关系。在此模式下,返回量hierarchy向量内所有元素的第3、第4个分量 = -1
  3. cv2.CHAIN_APPROX_SIMPLE 保存模式,仅保存边缘的拐点,例如三角形就保存3个顶点的坐标。
  4. 返回:contours为每个轮廓的点集;hierarchy 向量内每一个元素的4个int型变量,分别表示每个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。
  5. contourArea函数可以得到当前轮廓包含区域的大小,方便轮廓的筛选

boundingRect

for cnt in contours:
    if cv2.contourArea(cnt)>30:  #筛选出面积大于30的轮廓
        [x,y,w,h] = cv2.boundingRect(cnt) #x,y是左上角的坐标,h,w是高和宽
        if  h > 28 and h < 50:  # 根据期望获取区域,即数字区域的实际高度预估28至50之间
            cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
            plt.imshow(im)

限制高度28至50后,效果
在这里插入图片描述

继续限制宽度大于100后效果
在这里插入图片描述

切割识别

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zeo_m/article/details/82288714