一、边缘检测

二、获取轮廓

三、变换

四、OCR识别

import cv2
import numpy as np
import argparse
import pytesseract
import os
from PIL import Image#同比例变化方法
def resize(pic,height):(h,w,s)=pic.shapebili=h/heightimage = cv2.resize(pic, (int(w/bili),height,))return image
#图像显示
def cv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)cv2.destroyAllWindows()
#order_point方法定义
def order_point(pts):#一共四个坐标点,创建一个坐标点都是零的二维点值rect=np.zeros((4,2),dtype="float32")#按顺序找到对应坐标,分别是左上,右上,右下,左下#计算左上,右下#将矩阵中的每一行向量相加s=pts.sum(axis=1)rect[0]=pts[np.argmin(s)]rect[2]=pts[np.argmax(s)]#计算右上和左下diff=np.diff(pts,axis=1)rect[1]=pts[np.argmin(diff)]rect[3] = pts[np.argmax(diff)]return rect#透视变换方法
def four_point_transform(image,pts):#获取坐标点rect=order_point(pts)(tl,tr,br,bl)=rect#计算输入的w和h值widthA=np.sqrt(((br[0]-bl[0])**2)+((br[1]-br[1])**2))widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tr[1]) ** 2))maxWidth=max(int(widthA),int(widthB))heightA=np.sqrt(((tr[0]-br[0])**2)+((tr[1]-br[1])**2))heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))maxHeight=max(int(heightA),int(heightB))#变换后对应坐标位置dst=np.array([[0,0],[maxWidth-1,0],[maxWidth-1,maxHeight-1],[0,maxHeight-1]],dtype="float32")#计算变换矩阵#rect(输入的四个点),dst(输出的四个点),计算变换矩阵MM=cv2.getPerspectiveTransform(rect,dst)#将变换矩阵M带入函数warpPerspective,还有输入坐标计算出最大的宽和高warped=cv2.warpPerspective(image,M,(maxWidth,maxHeight))return warped
#读取图像
image=cv2.imread(r"D:\pythonProject\NewProject\PIc\ID.jpg")
#因为要resize图像,所以要计算resize后图像与原图像大小比例,方便计算坐标
#print(image.shape)#(1060, 881, 3) (h,w,通道数)
ratio=image.shape[0]/500.0
#创建副本
orig=image.copy()#resize大小
image=resize(orig,500)
#print(image.shape)
#cv_show('image',image)#图像预处理
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
gray=cv2.GaussianBlur(gray,(5,5),0)#高斯滤波,去噪音点
edged=cv2.Canny(gray,75,200)#Canny边缘检测,(抛弃弱边缘,留主边缘)#显示预处理结果
print('STEP1:边缘检测')
cv_show('edged',edged)#轮廓检测
cnts,hierarchy=cv2.findContours(edged.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#print(np.array(cnts).shape)
#对检测到轮廓排序,排序方式按面积排序,取前五个,
cnts=sorted(cnts,key=cv2.contourArea,reverse=True)[:5]#遍历每一个轮廓
for c in cnts:#计算轮廓周长peri =cv2.arcLength(c,True)#轮廓近似,c:遍历的轮廓,0.02*peri:近似值(表示从原始轮廓到近似轮廓的最大距离,是一个准确的参数)# 周长的0.02倍,true:表示封闭approx=cv2.approxPolyDP(c,0.02*peri,True)#4个点的时候拿出来#approx是点值#近似成矩形时,有四个点值,为矩形时把点值拿出来if len(approx)==4:screenCnt=approxbreak
#显示结果
print('STEP2:获取轮廓')
cv2.drawContours(image,[screenCnt],-1,(0,255,0),2)
cv_show('image',image)hh=screenCnt.reshape(4,2)*ratio#透视变换 api:
#reshape(4,2): 4表示四个点,2表示每个点都是x,y两个值
#乘ratio表示把坐标还原成原始图像坐标
warped=four_point_transform(orig,screenCnt.reshape(4,2)*ratio)#二值处理
warped=cv2.cvtColor(warped,cv2.COLOR_BGR2GRAY)
ref=cv2.threshold(warped,100,255,cv2.THRESH_BINARY)[1]
cv2.imwrite('scan.png',ref)#展示结果
print("STEP3:变换")
cv_show('ref',ref)filename="{}.png".format(os.getpid())
cv2.imwrite(filename,gray)
#文档扫描
text=pytesseract.image_to_string(filename)
print(text)

计算机视觉-OpenCV(文档扫描OCR识别)相关推荐

  1. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  2. 计算机视觉项目-文档扫描OCR识别

  3. OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别

    文章目录 简介 总结 1. 介绍 2. 流程 3. 程序 4. 知识点总结 简介 本节为<OpenCV计算机视觉实战(Python)>版第10讲,项目实战:文档扫描OCR识别,的总结. 总 ...

  4. 文档扫描OCR识别-2

    凯哥英语视频 文档扫描OCR识别-2 凯哥英语视频 1.现有资源梳理 2.实现方案规划 预处理 预测 3.代码实现 注意点 模型安装和其他 结语 1.现有资源梳理 文档扫描OCR识别-1 中处理好的图 ...

  5. opencv项目实战(2)——文档扫描OCR识别

    文章目录 思路 文档扫描 代码 运行结果 文字识别 预处理 代码 运行结果 Debug 记录 思路 STEP 1: 边缘检测 STEP 2: 获取轮廓 STEP 3: 变换 文档扫描 代码 scan. ...

  6. 项目实战——文档扫描OCR识别

    扫描全能王的实现,maybe 目录 一.文档扫描 1.引入所需要的库 2.图像的读取与预处理 读取图像 图像reszie, 图像灰度化.滤波.边缘检测. 3.轮廓检测 4.透视与二值变换 二.文字识别 ...

  7. 【实战】OpenCV+Python项目实战--文档扫描OCR识别

    文章目录 1 准备工作(python) 1.1 np.diff用法 1.2 tesseract和pytesseract安装 2代码实现 2.1 文档提取与摆正 2.2 OCR扫描 1 准备工作(pyt ...

  8. opencv项目实战(二)——文档扫描OCR识别

    一.项目描述 二.代码详解 2.1 预定义参数 2.2 辅助函数 2.3 文档矫正 2.4 文档识别 三.项目完整代码 一.项目描述 目的 将图片中的文档矫正,并识别文档内容 输入与输出 方法流程 核 ...

  9. opencv图像处理—项目实战:文档扫描OCR识别

    目录 1.边缘检测 2.获取轮廓 3.变换 4.tesseract-OCR安装配置 5.使用pycharm运行检测 出现错误 1 出现错误2 出现错误3 出现问题4 完整代码 # 导入工具包 impo ...

最新文章

  1. 一步步学习SpringBoot(一) 快速搭建一个web
  2. 计算2个时间之间经过多少Ticks
  3. SQL SERVER 2008 SN
  4. 创建一个CentOS 7的模板
  5. mysql语言的创建模式文件_南开17春学期《数据库应用系统设计》在线作业 免费答案...
  6. 开发技巧汇总|对于imag.js你不知道的事
  7. echarts 柱状图如何不顶格_echarts柱状图如何中间对齐而不是底部对齐?
  8. mysql隐藏文件一定要删除彻底
  9. CTF 栅栏加密解密----python代码实现
  10. 固态和机械硬盘组raid_相同大小的固态硬盘和机械硬盘组RAID1会不会影响固态硬盘的速度?...
  11. ZBrush与数位板雕刻模型如何才能结合
  12. CSS固定定位 将模块固定到版心右边
  13. android画板过程分析,Android涂鸦画板原理详解——从初级到高级(二)
  14. SaaS模式、技术与案例详解——第17章 案例详解
  15. 基于SSM的概念可视化程序设计学习系统毕业设计源码021009
  16. JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)
  17. Unity3D游戏开发案例学习——Tanks!(基本完结)
  18. 必要转载 1927年12月31日午夜一秒谜案
  19. 编译报错unable to initialize decompress status for section .debug_info
  20. 【极术通讯】2022年十大科技应用趋势

热门文章

  1. 2017 Android GitHub常用热门开源框架汇总
  2. java初学之运算的隐式转换
  3. 808笔记---小白学Java
  4. 不要仅仅是复制粘贴代码
  5. Matlab-只读取文本的第一行
  6. 用户体验设计笔记(1-1)
  7. 软件测试面试linux笔试题及答案,软件测试人员面试笔试题及答案
  8. 基于微信小程序的校园维修平台
  9. java多线程的6种实现方式详解
  10. 给定直线参数在二维散点数据上绘制直线(Python)