主页 > 知识库 > OpenCV简单标准数字识别的完整实例

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

热门标签:电话机器人适用业务 郑州智能外呼系统运营商 哈尔滨外呼系统代理商 徐州天音防封电销卡 不错的400电话办理 获客智能电销机器人 南昌办理400电话怎么安装 佛山防封外呼系统收费 湛江电销防封卡

在学习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数字识别案例

标签:安康 绍兴 广西 芜湖 吕梁 怀化 吉安 兰州

巨人网络通讯声明:本文标题《OpenCV简单标准数字识别的完整实例》,本文关键词  OpenCV,简单,标准,数字,识,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《OpenCV简单标准数字识别的完整实例》相关的同类信息!
  • 本页收集关于OpenCV简单标准数字识别的完整实例的相关信息资讯供网民参考!
  • 推荐文章