opencv获取模板旋转角度_OpenCV入门之获取图像的旋转角度
在我们的日常生活中,所碰到的图像往往都有一定的倾斜。那么,如何用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入门之获取图像的旋转角度相关推荐
- python opencv 识别角度_OpenCV入门之获取图像的旋转角度
在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢? 我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度. 可以看到,该图像存在着许多 ...
- opencv获取外接摄像头_opencv获取摄像头视频
结合Leaning OpenCV 第二个例子 显示一个视屏文件 写了一下 获取摄像头的代码为并且创建窗口显示的代码为: #include "stdafx.h" #include # ...
- python 图片旋转角度_OpenCV获取图像的旋转角度
在我们的日常生活中,所碰到的图像往往都有一定的倾斜.那么,如何用OpenCV来获取图像的旋转角度呢? 我们以下面的图片为例,简单介绍如何用OpenCV来获取图像的旋转角度. 4.png 可以看到,该图 ...
- OpenCV:模板匹配
小程序「跳一跳」的自动化. 主要涉及到了OpenCV的模板匹配和边缘检测技术,以及Android开发调试工具ADB. 如果放在一起说,感觉内容有些多. 所以,分三期来讲,也能多了解一些东西. 首先介绍 ...
- Opencv java模板匹配-角点检测(11)
函数 在opencv中有模板匹配的方法, Imgproc.matchTemplate(src, template, result, Imgproc.TM_CCOEFF); 这个方法输入的参数分别是: ...
- python+opencv获取最小外接矩形
python+opencv获取最小外接矩形 环境 代码 效果 环境 python版本:3.8 opencv版本:4.3.0.36 代码 from PIL import Image from pylab ...
- Python+Opencv实现模板匹配
目录 一.模板匹配简介 二.传统模板匹配算法不足之处 三.多尺度模板匹配实现步骤 四.多尺度模板匹配实现代码 五.多尺度模板匹配效果展示和分析 六.思维扩展 参考资料 注意事项 一.模板匹配简介 ...
- 使用手机摄像头做网络ip摄像头 并用opencv获取rtsp视频流
目录 前言 准备工作 DroidCam使用方法 IP摄像头使用方法 使用opencv调用摄像头 前言 最近要做一个和图像有关的项目,需要获取热成像摄像头的输入进行处理,最终调研找到了一款网络摄像机.苦 ...
- 2.opencv获取和设置像素
opencv如何获取和设置图片像素 1.什么是像素? 2.OpenCV中的图像坐标系概述 3.项目结构 1.使用OpenCV获取和设置像素 2.OpenCV像素获取和设置结果 3.源代码下载 什么是像 ...
最新文章
- 前端包管理工具 yarn
- Android用户界面布局(layouts)
- js 异步和同步的区别
- GetCurrentDirectory和SetCurrentDirectory函数
- vba 修改access表的链接地址_神奇的VBA编程:禁止修改Excel工作表名称
- 使用CrpytAPI编码和解码PKCS#7消息
- Java基础---接口的使用
- 智能语音升级用户体验,标贝以创新优势布局儿童有声内容市场
- Python练习题(四)
- python中string、json、bytes的转换
- Atitit 图像处理类库大总结attilax qc20
- SECS/GEM协议开发系列(一)准备工作
- 机器学习与控制:ADMM的ODE模型与基于Lyapunov的收敛分析
- java ruby 比较_java和ruby的一些比较
- 一个程序员的真实故事上
- DNS默认的端口号是: 53
- Win7系统优化十大技巧
- 79、Vue的发展及优点和缺点
- 高一学生计算机知识现状分析,浅析我校高中信息技术教学现状
- Django中间件解析
热门文章
- python删除excel内容_用python批量删除sheet
- 找第一个只出现一次的字符_leetcode哈希表之第一个只出现一次的字符
- highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .
- 用python编excel统计表_Python实现对excel文件列表值进行统计的方法
- qt中调整弹出框的位置
- linux划分5t硬盘,关于磁盘分区(以linux系统为例)
- matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计
- 第三范式的作用_钟启泉:教学范式的转型,让一线教师面临三大挑战 | 头条
- 汇编html文档,欢迎走进HTML的世界汇编.ppt
- iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解