在我们的日常生活中,所碰到的图像往往都有一定的倾斜。那么,如何用OpenCV来获取图像的旋转角度呢?   我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度。

可以看到,该图像存在着许多噪声,且是彩色图片,因此,需要对图像做预处理。

预处理

图像的预处理包括去除边缘,去除噪声(两条灰色线),滤波,二值化等,具体处理的Python代码如下:

# -*- coding: utf-8 -*-

import cv2

imagepath = 'F://CHN_Char/4.png'

img = cv2.imread(imagepath, 1)

# 将图片的边缘变为白色

height, width = img.shape[0:2]

for i in range(width):

img[0, i] = [255]*3

img[height-1, i] = [255]*3

for j in range(height):

img[j, 0] = [255]*3

img[j, width-1] = [255]*3

# 去掉灰色线(即噪声)

for i in range(height):

for j in range(width):

if list(img[i,j]) == [204,213,204]:

img[i,j]=[255]*3

# 把图片转换为灰度模式

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 中值滤波

blur = cv2.medianBlur(gray, 3) # 模板大小3*3

# 二值化

ret,thresh = cv2.threshold(blur, 200, 255, cv2.THRESH_BINARY)

# 保存图片

cv2.imwrite('F://CHN_Char/char_after_bin.png', thresh)

预处理后的图片如下:

可以看到,预处理后的图像基本不含噪声,且是黑色图片,这样,我们就可以进行后续操作了。

获取旋转角度

对于上述预处理后的图片,可以用OpenCV的最小外接矩形方法(minAreaRect())来操作,该方法会返回最小外界矩形的中心点左边,矩形宽度、高度,以及旋转角度。因为图像中只有一个文字,因此包含该文字的最小外接矩形返回的角度就是图像的旋转角度(当然也有可能是负值)。   完整的Python代码如下:

# -*- coding: utf-8 -*-

import cv2

import numpy as np

imagepath = 'F://CHN_Char/char_after_bin.png'

img = cv2.imread(imagepath, -1)

image, contours, _ = cv2.findContours(img, 2, 2)

for cnt in contours:

# 最小外界矩形的宽度和高度

width, height = cv2.minAreaRect(cnt)[1]

if width* height > 100:

# 最小的外接矩形

rect = cv2.minAreaRect(cnt)

box = cv2.boxPoints(rect) # 获取最小外接矩形的4个顶点

box = np.int0(box)

if 0 not in box.ravel():

'''绘制最小外界矩形

for i in range(4):

cv2.line(image, tuple(box[i]), tuple(box[(i+1)%4]), 0) # 5

'''

# 旋转角度

theta = cv2.minAreaRect(cnt)[2]

if abs(theta) <= 45:

print('图片的旋转角度为%s.'%theta)

angle = theta

# 仿射变换,对图片旋转angle角度

h, w = img.shape

center = (w//2, h//2)

M = cv2.getRotationMatrix2D(center, angle, 1.0)

rotated = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)

# 保存旋转后的图片

cv2.imwrite('F://CHN_Char/after_rotated.png', rotated)

输出结果如下:

图片的旋转角度为-23.629377365112305.

得到的图像如下:

在上述Python代码中,先是利用minAreaRect()获取图像中的最小外接矩形,加上一定的筛选条件(如矩形的面积大于100,旋转角度小于45度等)就能得到包含文字的最小外界矩形,其旋转角度就是整个图像的旋转角度。

识别图像中的文字

有了旋转后的图像,我们不妨利用Tesseract-OCR软件来识别图像中的文字,完整的Python代码如下:

import pytesseract

import cv2

# tesseract.exe所在的文件路径

pytesseract.pytesseract.tesseract_cmd = 'C://Program Files (x86)/Tesseract-OCR/tesseract.exe'

imagepath = 'F://CHN_Char/after_rotated.png'

image = cv2.imread(imagepath, -1)

text = pytesseract.image_to_string(image, lang='chi_sim', config='-psm 10')

print("Tesseract-OCR的识别结果为: '%s'."%text)

输出结果为:

