情况一 对未知角度的图片进行角度旋转

首先 获取图片的角度

# -*- 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对图片进行角度旋转相关推荐

  1. 应用OpenCV进行图像旋转和平移

    简 介: 本文中,你了解了了如何通过OpenCV完成对于图像的旋转和平移.我们首先通过 getRotationMatrix2D() 获取2D旋转矩阵,然后完成了对于图像的旋转.具体是通过warpAff ...

  2. Opencv 基础(四):使用OpenCV进行图像旋转和平移

    如今,图像编辑变得越来越流行,因为手机有内置的功能,可以让你裁剪.旋转和更多的操作你的图像. 这篇文章中,我们将探索和学习这些图像编辑技术.具体来说,我们将学习如何: 旋转图像 移动图像 基本图像变换 ...

  3. JAVA对图片的任意角度旋转,以及镜像操作

    package relevantTest; /*  * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果.  * 在对图像进 ...

  4. java旋转图片并画出_java实现图片角度旋转并获得图片信息

    本文实例为大家分享了java实现图片角度旋转并获得图片信息的具体代码,供大家参考,具体内容如下 public class demo { /** * 调整图片角度 * make by dongxh 20 ...

  5. java 旋转图片_Java实现图片翻转以及任意角度旋转

    最近几天在做一个项目,因为涉及到了图片(绝大部分都不是整图,是把一张张的大图切成小图,也就是Title)的翻转以及90°旋转,弄得焦头烂额.在网上搜索好几天,发现用到的方法都是比较公式化的,对于只是在 ...

  6. python-opencv有效随机角度旋转

    imgb=cv2.imread(r"F:\Data_library\steel\Treadimage2\big.png") imgs=cv2.imread(r"F:\Da ...

  7. Opencv:图像旋转,cv2.getRotationMatrix2D 和 cv2.warpAffine 函数

    学习记录如何使用opencv实现对图像的旋转操作. 1 cv2.getRotationMatrix2D(center, angle, scale) 图像的旋转矩阵一般为: 但是单纯的这个矩阵是在原点处 ...

  8. 任意角度旋转图片的ground truth目标检测框

    任意角度旋转图片的ground truth目标检测框 (感谢前辈)转自:https://zhuanlan.zhihu.com/p/72129125 因为检测一个物体的时候需要对目标进行多个任意角度的旋 ...

  9. java如何利用rotate旋转图片_JAVA对图片的任意角度旋转,以及镜像操作

    package relevantTest; /* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任 ...

  10. USB摄像头工具(角度旋转镜像)

    买了个掏耳朵的神器,其实也就是个微型USB头带六颗LED灯的摄像头,大概是这个样子的 我看着挺好,不光能看耳道也能看鼻腔,看牙齿也可以就是费力点,毕竟牙齿内侧每这么方便看(专用的90度的WIFI口腔内 ...

最新文章

  1. Flask之WTForms验证
  2. 13.19. File system test
  3. 入手你从来没有接触过的行业项目
  4. java第九章实验报告_2019JAVA第九次实验报告
  5. oracle中如何分页,Oracle中操作分页
  6. 二级菜单不同方法的实现
  7. flutter笔记:使用flutter webvie
  8. 由软件工程看中国人急功近利的心态
  9. vue基础之路由(概念,基本使用,路由规则中定义参数,路由的嵌套,使用路由进行经典布局)
  10. R语言迹检验协整关系式_【R语言】单位根检验、协整检验和格兰杰因果关系检验三者之间的关系...
  11. L1-087 机工士姆斯塔迪奥
  12. 7、Spring事务配置下篇
  13. 虚拟服务器存储扩容方法,虚拟化数据中心存储扩容方案
  14. Canvas画各种线
  15. Webm如何转换mp4? 傻瓜式的操作方法来了
  16. 表格的边框如何做到和EXCEL的外边框为粗线,内部为细线的效果
  17. 深拷贝工具类DeepCopyUtil
  18. mpvue 微信小程序api_mpVue 小程序框架 SDK
  19. Win10笔记本玩csgo掉帧严重怎么办?
  20. 士兵队列训练问题(队列)

热门文章

  1. 51流水灯c语言程序与解释,51单片机流水灯C语言源代码
  2. 深入浅出设计模式 ------ Abstract Factory(抽象工厂)
  3. RStudio的help字体的调整大小
  4. pmp培训机构哪个好?各pmp培训机构排名如何?
  5. json标准格式举例_JSON 数据格式详解
  6. R 学习笔记《四》 R语言初学者指南--载入数据
  7. 反编译工具ILSpy的下载与使用
  8. matlab求动力学模型,MATLAB/Simulink动力学系统建模与仿真
  9. Linux最常用的20个命令
  10. 用TCL调用Hypermesh中的求解器