请选择 进入手机版 | 继续访问电脑版

[python] OpenCV简单标准数字辨认 的完备 实例

[复制链接]
查看95 | 回复10 | 2021-9-13 11:30:13 | 显示全部楼层 |阅读模式

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

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

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

练习 数据为:

OpenCV简单标准数字辨认
的完备
实例

测试数据为:

OpenCV简单标准数字辨认
的完备
实例

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

  1. import sys
  2. import cv2
  3. import numpy as np
  4. ####### training part ###############
  5. samples = np.loadtxt('generalsamples.data',np.float32)
  6. responses = np.loadtxt('generalresponses.data',np.float32)
  7. responses = responses.reshape((responses.size,1))
  8. model = cv2.ml.KNearest_create()
  9. model.train(samples,cv2.ml.ROW_SAMPLE,responses)
  10. def getNum(path):
  11. im = cv2.imread(path)
  12. out = np.zeros(im.shape,np.uint8)
  13. gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
  14. #预处理一下
  15. for i in range(gray.__len__()):
  16. for j in range(gray[0].__len__()):
  17. if gray[i][j] == 0:
  18. gray[i][j] == 255
  19. else:
  20. gray[i][j] == 0
  21. thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
  22. image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
  23. count = 0
  24. numbers = []
  25. for cnt in contours:
  26. if cv2.contourArea(cnt)>80:
  27. [x,y,w,h] = cv2.boundingRect(cnt)
  28. if h>25:
  29. cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
  30. roi = thresh[y:y+h,x:x+w]
  31. roismall = cv2.resize(roi,(30,30))
  32. roismall = roismall.reshape((1,900))
  33. roismall = np.float32(roismall)
  34. retval, results, neigh_resp, dists = model.findNearest(roismall, k = 1)
  35. string = str(int((results[0][0])))
  36. numbers.append(int((results[0][0])))
  37. cv2.putText(out,string,(x,y+h),0,1,(0,255,0))
  38. count += 1
  39. if count == 10:
  40. break
  41. return numbers
  42. numbers = getNum('1.png')
复制代码

OpenCV简单标准数字辨认
的完备
实例

总结

到此这篇关于OpenCV简单标准数字辨认 的文章就先容 到这了,更多相干 OpenCV标准数字辨认 内容请搜索 脚本之家从前 的文章或继续欣赏 下面的相干 文章渴望 大家以后多多支持脚本之家!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

avatar 坏坏的猪蹄肇 | 2021-9-19 04:52:47 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,影视频道的网站所有电影和连续剧都可以免费看的。访问地址:http://tv.mxswl.com
回复

使用道具 举报

avatar earth20011 | 2021-9-26 16:06:12 | 显示全部楼层
很给力!
回复

使用道具 举报

avatar Jacqueline季 | 2021-10-3 19:34:44 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,运动刷步数还是免费刷的,QQ和微信都可以刷,特别好用。访问地址:http://yd.mxswl.com 猫先森网络
回复

使用道具 举报

avatar 找食的麻雀粮 | 2021-10-3 20:27:14 | 显示全部楼层
关注一下!
回复

使用道具 举报

avatar 散粉的火把煌 | 2021-10-4 09:53:10 | 显示全部楼层
很经典,收藏了!
回复

使用道具 举报

avatar 同行866 | 2021-10-15 23:26:50 | 显示全部楼层
admin楼主,我告诉你一个你不知道的的秘密,有一个牛逼的网站,他卖的服务器是永久的,我们的网站用 服务器都是在这家买的,你可以去试试。访问地址:http://fwq.mxswl.com
回复

使用道具 举报

在这个版块混了这么久了,第一次看见这么给你的帖子!
回复

使用道具 举报

admin楼主的头像是本人吗?
回复

使用道具 举报

系统居然说我是在灌水,我有吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则