计算机视觉-OpenCV(文档扫描OCR识别)
一、边缘检测
二、获取轮廓
三、变换
四、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识别)相关推荐
- 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)
人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...
- 计算机视觉项目-文档扫描OCR识别
- OpenCV计算机视觉实战(Python)| 10、项目实战:文档扫描OCR识别
文章目录 简介 总结 1. 介绍 2. 流程 3. 程序 4. 知识点总结 简介 本节为<OpenCV计算机视觉实战(Python)>版第10讲,项目实战:文档扫描OCR识别,的总结. 总 ...
- 文档扫描OCR识别-2
凯哥英语视频 文档扫描OCR识别-2 凯哥英语视频 1.现有资源梳理 2.实现方案规划 预处理 预测 3.代码实现 注意点 模型安装和其他 结语 1.现有资源梳理 文档扫描OCR识别-1 中处理好的图 ...
- opencv项目实战(2)——文档扫描OCR识别
文章目录 思路 文档扫描 代码 运行结果 文字识别 预处理 代码 运行结果 Debug 记录 思路 STEP 1: 边缘检测 STEP 2: 获取轮廓 STEP 3: 变换 文档扫描 代码 scan. ...
- 项目实战——文档扫描OCR识别
扫描全能王的实现,maybe 目录 一.文档扫描 1.引入所需要的库 2.图像的读取与预处理 读取图像 图像reszie, 图像灰度化.滤波.边缘检测. 3.轮廓检测 4.透视与二值变换 二.文字识别 ...
- 【实战】OpenCV+Python项目实战--文档扫描OCR识别
文章目录 1 准备工作(python) 1.1 np.diff用法 1.2 tesseract和pytesseract安装 2代码实现 2.1 文档提取与摆正 2.2 OCR扫描 1 准备工作(pyt ...
- opencv项目实战(二)——文档扫描OCR识别
一.项目描述 二.代码详解 2.1 预定义参数 2.2 辅助函数 2.3 文档矫正 2.4 文档识别 三.项目完整代码 一.项目描述 目的 将图片中的文档矫正,并识别文档内容 输入与输出 方法流程 核 ...
- opencv图像处理—项目实战:文档扫描OCR识别
目录 1.边缘检测 2.获取轮廓 3.变换 4.tesseract-OCR安装配置 5.使用pycharm运行检测 出现错误 1 出现错误2 出现错误3 出现问题4 完整代码 # 导入工具包 impo ...
最新文章
- 一步步学习SpringBoot(一) 快速搭建一个web
- 计算2个时间之间经过多少Ticks
- SQL SERVER 2008 SN
- 创建一个CentOS 7的模板
- mysql语言的创建模式文件_南开17春学期《数据库应用系统设计》在线作业 免费答案...
- 开发技巧汇总|对于imag.js你不知道的事
- echarts 柱状图如何不顶格_echarts柱状图如何中间对齐而不是底部对齐?
- mysql隐藏文件一定要删除彻底
- CTF 栅栏加密解密----python代码实现
- 固态和机械硬盘组raid_相同大小的固态硬盘和机械硬盘组RAID1会不会影响固态硬盘的速度?...
- ZBrush与数位板雕刻模型如何才能结合
- CSS固定定位 将模块固定到版心右边
- android画板过程分析,Android涂鸦画板原理详解——从初级到高级(二)
- SaaS模式、技术与案例详解——第17章 案例详解
- 基于SSM的概念可视化程序设计学习系统毕业设计源码021009
- JavaScript高级程序设计读书笔记(第6章面向对象的程序设计之创建对象)
- Unity3D游戏开发案例学习——Tanks!(基本完结)
- 必要转载 1927年12月31日午夜一秒谜案
- 编译报错unable to initialize decompress status for section .debug_info
- 【极术通讯】2022年十大科技应用趋势