使用OPENCV对图片进行角度旋转
情况一 对未知角度的图片进行角度旋转
首先 获取图片的角度
# -*- coding: utf-8 -*-
import cv2
import numpy as npimagepath = 'F://CHN_Char/char_after_bin.png'
img = cv2.imread(imagepath, -1) #cv2.imread为image读取函数,imread(filename, flags=None),filename为全路径(path+image name+后缀,flags一般选择-1,即不改变原图的模式。如果是RGB image,返回的是BGR nd array。
image, contours, _ = cv2.findContours(img, 2, 2) #cv2.findContours(img,mode, method) 找出图中的轮廓值,得到的轮廓值都是嵌套格式的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)
此时输出结果就是图片的旋转角度,并且得到经过旋转之后的图片。
情况二 对图片进行旋转
首先要用到如下函数:
1.rot_mat = cv2.getRotationMatrix2D(center, -5, 1)
参数说明:center表示中间点的位置,-5表示逆时针旋转5度,1表示进行等比列的缩放
2. cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
参数说明: img表示输入的图片,rot_mat表示仿射变化矩阵,(image.shape[1], image.shape[0])表示变换后的图片大小
具体实现的代码如下所示:
import cv2
import numpy as npclass BBox(object):def __init__(self, bbox):self.left = bbox[0]self.top = bbox[1]self.right = bbox[2]self.bottom = bbox[3]img = cv2.imread('0001.jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
h, w, c = img.shape
box = [0, 0, w, h]
bbox = BBox(box)center = ((bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2)
rot_mat = cv2.getRotationMatrix2D(center, -5, 1)
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
# 获得图片旋转以后的关键点的位置
# lanmark_ = np.asarray([(rot_mat[0][0] * x + rot_mat[0][1] * y + rot_mat[0][2],
# rot_mat[1][0] * x + rot_mat[1][1] + rot_mat[1][2]) for (x, y) in landmark])cv2.imshow('img_rotated', img_rotated_by_alpha)
cv2.waitKey(0)# face = img_rotated_by_alpha[bbox.top:bbox.bottom + 1, bbox.left:bbox.right + 1]
#
# cv2.imshow('face', face)
# cv2.waitKey(0)
代码说明:
第一步:读入图片,进行图片展示
第二步:获取图片的宽,长,通道数,构造[0, 0, w, h], 即构造[x1, y1, x2, y2] 矩阵,实列化一个矩阵
第三步:计算其center值,将其代入到cv2.getRotationMatrix2D生成变化矩阵
第四步:使用cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0])) 获得仿射变化以后的图像
第五步:如果是图片上的一个点,那么经过变化以后的坐标值为
(rot_mat[0][0] * x + rot_mat[0][1] * y + rot_mat[0][2], rot_mat[1][0] * x + rot_mat[1][1] * y + rot_mat[1][2]
第六步:进行旋转图片的图片展示,为了保证,这里也可以进行截图操作
经过如上的操作就可以将图片顺时针旋转5度。
使用OPENCV对图片进行角度旋转相关推荐
- 应用OpenCV进行图像旋转和平移
简 介: 本文中,你了解了了如何通过OpenCV完成对于图像的旋转和平移.我们首先通过 getRotationMatrix2D() 获取2D旋转矩阵,然后完成了对于图像的旋转.具体是通过warpAff ...
- Opencv 基础(四):使用OpenCV进行图像旋转和平移
如今,图像编辑变得越来越流行,因为手机有内置的功能,可以让你裁剪.旋转和更多的操作你的图像. 这篇文章中,我们将探索和学习这些图像编辑技术.具体来说,我们将学习如何: 旋转图像 移动图像 基本图像变换 ...
- JAVA对图片的任意角度旋转,以及镜像操作
package relevantTest; /* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进 ...
- java旋转图片并画出_java实现图片角度旋转并获得图片信息
本文实例为大家分享了java实现图片角度旋转并获得图片信息的具体代码,供大家参考,具体内容如下 public class demo { /** * 调整图片角度 * make by dongxh 20 ...
- java 旋转图片_Java实现图片翻转以及任意角度旋转
最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是Title)的翻转以及90°旋转,弄得焦头烂额.在网上搜索好几天,发现用到的方法都是比较公式化的,对于只是在 ...
- python-opencv有效随机角度旋转
imgb=cv2.imread(r"F:\Data_library\steel\Treadimage2\big.png") imgs=cv2.imread(r"F:\Da ...
- Opencv:图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数
学习记录如何使用opencv实现对图像的旋转操作. 1 cv2.getRotationMatrix2D(center, angle, scale) 图像的旋转矩阵一般为: 但是单纯的这个矩阵是在原点处 ...
- 任意角度旋转图片的ground truth目标检测框
任意角度旋转图片的ground truth目标检测框 (感谢前辈)转自:https://zhuanlan.zhihu.com/p/72129125 因为检测一个物体的时候需要对目标进行多个任意角度的旋 ...
- java如何利用rotate旋转图片_JAVA对图片的任意角度旋转,以及镜像操作
package relevantTest; /* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任 ...
- USB摄像头工具(角度旋转镜像)
买了个掏耳朵的神器,其实也就是个微型USB头带六颗LED灯的摄像头,大概是这个样子的 我看着挺好,不光能看耳道也能看鼻腔,看牙齿也可以就是费力点,毕竟牙齿内侧每这么方便看(专用的90度的WIFI口腔内 ...
最新文章
- Flask之WTForms验证
- 13.19. File system test
- 入手你从来没有接触过的行业项目
- java第九章实验报告_2019JAVA第九次实验报告
- oracle中如何分页,Oracle中操作分页
- 二级菜单不同方法的实现
- flutter笔记:使用flutter webvie
- 由软件工程看中国人急功近利的心态
- vue基础之路由(概念,基本使用,路由规则中定义参数,路由的嵌套,使用路由进行经典布局)
- R语言迹检验协整关系式_【R语言】单位根检验、协整检验和格兰杰因果关系检验三者之间的关系...
- L1-087 机工士姆斯塔迪奥
- 7、Spring事务配置下篇
- 虚拟服务器存储扩容方法,虚拟化数据中心存储扩容方案
- Canvas画各种线
- Webm如何转换mp4? 傻瓜式的操作方法来了
- 表格的边框如何做到和EXCEL的外边框为粗线,内部为细线的效果
- 深拷贝工具类DeepCopyUtil
- mpvue 微信小程序api_mpVue 小程序框架 SDK
- Win10笔记本玩csgo掉帧严重怎么办?
- 士兵队列训练问题(队列)