OpenCV-Python仿射变换开发中遇到的坑

☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython
仿射变换博文传送门(带星号的为付费专栏文章):
  1. *图像仿射变换原理1:齐次坐标来龙去脉详解
  2. *图像仿射变换原理2:矩阵变换、线性变换和图像线性变换矩阵
  3. *图像仿射变换原理3:仿射变换类型及变换矩阵详解
  4. *图像仿射变换原理4:组合变换及对应变换矩阵
  5. *图像仿射变换原理5:组合变换矩阵的OpenCV-Python实现
  6. OpenCV-Python图像处理:仿射变换详解及案例
  7. OpenCV-Python仿射变换开发中遇到的坑
  8. openCV仿射变换:getAffineTransform的案例
  9. 为什么称图像旋转、错切、缩放变换是线性变换?
  10. 图像仿射变换:绕点旋转和指定直线依赖轴shear错切变换矩阵
  11. 图像仿射变换shear怎么翻译?剪切、错切、推移哪个译词好?
  12. 仿射变换原理和其OpenCV-Python实现知识汇总
OpenCV-Python仿射变换开发中遇到的坑

在使用OpenCV-Python开发仿射变换应用时,老猿遇到了一些坑,估计这些坑是很多初学者会遇到,在这儿总结一下,供大家借鉴参考:

一、坐标原点相关问题

OpenCV的图像窗口的坐标原点在左上角,在开发中需要注意:

  1. 旋转变换矩阵的旋转角度的正负值对应旋转方向
    当旋转变换矩阵为
    在这里插入图片描述
    其正值表示顺时针旋转,如果需要用正值表示逆时针旋转,则旋转矩阵需要变为:
    在这里插入图片描述

  2. 使用OpenCV的函数getRotationMatrix2D构建旋转矩阵时,逆时针旋转角度为正值

  3. 平移时的平移距离需要考虑坐标原点的位置在左上角。

二、WARP_INVERSE_MAP标记问题

该问题是因为OpenCV官方文档的材料说明存在问题导致,我们来看看官方描述:

在这里插入图片描述

针对第一个红圈标记的说明,老猿在翻译时,将其理解为设置WARP_INVERSE_MAP标记时,计算值等于上面计算公式的值,如果不设置则会求逆矩阵。但实际上是没设置标记使用该公式,设置了先求逆矩阵再用逆矩阵参与运算

三、矩阵顺序问题

在组合仿射变换由应用构建多个变换矩阵相乘时,一定要记得最先进行的变换要在连乘变换矩阵的最右边。例如先平移、再旋转、再反平移,则平移矩阵在最右边,反平移矩阵在最左边。

四、旋转角度求三角函数值问题

三角函数使用时,角度的数值如30°不能直接作为三角函数的参数,而是要除以180乘以π的值作为参数。

五、仿射矩阵行数问题

warpAffine调用的参数M仿射矩阵是2*3的,但矩阵乘法不支持2*3的矩阵相乘,因此需要先用3*3的单应性矩阵相乘,最后结果取前2行作为仿射矩阵。

六、矩阵乘法

numpy的矩阵既可以支持两个矩阵直接相乘,如A*B,但这个相乘不是标准矩阵乘法,而是矩阵各相同位置元素直接相乘,在仿射矩阵乘法中需要用numpy的matmul或dot进行矩阵相乘,否则变换效果就不对。

七、小结

本文介绍了老猿在使用OpenCV-Python进行仿射变换开发中遇到的坑,这些问题可能大家或多或少会碰到,这些问题涉及基本知识的理解、官方资料的坑等方面,希望能帮助到大家。

更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。

更多图像处理的数学基础知识请参考专栏《人工智能数学基础 https://blog.csdn.net/laoyuanpython/category_10382948.html

写博不易,敬请支持:

如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!

如果对文章内容存在疑问,可以在博客评论区留言,或关注:老猿Python 微信公号发消息咨询。