Tesseract-OCR的识别结果为: '知'.

因此,我们得到的图像的旋转角度是正确的。当然,借用以上方法,还可以识别以下图片中的文字:

总结

本次获取图像的旋转角度是利用了图像中只有一个文字,而包含该文字的最小外接矩形的旋转角度就是图像的旋转角度。这只是获取图像旋转角度的一种方式,当然,还会有其他获取图像旋转角度的方法,后续还会继续介绍,欢迎大家交流~~

注意:本人现已开通微信公众号: 轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

opencv获取模板旋转角度_OpenCV入门之获取图像的旋转角度相关推荐

  1. python opencv 识别角度_OpenCV入门之获取图像的旋转角度

    在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢? 我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度. 可以看到,该图像存在着许多 ...

  2. opencv获取外接摄像头_opencv获取摄像头视频

    结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include "stdafx.h" #include # ...

  3. python 图片旋转角度_OpenCV获取图像的旋转角度

    在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢? 我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度. 4.png 可以看到,该图 ...

  4. OpenCV:模板匹配

    小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...

  5. Opencv java模板匹配-角点检测(11)

    函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...

  6. python+opencv获取最小外接矩形

    python+opencv获取最小外接矩形 环境 代码 效果 环境 python版本:3.8 opencv版本:4.3.0.36 代码 from PIL import Image from pylab ...

  7. Python+Opencv实现模板匹配

    目录 一.模板匹配简介 二.传统模板匹配算法不足之处 三.多尺度模板匹配实现步骤 四.多尺度模板匹配实现代码 五.多尺度模板匹配效果展示和分析 六.思维扩展 参考资料 注意事项 一.模板匹配简介    ...

  8. 使用手机摄像头做网络ip摄像头 并用opencv获取rtsp视频流

    目录 前言 准备工作 DroidCam使用方法 IP摄像头使用方法 使用opencv调用摄像头 前言 最近要做一个和图像有关的项目,需要获取热成像摄像头的输入进行处理,最终调研找到了一款网络摄像机.苦 ...

  9. 2.opencv获取和设置像素

    opencv如何获取和设置图片像素 1.什么是像素? 2.OpenCV中的图像坐标系概述 3.项目结构 1.使用OpenCV获取和设置像素 2.OpenCV像素获取和设置结果 3.源代码下载 什么是像 ...

最新文章

  1. 前端包管理工具 yarn
  2. Android用户界面布局(layouts)
  3. js 异步和同步的区别
  4. GetCurrentDirectory和SetCurrentDirectory函数
  5. vba 修改access表的链接地址_神奇的VBA编程:禁止修改Excel工作表名称
  6. 使用CrpytAPI编码和解码PKCS#7消息
  7. Java基础---接口的使用
  8. 智能语音升级用户体验,标贝以创新优势布局儿童有声内容市场
  9. Python练习题(四)
  10. python中string、json、bytes的转换
  11. Atitit 图像处理类库大总结attilax qc20
  12. SECS/GEM协议开发系列(一)准备工作
  13. 机器学习与控制:ADMM的ODE模型与基于Lyapunov的收敛分析
  14. java ruby 比较_java和ruby的一些比较
  15. 一个程序员的真实故事上
  16. DNS默认的端口号是: 53
  17. Win7系统优化十大技巧
  18. 79、Vue的发展及优点和缺点
  19. 高一学生计算机知识现状分析,浅析我校高中信息技术教学现状
  20. Django中间件解析

热门文章

  1. python删除excel内容_用python批量删除sheet
  2. 找第一个只出现一次的字符_leetcode哈希表之第一个只出现一次的字符
  3. highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .
  4. 用python编excel统计表_Python实现对excel文件列表值进行统计的方法
  5. qt中调整弹出框的位置
  6. linux划分5t硬盘,关于磁盘分区(以linux系统为例)
  7. matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计
  8. 第三范式的作用_钟启泉:教学范式的转型,让一线教师面临三大挑战 | 头条
  9. 汇编html文档,欢迎走进HTML的世界汇编.ppt
  10. iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解