织梦CMS - 轻松建站从此开始!

罗索

实战 | Halcon实例转OpenCV实现-复杂背景下OCR数字识

jackyhwei 发布于 2022-01-27 13:28 点击:次 
本文主要介绍一个复杂背景下OCR数字提取识别实例,并将Halcon实现转为OpenCV。
TAG: OCR  数字识别  

导读

本文主要介绍一个复杂背景下OCR数字提取识别实例,并将Halcon实现转为OpenCV。

实例来源

Halcon例程ocrcolor.hdev,例程代码精简修改如下:

  1. * Author: Color Space 
  2. * 来源-公众号:OpenCV与AI深度学习 
  3. *-------------------------------- 
  4. dev_get_window (WindowHandle) 
  5. read_image (Image, '5.png') 
  6.  
  7. decompose3 (Image, R, G, B) 
  8. trans_from_rgb (R, G, B, H, S, V, 'hsv') 
  9. threshold (B, Regions, 0, 240) 
  10. dilation_circle (Regions, RegionDilation, 4.5) 
  11. connection (RegionDilation, ConnectedRegions) 
  12.  
  13. dev_display (Image) 
  14. select_shape (ConnectedRegions, SelectedRegions, ['width','height'], 'and', [25.86,80.71], [67.84,138.51]) 
  15. sort_region(SelectedRegions, SortedRegions, 'first_point', 'true', 'column') 
  16.  
  17. read_ocr_class_mlp ('Industrial_0-9_NoRej', OCRHandle) 
  18. do_ocr_multi_class_mlp (SortedRegions, B, OCRHandle, RecChar, Confidence) 
  19. area_center (SortedRegions, Area, Row, Column) 
  20. set_display_font (WindowHandle, 27, 'mono', 'true', 'false') 
  21. disp_message (WindowHandle, sum(RecChar), 'window', 32, 24, 'red', 'false') 

实现效果:



OpenCV实现步骤与代码

实现步骤:

【1】分离RGB颜色通道,选择B(蓝色)通道处理;

【2】阈值处理,凸显出数字;

【3】形态学:膨胀 + 腐蚀 ->或直接闭运算,将数字轮廓断开部分连接

【4】轮廓筛选,剔除杂讯

【5】使用PaddleOCR或EasyOCR直接用以上步骤二值图识别。


逐步效果演示与代码:

完整源码:

  1. # Author:Color Space 
  2. # 来源-公众号:OpenCV与AI深度学习 
  3. # -------------------------------- 
  4. import numpy as np 
  5. import cv2 
  6. import easyocr 
  7.  
  8. reader = easyocr.Reader(['en']) 
  9. img = cv2.imread('2.png') 
  10. cv2.imshow('src', img) 
  11.  
  12. B,G,R=cv2.split(img) 
  13.  
  14. ret,threscv2.threshold(B, 230, 255, cv2.THRESH_BINARY_INV) 
  15. cv2.imshow('thres', thres) 
  16.  
  17.  
  18. k1=np.ones((11,11), np.uint8) 
  19. k2=np.ones((9,9), np.uint8) 
  20. thres = cv2.morphologyEx(thres, cv2.MORPH_DILATE, k1) 
  21. thres = cv2.morphologyEx(thres, cv2.MORPH_ERODE, k2) 
  22. cv2.imshow('morph', thres) 
  23. #cv2.imwrite('morph.jpg', thres) 
  24.  
  25. contours,hierarchy = cv2.findContours(thres, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) 
  26. rects = [] 
  27. for cnt in contours: 
  28.   (x, y, w, h) = cv2.boundingRect(cnt) 
  29.   if w>200 or h > 200: 
  30.     #cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),1) 
  31.     cv2.drawContours(thres,cnt,-1,(0,0,0),-1) 
  32.   if w > 10 and w < 70 or h > 50 and h < 90: 
  33.     cv2.drawContours(img,cnt,-1,(255,0,0),2) 
  34. #cv2.imwrite('morph.jpg', thres) 
  35.  
  36. result = reader.readtext(thres) 
  37. if len(result) > 0: 
  38.   for i in range(0,len(result)): 
  39.     pt1 = (tuple(result[i][0][0])) 
  40.     pt2 = (tuple(result[i][0][1])) 
  41.     pt3 = (tuple(result[i][0][2])) 
  42.     pt4 = (tuple(result[i][0][3])) 
  43.     cv2.line(img,pt1,pt2,(0,0,255),2,cv2.LINE_AA) 
  44.     cv2.line(img,pt2,pt3,(0,0,255),2,cv2.LINE_AA) 
  45.     cv2.line(img,pt3,pt4,(0,0,255),2,cv2.LINE_AA) 
  46.     cv2.line(img,pt4,pt1,(0,0,255),2,cv2.LINE_AA) 
  47.     print(result[i][1]) 
  48.     strText = result[i][1].replace(' ','') 
  49.     cv2.putText(img,strText,(pt1[0]+2,pt1[1]-5),0,1.0,(255,0,255),2) 
  50.  
  51. else: 
  52.   print('have not found any text!') 
  53.  
  54. cv2.imshow('result', img) 
  55. cv2.imwrite('result.jpg', img) 
  56.  
  57. cv2.waitKey(0) 
  58. cv2.destroyAllWindows() 
  59. print ('finish') 

 

(Color Space )
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/202201/17853.html]
本文出处:OpenCV与AI深度学习 作者:Color Space 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容