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进行仿射变换开发中遇到的坑,这些问题可能大家或多或少会碰到,这些问题涉及基本知识的理解、官方资料的坑等方面,希望能帮助到大家。

更多图像处理的介绍请参考专栏《》和《》相关文章。

更多图像处理的数学基础知识请参考专栏《》

写博不易,敬请支持:

关于老猿的付费专栏

  1. 付费专栏《专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 》;
  2. 付费专栏《)详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《》;
  3. 付费专栏《》为《》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《》

前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《》的学习使用。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《)从零开始学习Python。

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

跟老猿学Python!

☞ ░ ░

经验分享 程序员 微信小程序 职场和发展