0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenCV中图像旋转函数操作原理及基本技巧

OpenCV学堂 来源:OpenCV学堂 2023-11-14 09:40 次阅读

01

引言

初学图像处理,很多人遇到的第一关就是图像旋转,图像旋转是图像几何变换中最具代表性的操作,包含了插值、背景处理、三角函数等相关知识,一个变换矩阵跟计算图像旋转之后的大小公式就让很多开发者最后直接调用函数了事,但是其实这个东西并没有这么难懂,可以说主要是之前别人写的公式太吓人,小编很久以前第一次接触的也是被吓晕了!所以决定从程序员可以接受的角度从新介绍一下图像旋转基本原理与OpenCV中图像旋转函数操作的基本技巧。

图像旋转基本原理

旋转涉及到两个问题,一个是图像旋转之后的大小会发生改变,会产生背景,通过背景填充方式都是填充黑色,此外旋转还是产生像素的位置迁移,新的位置像素需要通过插值计算获得,常见的插值方式有最近邻、线性插值、立方插值等。

首先看旋转之后的图像宽高变化,如下图所示:

c04e2600-828a-11ee-939d-92fbcf53809c.png

c05ca4f0-828a-11ee-939d-92fbcf53809c.png

这个是正常的平面坐标系中的旋转矩阵,可以简写为:

c06ca1a2-828a-11ee-939d-92fbcf53809c.png

是一个2x3的矩阵,但是在图像中左上角是原点,要实现围绕图像的中心位置旋转,M就要重新计算,所以OpenCV中的图像旋转矩阵为:

c079f762-828a-11ee-939d-92fbcf53809c.png

其中scale是表示矩阵支持旋转+放缩,这里可以把Scale=1。第三列是图像旋转之后中心位置平移量。

函数支持

OpenCV中支持图像旋转的函数有两个,一个是直接支持旋转的函数,但是它支持的是90,180,270这样的特殊角度旋转。

void cv::rotate   (
    InputArray    src,
    OutputArray dst,
    int rotateCode
)

其中rotateCode参数必须为:

ROTATE_180,
ROTATE_90_CLOCKWISE
ROTATE_90_COUNTERCLOCKWISE

函数warpAffine支持任意角度的旋转,通过定义M矩阵实现

void cv::warpAffine(
         InputArray      src, // 输入图像
         OutputArray dst, // 输出图像
         InputArray      M, // 旋转矩阵
         Size         dsize, // 输出图像大小
         int   flags = INTER_LINEAR, // 像素插值方式
         int   borderMode = BORDER_CONSTANT, // 背景填充默认为常量
         const Scalar &        borderValue = Scalar() // 填充颜色默认为黑色
)

但是M如何生成与获取,OpenCV中提供了一个函数根据输入的参数自动生成旋转矩阵M,该函数为

Mat cv::getRotationMatrix2D(
         Point2f   center,
         double    angle,
         double    scale
)

代码演示

使用自定义的M矩阵实现图像旋转


h,w,c=src.shape
#定义矩阵
M=np.zeros((2,3),dtype=np.float32)
#定义角度
alpha=np.cos(np.pi/4.0)
beta=np.sin(np.pi/4.0)
print("alpha:",alpha)
#初始化矩阵
M[0,0]=alpha
M[1,1]=alpha
M[0,1]=beta
M[1,0]=-beta
cx=w/2
cy=h/2
tx=(1-alpha)*cx-beta*cy
ty=beta*cx+(1-alpha)*cy
M[0,2]=tx
M[1,2]=ty
#执行旋转
dst=cv.warpAffine(src,M,(w,h))
cv.imshow("rotate-center-demo",dst)

重新计算旋转之后的图像大小,实现无Crop版本的图像旋转

h,w,c=src.shape
M=np.zeros((2,3),dtype=np.float32)
alpha=np.cos(np.pi/4.0)
beta=np.sin(np.pi/4.0)
print("alpha:",alpha)

#初始旋转矩阵
M[0,0]=alpha
M[1,1]=alpha
M[0,1]=beta
M[1,0]=-beta
cx=w/2
cy=h/2
tx=(1-alpha)*cx-beta*cy
ty=beta*cx+(1-alpha)*cy
M[0,2]=tx
M[1,2]=ty

#changewithfullsize
bound_w=int(h*np.abs(beta)+w*np.abs(alpha))
bound_h=int(h*np.abs(alpha)+w*np.abs(beta))

#添加中心位置迁移
M[0,2]+=bound_w/2-cx
M[1,2]+=bound_h/2-cy
dst=cv.warpAffine(src,M,(bound_w,bound_h))
cv.imshow("rotatewithoutcropping",dst)

背景随便变化+无Crop版本的图像旋转动态演示

