前言 

本文,将描述使用 OpenCV 和 Imutils 围绕任意点旋转指定角度的图像所需的步骤。

使用 OpenCV 旋转图像

使用 OpenCV 旋转图像:

1.使用 OpenCV 的 imread 函数加载所需的图像。

脚本:加载并显示原始图像

# import required library
import cv2
 
# load image from disk
image = cv2.imread('eiffel_tower.jpg')
 
# display image
cv2.imshow('Original image', image)
cv2.waitKey(0)

导入了 OpenCV 库并使用 imread 函数从工作目录加载了埃菲尔铁塔的图像,然后使用 imshow 函数显示图像。

请注意,如果图像不在工作目录中,则提供给 imread 函数的参数值应包含图像的路径。

输出:

2.获取图像的空间维度(高度、宽度、中心坐标)。

脚本:获取图像的高度、宽度和中心坐标。

# get the dimensions of the image and calculate the center of the
# image
height, width = image.shape[:2]
centerX, centerY = (width // 2, height // 2)

image.shape属性的前两个值分别返回图像的高度和宽度。整数除法用于获取中心位置的值,因为旋转图像的函数只接受整数值。中心位置值对于围绕中心旋转图像很有用。

3.定义一个旋转矩阵以围绕所需的点和旋转角度旋转图像。

脚本:定义一个旋转矩阵以将图像围绕中心旋转 45⁰。

# # rotate our image by 45 degrees around the center of the image
 
# get rotation matrix
M = cv2.getRotationMatrix2D((centerX, centerY), 45, 1.0)

cv2.getRotationMatrix2D函数(顾名思义)定义了一个二维矩阵,用于根据传递的参数值旋转图像。

该函数采用旋转点参数(在此示例中,图像的中心由坐标(centerX , centerY)表示)、以度为单位的旋转角度(在本例中为45度)和浮点值(在本例中为1.0 )指定旋转图像相对于原始图像的比例。

我们示例中的1.0比例值将旋转后的图像缩放为与原始图像相同的尺寸。较高的比例值会扩大图像,而较低的值会缩小图像。

4.根据旋转矩阵对图像进行旋转,并显示旋转后的图像。

脚本:将图像围绕中心旋转 45⁰。

# rotate image
rotated = cv2.warpAffine(image, M, (width, height))
 
# display image
cv2.imshow("Rotated by 45 Degrees", rotated)
cv2.waitKey(0)

旋转矩阵 (M) 被传递给cv2.warpAffine函数,该函数根据旋转矩阵中指定的值对图像应用旋转。该函数还将图像宽度和高度的元组作为参数。

输出:

图像围绕中心旋转 450。注意图像是逆时针方向旋转的吗?我们还可以通过在旋转矩阵中传递旋转角度的负值来顺时针旋转图像。

使用 OpenCV 顺时针旋转图像

脚本:

# rotate the image by 90 degrees in clockwise direction
M = cv2.getRotationMatrix2D((centerX, centerY), -90, 0.5)
rotated = cv2.warpAffine(image, M, (width, height))
cv2.imshow("Rotated by -90 Degrees", rotated)
cv2.waitKey(0)

输出:

让我们比较一下如果我们通过 90⁰(逆时针 90⁰ 旋转)作为旋转角度而不是 -90⁰ 的情况。

请注意,图像以逆时针方向旋转,还将图像比例缩小了一半(通过传递 0.5 作为比例值)。

虽然之前已经沿中心(centerX, centerY)旋转了图像,但可以使用前面提到的类似步骤围绕图像中的任意点旋转图像。

围绕任意点旋转图像

脚本:将图像围绕点 (15, 10) 旋转 30 度。

# rotate our image around an arbitrary point
M = cv2.getRotationMatrix2D((15, 10), 30, 1.0)
rotated = cv2.warpAffine(image, M, (width, height))
cv2.imshow("Rotated around an  Arbitrary Point", rotated)
cv2.waitKey(0)

输出:

旋转如何切断图像的某些部分?我将在本文后面展示如何避免这种情况。

使用 Imutils 旋转图像

就像移动图像一样,Imutils 包提供了使用简单易用的旋转辅助函数沿任意点和任意角度旋转图像的简单步骤。

脚本:使用 Imutils 将图像顺时针旋转 30⁰。

# rotate our image around an arbitrary point
M = cv2.getRotationMatrix2D((15, 10), 30, 1.0)
rotated = cv2.warpAffine(image, M, (width, height))
cv2.imshow("Rotated around an  Arbitrary Point", rotated)
cv2.waitKey(0)

调用 imutils.rotate函数,通过将图像和旋转角度作为参数传递,将图像沿所需方向旋转。

输出:

就像在前面的图像中一样,旋转会切断图像的某些部分,虽然这可能在某些用例中是有意的,但我们可以编写代码,确保图像的所有部分仍然在视图中。

脚本:将图像旋转 30⁰,同时确保整个图像都在视图中。

# rotate the image by 30 degrees, ensuring the
# entire rotated image still views in the viewing area
rotated = imutils.rotate_bound(image, -30)
cv2.imshow("Rotated Without Cropping", rotated)
cv2.waitKey(0)

输出:

这次使用 cv2.rotate_bound 辅助函数而不是旋转函数来确保图像的所有部分都在旋转后的图像中。

总结

本文展示了使用OpenCV和imutil 包围绕中心或任何其他任意点以顺时针或逆时针方向旋转图像所需的步骤。还展示了如何旋转图像以保留完整视图,而不裁剪任何部分。

到此这篇关于OpenCV Imutils实现图像的旋转操作的文章就介绍到这了,更多相关OpenCV Imutils图像旋转内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

OpenCV+Imutils实现图像的旋转操作的更多相关文章

  1. iOS使用openCV检测来自摄像头的矩形

    如果我在处理它之前克隆matimage,通过记录它,它似乎处理图像甚至找到矩形,但矩形不会被绘制到图像输出到imageView.我很确定我错过了一些东西,可能是因为我没有正确传递某个对象,指向对象的指针等等,而我需要修改的对象则没有.无论如何,如果这不是正确的方法,我真的很感谢他们做这样的事情的教程或例子,使用openCV或GPUImage…它不需要尝试使用matimage来设置imageView.image,而只需要将matimage转换为在imageView中实际修改,因为CvVideoCamera已

  2. 使用Xcode为OS X Lion / Mountain Lion编译OpenCV(2.3.1)

    任何人都可以为我提供一些如何使用Xcode在OSXLion上编译OpenCV2.3.1的详细指南吗?我对此感到生气…我得到了源码,使用cmake创建Xcode模板并尝试构建它,但它失败了大约200个错误.提前致谢,大教堂解答我的回答帖子.解决方法详细指南如何使用MacPorts在Xcode4.2.1的OSXLion下启动和运行OpenCV2.3.1编辑08/06/2012:这也适用于OpenCV2.4.1.只需确保您获得最新版本的Xcode并安装“命令行工具”.编辑15/08/2012:使用Mountai

  3. ios – OpenCV构建问题,找不到ext/atomicity.h

    我得到编译器错误抱怨在构建包含OpenCV的项目时.环境是针对iOS的Xcode4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:我正在使用opencv2.framework,使用指令here构建cmake.解决方法默认情况下,XCode4.5使用libc(支持C11的LLVMC标准库)生成要构建的新项目.但OpenCV期望针对GNUlibstd

  4. 从IOS / iPad / iPhone的最大速度

    我使用OpenCVforiOS完成计算密集型应用程序.当然这很慢.但它比我的PC原型慢了200倍.所以我正在优化它.从最初的15秒,我能够获得0.4秒的速度.我想知道我是否找到了所有的东西以及别人想要分享的东西.我做了什么:>将OpenCV中的“double”数据类型替换为“float”.双倍是64位,32位cpu不能轻易处理,所以浮动给了我一些速度.OpenCV经常使用双倍.>为编译器选项添加了

  5. 在Swift iOS中使用OpenCV

    在我的xcode项目中添加OpenCV2框架后,我试图搜索samlpes或教程与swift集成。有什么好的教程同样吗?OpenCV是用C编写的框架。苹果的reference告诉我们YoucannotimportC++codedirectlyintoSwift.Instead,createanObjective-CorCwrapperforC++code.所以你不能在一个swift项目中直接导入和使用OpenCV,但这实际上并不坏,因为你(需要)继续使用框架的C语法,这是在网络上有很多文档。那么你怎么进行呢

  6. 在Android Studio中解决已弃用的NDK警告

    或者除了添加所有已编译的代码并设置我之前提到的标志之外,还有其他方法可以将OpenCV导入Android项目吗?任何有关这方面的帮助将不胜感激.解决方法我建议迁移到使用cmake的本机支持.您可以查看链接,该链接提供了使用cmake通过以下link添加OpenCV的分步教程.您的代码应该保持不变而不做任何更改,只有必要的操作才能弄清楚如何使用CMakeLists.txt将它们包含在构建过程中.

  7. android – opencv管理器包没找到?如何自动安装?

    我正在使用openCV,每当我运行代码时它都会给我包管理器没有安装,那么如何通过我的应用程序安装它.是必须从Play商店下载它还是我们可以在设备中自动安装它.请帮我.提前致谢.解决方法您需要使用静态初始化来包含apk中的所有OpenCV二进制文件.请参阅此文档:ApplicationDevelopmentwithStaticInitialization

  8. 如何从Android相机中找到框架的轮廓并将其转换为box2d实体?

    使用openframeworks,OpenCV和Box2D,我能够以良好的帧速率实现它.使用Android似乎是一项更复杂的任务(部分原因是我是JAVA新手).这就是我的开始:>使用“OpenCV示例–图像处理”并删除除“canny”效果之外的所有内容,这会产生一个漂亮的黑色&白色图像,非常适合找到轮廓.>从“OpenCVSample–color-blob-detection”中我抓住了在Mat中

  9. 在Android上的OpenCV中逐帧处理视频

    如果是的话,你知道任何例子.>编译适用于Android的FFMPEG也是一种选择.但是,我认为自己编写FrameGrabber和FrameRecorder有点过分.我认为除了JavaCV之外,还必须存在一些解决方案.>从API18开始,Android中有MediaCodec和Mediamuxer.也许他们可以帮助我?

  10. 使用opencv进行android角点跟踪

    当我相对于Android相机移动它时,我试图跟踪一张纸的角落的位置(您可以假设纸张将是与背景完全不同的颜色).我想找到android屏幕上每个角落的x,y坐标.我也希望能够改变纸张的角度,因此它不一定会一直呈现出完美的矩形.我正在使用opencv2.4.1forAndroid,但我在包中找不到cvgoodfeaturetotrack或cvfindcornersubpix.现在我正在考虑使用CvCa

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部