• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    OpenCV简单标准数字识别的完整实例

    在学习openCV时,看到一个问答做数字识别,里面配有代码,应用到了openCV里面的ml包,很有学习价值。

    https://stackoverflow.com/questions/9413216/simple-digit-recognition-ocr-in-opencv-python#

    import sys
    import numpy as np
    import cv2
     
    im = cv2.imread('t.png')
    im3 = im.copy()
     
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)   #先转换为灰度图才能够使用图像阈值化
     
    thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)  #自适应阈值化
     
    ##################      Now finding Contours         ###################
    # 
    image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
    #边缘查找,找到数字框,但存在误判
     
    samples =  np.empty((0,900))    #将每一个识别到的数字所有像素点作为特征,储存到一个30*30的矩阵内
    responses = []                  #label
    keys = [i for i in range(48,58)]    #48-58为ASCII码
    count =0
    for cnt in contours:
        if cv2.contourArea(cnt)>80:     #使用边缘面积过滤较小边缘框
            [x,y,w,h] = cv2.boundingRect(cnt)   
            if  h>25 and h  30:        #使用高过滤小框和大框
                count+=1
                cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),2)
                roi = thresh[y:y+h,x:x+w]
                roismall = cv2.resize(roi,(30,30))
                cv2.imshow('norm',im)
                key = cv2.waitKey(0)
                if key == 27:  # (escape to quit)
                    sys.exit()
                elif key in keys:
                    responses.append(int(chr(key)))
                    sample = roismall.reshape((1,900))
                    samples = np.append(samples,sample,0)
                if count == 100:        #过滤一下过多边缘框,后期可能会尝试极大抑制
                    break
    responses = np.array(responses,np.float32)
    responses = responses.reshape((responses.size,1))
    print ("training complete")
     
    np.savetxt('generalsamples.data',samples)
    np.savetxt('generalresponses.data',responses)
    #
    cv2.waitKey()
    cv2.destroyAllWindows()

    训练数据为:

    测试数据为:

    使用openCV自带的ML包,KNearest算法

     
    import sys
    import cv2
    import numpy as np
     #######   training part    ############### 
    samples = np.loadtxt('generalsamples.data',np.float32)
    responses = np.loadtxt('generalresponses.data',np.float32)
    responses = responses.reshape((responses.size,1))
     
    model = cv2.ml.KNearest_create()
    model.train(samples,cv2.ml.ROW_SAMPLE,responses)
     
     
    def getNum(path):
        im = cv2.imread(path)
        out = np.zeros(im.shape,np.uint8)
        gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
        
        #预处理一下
        for i in range(gray.__len__()):
            for j in range(gray[0].__len__()):
                if gray[i][j] == 0:
                    gray[i][j] == 255
                else:
                    gray[i][j] == 0
        thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
         
        image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
        count = 0 
        numbers = []
        for cnt in contours:
            if cv2.contourArea(cnt)>80:
                [x,y,w,h] = cv2.boundingRect(cnt)
                if  h>25:
                    cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
                    roi = thresh[y:y+h,x:x+w]
                    roismall = cv2.resize(roi,(30,30))
                    roismall = roismall.reshape((1,900))
                    roismall = np.float32(roismall)
                    retval, results, neigh_resp, dists = model.findNearest(roismall, k = 1)
                    string = str(int((results[0][0])))
                    numbers.append(int((results[0][0])))
                    cv2.putText(out,string,(x,y+h),0,1,(0,255,0))
                    count += 1
            if count == 10:
                break
        return numbers
     
    numbers = getNum('1.png')

    总结

    到此这篇关于OpenCV简单标准数字识别的文章就介绍到这了,更多相关OpenCV标准数字识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • python opencv实现信用卡的数字识别
    • Python+Opencv实现数字识别的示例代码
    • python基于OpenCV模板匹配识别图片中的数字
    • 详解Python OpenCV数字识别案例
    上一篇:Python:format格式化字符串详解
    下一篇:超详细注释之OpenCV实现视频实时人脸模糊和人脸马赛克
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    OpenCV简单标准数字识别的完整实例 OpenCV,简单,标准,数字,识,