• python+opencv水表识别


    基于大小相似,摆放规整的水表图片的 数字表盘的识别

    识别效果:

    # -*- coding: utf-8 -*-
    """
    Created on Tue Sep 17 19:00:45 2019
    
    @author: xxr
    """
    from cv2 import cv2  #因为cv2里面还有cv2 所以要这样干!
    import numpy as np  
    
    
    #读取原始图片
    image= cv2.imread('shuibiao1.jpg')
    
    #图片的缩小,记住比例 的缩放 
    r = 500.0 / image.shape[1]
    dim = (500, int(image.shape[0] * r))
    image = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
    #图像灰度化处理
    grayImage = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    #基于Canny的边沿检测(生成的也是二值图)
    canny=cv2.Canny(grayImage,30,180)
    cv2.imshow('canny', canny)
    # 运用OpenCV findContours函数检测图像所有轮廓
    contours, hierarchy = cv2.findContours(canny,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
    # 对于检测出的轮廓,contourArea限制轮廓所包围的面积的大小,boundingRect识别出正矩形,通过矩形的宽度和高度筛选出想要的图片区域。
    # count=0
    # minx=10000
    # miny=10000
    # height=0
    # weight=0
    for cnt in contours:
        if cv2.contourArea(cnt)>800:  #筛选出面积大于30的轮廓
            [x,y,w,h] = cv2.boundingRect(cnt) #x,y是左上角的坐标,h,w是高和宽
            if  h > 28 and h < 50:  # 根据期望获取区域,即数字区域的实际高度预估28至50之间
                # if(minx>x):
                #     minx=x
                # if(miny>y):
                #     miny=y
                # count+=1
                # height+=h
                # weight+=w
                cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
    #             #截取特定区域
    # imagehh = image[miny:miny+height,minx:minx+weight]
    
    cv2.imshow("hh",image)
    # print(str(count)+"jjjjjjjj")
    
    
    
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    对水表图片进行的hough(霍夫)直线检测

      1 # -*- coding: utf-8 -*-
      2 """
      3 Created on Tue Sep 17 19:00:45 2019
      4 
      5 @author: xxr
      6 """
      7 from cv2 import cv2  #因为cv2里面还有cv2 所以要这样干!
      8 import numpy as np  
      9 
     10 #读取原始图片
     11 image= cv2.imread('shuibiao.jpg')
     12 
     13 #读入一张白色的图
     14 image2=cv2.imread('white.png')
     15 image3=image2
     16 
     17 #图片的缩小,记住比例 的缩放 
     18 r = 500.0 / image.shape[1]
     19 dim = (500, int(image.shape[0] * r))
     20 image = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
     21 image2=cv2.resize(image2, dim, interpolation = cv2.INTER_AREA)
     22 
     23 #图像灰度化处理
     24 grayImage = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
     25 #基于Canny的边沿检测(生成的也是二值图)
     26 canny=cv2.Canny(grayImage,30,180)
     27 #cv2.imshow("canny_image",canny)
     28 #再canny处理图像以后 用hough直线检测
     29 #统计概率霍夫线变换
     30 
     31 
     32                                #  步长         阈值      最小直线长度    最大构成直线的点的间隔
     33 lines = cv2.HoughLinesP(canny, 1, np.pi / 180, 60, minLineLength=30, maxLineGap=8)
     34 for line in lines:
     35         x1, y1, x2, y2 = line[0]
     36         cv2.line(image2, (x1, y1), (x2, y2), (0, 0, 255), 1)
     37 
     38 
     39 
     40 #这里进行矩形的轮廓检测  !!!应该找 白色的矩形框
     41 image2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
     42 #黑白颜色颠倒
     43 height, width = image2.shape
     44 dst = np.zeros((height,width,1), np.uint8)
     45 for i in range(0, height):
     46     for j in range(0, width):
     47         grayPixel = image2[i, j]
     48         dst[i, j] = 255-grayPixel
     49 
     50 
     51 #高斯滤波(使图像模糊,平滑)
     52 #dst=cv2.GaussianBlur(dst,(7,7),0)
     53 
     54 cv2.imshow('dst', dst)
     55 contours, hierarchy = cv2.findContours(dst,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)
     56 
     57 # #绘制直线
     58 # max=0
     59 # max_i=0
     60 # print(len(contours[2]))
     61 # for i in range(len(contours)):
     62 #         if(5==len(contours[i])):
     63 #                 max_i=i
     64 # cv2.drawContours(image3,contours,-1,(0,255,255),3)
     65 # cv2.imshow("draw_img0", image3)
     66 
     67 # #绘制矩形
     68 # for i in range(0,len(contours)):  
     69 #     x, y, w, h = cv2.boundingRect(contours[i])   
     70 #     cv2.rectangle(image3, (x,y), (x+w,y+h), (153,153,0), 5) 
     71 #cv2.imshow("draw_img0", image3)
     72 
     73 #打印矩形
     74 # for i in range(0,len(contours)):  
     75 #     x, y, w, h = cv2.boundingRect(contours[i])
     76 #     print(contours[0])  
     77 #     cv2.rectangle(image3, (x,y), (x+w,y+h), (255,153,0), 5) 
     78 
     79 #标准霍夫线变换(但在这里不太实用)
     80 # lines = cv2.HoughLines(canny, 1, np.pi/180, 150)
     81 # for line in lines:
     82 #         rho, theta = line[0]  #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
     83 #         a = np.cos(theta)   #theta是弧度
     84 #         b = np.sin(theta)
     85 #         x0 = a * rho    #代表x = r * cos(theta)
     86 #         y0 = b * rho    #代表y = r * sin(theta)
     87 #         x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
     88 #         y1 = int(y0 + 1000 * a)    #计算起始起点纵坐标
     89 #         x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
     90 #         y2 = int(y0 - 1000 * a)    #计算直线终点纵坐标    注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
     91 #         cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)    #点的坐标必须是元组,不能是列表。
     92 # cv2.imshow("image-lines", image)
     93 
     94 # 二值化图片
     95 # #自适应阈值化能够根据图像不同区域亮度分布,改变阈值
     96 # #threshold_pic =  cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 25, 10)
     97 # ret,threshold_pic=cv2.threshold(grayImage,127, 255, cv2.THRESH_BINARY)
     98 # cv2.imshow("threshold_image",threshold_pic)
     99 #等待显示(不添加这两行将会报错)
    100 cv2.waitKey(0)
    101 cv2.destroyAllWindows()
    # -*- coding: utf-8 -*-
    """
    Created on Tue Sep 17 19:00:45 2019

    @author: xxr
    """
    from cv2 import cv2  #因为cv2里面还有cv2 所以要这样干!
    import numpy as np  

    #读取原始图片
    image= cv2.imread('shuibiao.jpg')

    #读入一张白色的图
    image2=cv2.imread('white.png')
    image3=image2

    #图片的缩小,记住比例 的缩放 
    r = 500.0 / image.shape[1]
    dim = (500int(image.shape[0] * r))
    image = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
    image2=cv2.resize(image2, dim, interpolation = cv2.INTER_AREA)

    #图像灰度化处理
    grayImage = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    #基于Canny的边沿检测(生成的也是二值图)
    canny=cv2.Canny(grayImage,30,180)
    #cv2.imshow("canny_image",canny)
    #再canny处理图像以后 用hough直线检测
    #统计概率霍夫线变换


                                   #  步长         阈值      最小直线长度    最大构成直线的点的间隔
    lines = cv2.HoughLinesP(canny, 1, np.pi / 18060minLineLength=30maxLineGap=8)
    for line in lines:
            x1, y1, x2, y2 = line[0]
            cv2.line(image2, (x1, y1), (x2, y2), (00255), 1)



    #这里进行矩形的轮廓检测  !!!应该找 白色的矩形框
    image2 = cv2.cvtColor(image2,cv2.COLOR_BGR2GRAY)
    #黑白颜色颠倒
    height, width = image2.shape
    dst = np.zeros((height,width,1), np.uint8)
    for i in range(0, height):
        for j in range(0, width):
            grayPixel = image2[i, j]
            dst[i, j] = 255-grayPixel


    #高斯滤波(使图像模糊,平滑)
    #dst=cv2.GaussianBlur(dst,(7,7),0)

    cv2.imshow('dst', dst)
    contours, hierarchy = cv2.findContours(dst,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_SIMPLE)

    # #绘制直线
    # max=0
    # max_i=0
    # print(len(contours[2]))
    # for i in range(len(contours)):
    #         if(5==len(contours[i])):
    #                 max_i=i
    # cv2.drawContours(image3,contours,-1,(0,255,255),3)
    # cv2.imshow("draw_img0", image3)

    # #绘制矩形
    # for i in range(0,len(contours)):  
    #     x, y, w, h = cv2.boundingRect(contours[i])   
    #     cv2.rectangle(image3, (x,y), (x+w,y+h), (153,153,0), 5) 
    #cv2.imshow("draw_img0", image3)

    #打印矩形
    # for i in range(0,len(contours)):  
    #     x, y, w, h = cv2.boundingRect(contours[i])
    #     print(contours[0])  
    #     cv2.rectangle(image3, (x,y), (x+w,y+h), (255,153,0), 5) 

    #标准霍夫线变换(但在这里不太实用)
    # lines = cv2.HoughLines(canny, 1, np.pi/180, 150)
    # for line in lines:
    #         rho, theta = line[0]  #line[0]存储的是点到直线的极径和极角,其中极角是弧度表示的。
    #         a = np.cos(theta)   #theta是弧度
    #         b = np.sin(theta)
    #         x0 = a * rho    #代表x = r * cos(theta)
    #         y0 = b * rho    #代表y = r * sin(theta)
    #         x1 = int(x0 + 1000 * (-b)) #计算直线起点横坐标
    #         y1 = int(y0 + 1000 * a)    #计算起始起点纵坐标
    #         x2 = int(x0 - 1000 * (-b)) #计算直线终点横坐标
    #         y2 = int(y0 - 1000 * a)    #计算直线终点纵坐标    注:这里的数值1000给出了画出的线段长度范围大小,数值越小,画出的线段越短,数值越大,画出的线段越长
    #         cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)    #点的坐标必须是元组,不能是列表。
    # cv2.imshow("image-lines", image)

    # 二值化图片
    # #自适应阈值化能够根据图像不同区域亮度分布,改变阈值
    # #threshold_pic =  cv2.adaptiveThreshold(grayImage, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 25, 10)
    # ret,threshold_pic=cv2.threshold(grayImage,127, 255, cv2.THRESH_BINARY)
    # cv2.imshow("threshold_image",threshold_pic)
    #等待显示(不添加这两行将会报错)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


  • 相关阅读:
    MySQL主从复制集群添加slave节点
    GTID主从 与 传统主从复制
    20201207总结
    202011051 每周例行报告
    202011121 每周例行报告
    202010081 每周例行报告
    202011261 每周例行报告
    202010153 每周例行报告
    202010291 每周例行报告
    202011201 每周例行报告
  • 原文地址:https://www.cnblogs.com/kekexxr/p/11574581.html
Copyright © 2020-2023  润新知