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. 01_Node的版本管理

    Node的版本管理工具 常见的node的版本管理工具有两种N.NVM 但是他们有一个致命的问题就是不支持Windwos 但是NVM延申了一个nvm-windows的版本,他就可以很好的支持window ...

  2. android修改frameework与service,vendor分区需要替换的文件

    1. 修改framework代码 需要将framework.jar包提供给android studio使用,并替换车机内文件(两种framework.jar不是同一文件,一个是生成文件一个是安卓目录文 ...

  3. uml类图中的+,-,#符号的含义

    描述类的属性的可见性: UML中,可见性分为4级 1.public 公用的 :用+ 前缀表示 ,该属性对所有类可见 2.protected 受保护的:用 # 前缀表示,对该类的子孙可见 3.priva ...

  4. IaaS--云硬盘(何恺铎《深入浅出云计算》笔记整理)

    [概念] 云硬盘,又叫做"云盘"或者"云磁盘",就是云虚拟机上可以挂载和使用的硬盘.这里,它既包含了用于承载操作系统的系统盘,也包括了承载数据的数据盘.云厂商对 ...

  5. oracle中 null 和 '' 和' '的比对

    SELECT LENGTH(''),LENGTH(NULL),LENGTH(' '),LENGTH(TRIM(' ')) FROM dual; 返回结果为 null,null,1,null 也就是在o ...

  6. 服务器IPMI地址及用户名密码

    HP管理口:ILO默认用户/密码:Administrator/passwordHP以前管理口登陆MP卡通过网线连接MP卡的RJ-45口,通过telnet方式登录,默认用户/密码:Admin/Admin ...

  7. linux kernel 常用函数记录

    offsetof是用来判断结构体中成员的偏移位置 container_of宏用来根据成员的地址来获取结构体的地址 bitwise 是用来确保不同位方式类型不会被弄混 (小端模式,大端模式,cpu 尾模 ...

  8. 嵌入式Linux应用开发

    3-4 Makefile常用的函数 i.  $(foreach var,list,text) 简单地说,就是 for each var in list, change it to text. 对lis ...

  9. acl规则问题

    在acl规则中网络地址与广播地址包含在规则范围内

  10. Flume实现写入es

    Flume定制elasticsearch sink源码 最近尝试通过Flume将消息写入elasticsearch,但是flume并没有对每个es版本提供支持,仅仅保留了对0.9版本支持,可能是由于e ...