关于老猿的付费专栏

  1. 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
  2. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
  3. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录
  4. 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: OpenCV Python仿射变换是一种图像处理技术,它可以对图像进行旋转、缩放、平移和扭曲等变换操作,从而实现图像的形状变换和位置变换。在实际应用仿射变换常用于图像校正、图像配准、图像拼接等领域。通过OpenCV Python仿射变换函数,我们可以轻松地实现对图像的变换操作,从而满足不同应用场景的需求。 ### 回答2: OpenCV是一个开源的计算机视觉库,提供了许多用于图像处理和计算机视觉任务的函数和工具,其包括旋转、缩放、仿射变换等操作。在Python程序使用OpenCV仿射变换功能,可以轻松地对图像进行平移、旋转、缩放和扭曲等操作。 仿射变换是一种线性变换,可以通过线性代数的方法计算。可以将任何形状的物体固定在一个二维平面上并按照一定的比例和角度旋转或缩放,然后将其投影到另一个平面上。在使用OpenCV进行仿射变换时,需要首先定义一个变换矩阵,然后将其应用到图像上。 在OpenCV,可通过函数cv2.getAffineTransform() 获得仿射矩阵,该函数需要输入源图像上的三个点和目标图像上的三个点。然后,可以通过函数cv2.warpAffine() 将变换矩阵应用到图像上。该函数还可以用于旋转、镜像、平移和缩放等图像变换。需要注意的是,如果变换后的图像大小与原图不同,需要进行适当的裁剪。 实现OpenCV仿射变换通常需要以下步骤: 1. 定义源图像上和目标图像上的三个点; 2. 调用函数cv2.getAffineTransform() 获得变换矩阵; 3. 调用函数cv2.warpAffine() 将变换矩阵应用到图像上; 4. 如果需要,进行图像裁剪。 需要注意的是,在进行仿射变换时,变换前和变换后的图像像素位置之间是线性关系,因此,变换后的图像像素值需要通过插值方法计算得出。在OpenCV,可选择使用最近邻插值、双线性插值或双三次插值来进行插值计算。 在Python使用OpenCV仿射变换功能可以应用于各种场景,例如图像矫正、景深合成、数字识别、人脸识别等任务,具有极高的实用价值。 ### 回答3: OpenCV 是一个开源的计算机视觉和机器学习库,提供了许多强大的工具和算法来协助计算机实现如人类一样的视觉功能。其仿射变换OpenCV 常用的一种图像几何变换方法,用于实现图像的缩放、平移、旋转和投影等功能。 在 OpenCV ,可以使用 cv2.warpAffine() 函数实现仿射变换。这个函数接收三个参数:原始图像、变换矩阵和输出图像的尺寸。其,变换矩阵是一个 2x3 的矩阵,包括平移、旋转和缩放等变换操作的参数。根据需要,可以通过调整变换矩阵的值来完成不同的变换操作。 现在,假设我们要对一张原始图片进行仿射变换,将其旋转 45 度并向右平移 100 像素。首先,需要使用 OpenCV 加载该图片: ``` import cv2 img = cv2.imread('original.jpg') ``` 然后,我们需要定义一个变换矩阵来实现旋转和平移操作,可以通过 cv2.getRotationMatrix2D() 函数来生成变换矩阵。该函数接收三个参数:旋转心、旋转角度和缩放倍数。在本例,旋转心为图像心,旋转角度为 45 度,缩放倍数为 1: ``` rows, cols = img.shape[0:2] center = (cols/2, rows/2) angle = 45 scale = 1 M = cv2.getRotationMatrix2D(center, angle, scale) ``` 接下来,我们需要根据需要将图片向右平移,可以直接操作变换矩阵的第三列: ``` tx = 100 M[0, 2] += tx ``` 最后,我们可以使用 cv2.warpAffine() 函数对图片进行仿射变换,输出处理后的图片: ``` dst = cv2.warpAffine(img, M, (cols, rows)) cv2.imshow('result', dst) cv2.waitKey(0) ``` 在本例,输出的图片将会是原始图片旋转 45 度并向右平移 100 像素后的结果。 总之,opencv python 仿射变换提供了丰富的图像几何变换方法,可以通过变换矩阵来实现不同的变换操作。它是计算机视觉和机器学习领域非常有用的工具之一,可以协助研究人员和开发者实现真正意义上的计算机视觉应用和智能化系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值