degree=1.0
d1=np.pi/180.0
whileTrue:
alpha=np.cos(d1*degree)
beta=np.sin(d1*degree)
M[0,0]=alpha
M[1,1]=alpha
M[0,1]=beta
M[1,0]=-beta
cx=w/2
cy=h/2
tx=(1-alpha)*cx-beta*cy
ty=beta*cx+(1-alpha)*cy
M[0,2]=tx
M[1,2]=ty

#changewithfullsize
bound_w=int(h*np.abs(beta)+w*np.abs(alpha))
bound_h=int(h*np.abs(alpha)+w*np.abs(beta))
M[0,2]+=bound_w/2-cx
M[1,2]+=bound_h/2-cy
red=np.random.randint(0,255)
green=np.random.randint(0,255)
blue=np.random.randint(0,255)
dst=cv.warpAffine(src,M,(bound_w,bound_h),borderMode=cv.BORDER_CONSTANT,borderValue=(blue,green,red))
cv.imshow("rotate+background",dst)
c=cv.waitKey(1000)
ifc==27:
break
degree+=1
print("degree",degree)
ifdegree>360:
degree=degree%360

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3882

    浏览量

    61310
  • OpenCV
    +关注

    关注

    29

    文章

    611

    浏览量

    40786

原文标题:经验 | OpenCV图像旋转的原理与技巧

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【Rayeager PX2分享】OpenCV入门之图像显示

    $@ -c $
    发表于 04-14 15:49

    Vivado HLS实现OpenCV图像处理的设计流程与分析

    本文通过对OpenCV图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS调用Open
    发表于 07-08 08:30

    如何使用PythonOpenCV模块检测颜色

    numpy然后,导入模块。读取图像并使用 OpenCV 模块的 cvtColor() 函数将BGR图像转换为 HSV (色调、饱和度、值
    发表于 02-09 16:31

    【EASY EAI Nano开源套件试用体验】3. OpenCV 图像处理开发测试

    初始化,并设置采集图像的宽高,以及设置图像旋转90度的方式。void rgbcamera_set_format(intformat);这个函数是对摄像头采集的数据格式进行设置,设置摄
    发表于 03-08 00:03

    OpenCV图像处理编程研究

    OpenCV是一种用于数字图像处理和计算机视觉的函数库,由Intel微处理器研究实验室的视觉交互组开发,采用的开发语言是C++。本文通过学习掌握在OpenCV下进行数字
    发表于 06-25 17:52 0次下载

    opencv如何实现图像旋转_原理是什么

    旋转一般是指将图像围绕某一指定点旋转一定的角度,图像旋转后会有一部分图像转出显示区域,可以截图那
    发表于 12-04 16:40 2.7w次阅读
    <b class='flag-5'>opencv</b>如何实现<b class='flag-5'>图像</b><b class='flag-5'>旋转</b>_原理是什么

    OpenCV函数图像处理目录说明

    本文档的主要内容详细介绍的是OpenCV函数图像处理目录说明。
    发表于 10-29 15:55 12次下载
    <b class='flag-5'>OpenCV</b><b class='flag-5'>函数</b><b class='flag-5'>图像</b>处理目录说明

    OpenCV中的图像的计算

    今天我们一起学习的是OpenCV中的图像的计算,在图像计算中,分为像素级运算和代数运算这两大类,今天我们借助OpenCV中的函数一起来看看这
    的头像 发表于 11-03 17:45 1907次阅读

    OpenCV中实现了图像形态学什么常见操作

    图像形态学是图像处理的分支学科,在二值图像处理中占有重要地位、OpenCV中实现了图像形态学如下常见操作
    的头像 发表于 05-27 14:11 1292次阅读
    <b class='flag-5'>OpenCV</b>中实现了<b class='flag-5'>图像</b>形态学什么常见<b class='flag-5'>操作</b>?

    OpenCV入门之OpenCV的基本操作1

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列
    的头像 发表于 02-07 14:19 539次阅读
    <b class='flag-5'>OpenCV</b>入门之<b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>1

    OpenCV入门之OpenCV的基本操作2

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列
    的头像 发表于 02-07 14:19 543次阅读
    <b class='flag-5'>OpenCV</b>入门之<b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>2

    OpenCV入门之OpenCV的基本操作3

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列
    的头像 发表于 02-07 14:33 382次阅读
    <b class='flag-5'>OpenCV</b>入门之<b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>3

    OpenCV入门之OpenCV的基本操作4

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列
    的头像 发表于 02-07 14:34 394次阅读
    <b class='flag-5'>OpenCV</b>入门之<b class='flag-5'>OpenCV</b>的基本<b class='flag-5'>操作</b>4

    OpenCV入门之OpenCV的基本操作5

    OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列
    的头像 发表于 02-07 14:35 373次阅读

    OpenCV库在图像处理和深度学习中的应用

    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用。从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入
    的头像 发表于 08-18 11:33 499次阅读