import cv2
import numpy as np
import pytesseract
def cv_show(imgname,img):
cv2.imshow(imgname,img)
cv2.waitKey(0)
cv2.destroyAllWindows() #按左上,右上,右下,左下排序坐标
def order_points(pts):
rec = np.zeros((4,2),dtype='float32')
#找出左上,右下
s = np.sum(pts,axis=1)
rec[0] = pts[np.argmin(s)]
rec[2] = pts[np.argmax(s)]
#找出右上,左下 (x,y) y-x相差最小最大
diff = np.diff(pts)
rec[1] = pts[np.argmin(diff)]
rec[3] = pts[np.argmax(diff)]
return rec #透视变换后的对应坐标
def four_point_wrap(img,pts):
rec = order_points(pts)
tl,tr,br,bl = rec
#找到最大的宽和高
widthA = np.sqrt(((tr[0]-tl[0])**2)+((tr[1]-tl[1])**2))
widthB = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
width = max(int(widthB),int(widthA))
lengthA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
lengthB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
length = max(int(lengthA),int(lengthB))
print('width:{},length:{}'.format(width,length))
#width,length都减去100,完整的图像才会显示出来,小了的话会显示不完整,这一部分笔者也有点困惑
dst = np.array([
(0,0),
(width-100,0),
(width-100,length-100),
(0,length-100)
],dtype='float32')
M = cv2.getPerspectiveTransform(rec,dst)
wrap = cv2.warpPerspective(img,M,(width,length))
return wrap def resize(img,height=None,width=None,inter=cv2.INTER_AREA): #cv2.INIER_AREA 插值方法
dim = None
(h,w) = img.shape[:2]
if width is None and height is None:
return img
if width is None:
r = height / float(h)
dim = (int(w*r),height) else:
r = width / float(h)
dim = (width,int(h*r))
resized = cv2.resize(img,dim,interpolation=inter)
return resized img = cv2.imread('ocrbook.jpg')
print(img.shape)
ratio = img.shape[0]/500.0
orig = img.copy()
#等比例缩小
img = resize(orig,height=400)
#转化成灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# cv_show('gray',gray)
kernel = np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]], np.float32)
kernel1 = np.ones([3,3])
#锐度处理 对于此图像,词操作会使噪音点变多,边缘检测效果变差,故舍弃
# dst = cv2.filter2D(gray, -1, kernel=kernel)
# cv_show('dst',dst)
#高斯模糊
gaussian = cv2.GaussianBlur(gray,(1,1),0)
# cv_show('gaussian',gaussian)
#二值化处理
# thresh = cv2.threshold(gray,20,250,cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
# cv_show('thresh',thresh)
kernel = np.ones([3,3]) #边缘检测
canny = cv2.Canny(gaussian,120,200)
cv_show('canny',canny)
#膨胀操作 使细小的未连接的边缘连接起来,使得图像有封闭区域
dilate = cv2.morphologyEx(canny,cv2.MORPH_DILATE,kernel1,iterations=2)
cv_show('dilate',dilate)
#腐蚀
erode = cv2.morphologyEx(dilate,cv2.MORPH_ERODE,kernel1)
cv_show('erode',erode)
#轮廓检测
cnts = cv2.findContours(erode,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[0]
#按轮廓面积升序排列
cnts = sorted(cnts,key=cv2.contourArea,reverse=True )[:4]
for cnt in cnts:
perix = cv2.arcLength(cnt,True)
print(perix)
approx = cv2.approxPolyDP(cnt,0.03*perix,True)
print('len(approx): ',len(approx))
#找到矩形
if len(approx)==4:
screen = approx
break
cv2.drawContours(img,[screen],-1,(0,25,155),2)
cv_show('cnts',img)
screen = screen.reshape(4,2)*ratio
print(screen)
#透视变换
wraped = four_point_wrap(orig,screen)
cv_show('wrapwd',wraped)
#ocr检测 准确度需要训练
text = pytesseract.image_to_string(wraped)
print(text)

                                                                        

#图片来源百度图片,只为学习交流专用,如有侵权,联系笔者,立刻删除



opencv实战之透视变换的更多相关文章

  1. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

  2. [OpenCV实战]50 用OpenCV制作低成本立体相机

    本文主要讲述利用OpenCV制作低成本立体相机以及如何使用OpenCV创建3D视频,准确来说是模仿双目立体相机,我们通常说立体相机一般是指双目立体相机,就是带两个摄像头的那种(目就是指眼睛,双目就是两 ...

  3. [OpenCV实战]49 对极几何与立体视觉初探

    本文主要介绍对极几何(Epipolar Geometry)与立体视觉(Stereo Vision)的相关知识.对极几何简单点来说,其目的就是描述是两幅视图之间的内部对应关系,用来对立体视觉进行建模,实 ...

  4. [OpenCV实战]48 基于OpenCV实现图像质量评价

    本文主要介绍基于OpenCV contrib中的quality模块实现图像质量评价.图像质量评估Image Quality Analysis简称IQA,主要通过数学度量方法来评价图像质量的好坏. 本文 ...

  5. opencv实战——图像矫正算法深入探讨

    摘要 在机器视觉中,对于图像的处理有时候因为放置的原因导致ROI区域倾斜,这个时候我们会想办法把它纠正为正确的角度视角来,方便下一步的布局分析与文字识别,这个时候通过透视变换就可以取得比较好的裁剪效果 ...

  6. 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存(argparse详细解释)

    将下面文档存为load_display_save.py #-*- coding:utf-8 -*- ap = argparse.ArgumentParser() ap.add_argument(&qu ...

  7. [OpenCV实战]45 基于OpenCV实现图像哈希算法

    目前有许多算法来衡量两幅图像的相似性,本文主要介绍在工程领域最常用的图像相似性算法评价算法:图像哈希算法(img hash).图像哈希算法通过获取图像的哈希值并比较两幅图像的哈希值的汉明距离来衡量两幅 ...

  8. [OpenCV实战]8 深度学习目标检测网络YOLOv3的训练

    目录 1 数据集 1.1 下载openImages雪人数据[约1.5小时] 1.2 训练集测试集拆分 2 Darknet 2.1 下载并构建Darknet 2.2 修改代码以定期保存模型文件 2.3 ...

  9. [OpenCV实战]2 人脸识别算法对比

    在本教程中,我们将讨论各种人脸检测方法,并对各种方法进行比较.下面是主要的人脸检测方法: 1 OpenCV中的Haar Cascade人脸分类器: 2 OpenCV中的深度学习人脸分类器: 3 Dli ...

  10. [OpenCV实战]12 使用深度学习和OpenCV进行手部关键点检测

    目录 1 背景 2 实现 3 结果和代码 4 参考 手部关键点检测是在手指上找到关节以及在给定图像中找到指尖的过程.它类似于在脸部(面部关键点检测)或身体(人体姿势估计)上找到关键点.但是手部检测不同 ...

随机推荐

  1. Jmeter学习:插件

    第三方插件官方下载网址:https://jmeter-plugins.org/install/Install/ 第三方插件官方文档网址:https://jmeter-plugins.org/wiki/ ...

  2. typora破解使用

    1.将example文件夹以及run.exe同时拷贝到typora安装目录下的\Typora\resources\ 里面. 2.然后运行run.exe,会出现一个cmd弹窗,然后会消失,此时,激活码k ...

  3. java常用开发学习网站列表

    持续更新中 kettle国内镜像下载 版本 地址 7.1版本 http://mirror.bit.edu.cn/pentaho/Data%20Integration/ 8.2版本 http://mir ...

  4. oracle数据库安装出现的问题

    根据相关安装教程,安装好oracle后,使用plsql连接时,不能成功连接时: 1.检查相关的环境变量等是否配置正确 2.认真看清楚 oracle客户端的相关配置 3.出现这个问题(我的是没有选择当前 ...

  5. vscode 右键运行php文件到浏览器

    1.安装PHP Server插件 2.在需要打开的文件中右键选择PHP Server:Server project 3.浏览器页面显示

  6. Spring MVC文件上传下载

    Spring MVC文件上传下载 单文件上传 底层是使用Apache fileupload 组件完成上传,Spring MVC对这种方式进行封装. pom.xml <dependency> ...

  7. 用户警告:“importlib-metadata”版本与“setuptools”不兼容。升级importlib-metadata

    Warning: `importlib-metadata` version is incompatible with `setuptools` 解决方案:升级 importlib-metadata 版 ...

  8. ICPC2020 沈阳

    F-Kobolds and Catacombs 牛客网 题意:对于\(n(n<=10^6)\)个数的序列,划分区间,每个区间内部从小到大排序,要求最后整个序列单调不下降,求最多可以划分为多少个区 ...

  9. xen虚拟化技术完全导读_pdf

    链接:https://pan.baidu.com/s/1W3qTgj8ygkdiz7nln802Xw 提取码:g9k3

  10. .NetCore【中间件】API文档Swagger

    Swagger 为API接口生成文档 Core中添加Swagger nuget安装包 install-package Swashbuckle.AspNetCore 注册服务 public void C ...