如何用OpenCV和C语言实现图片旋转功能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1245个文字,预计阅读时间需要5分钟。
图片旋转,本质上是对旋转后图片中每个像素点在原图中的位置进行计算。然后将这些位置上的像素值复制过来,就完成了旋转。如果计算出的位置不是整数,则由于像素点是离散的,需要四舍五入到最近的像素点。
图片旋转,本质上是对旋转后的图片中每个像素点计算在原图的位置。然后照搬过来就好。
(多说一句,如果计算出来在原图中的位置不是整数而是小数,因为像素点个数都是整数,就需要小数到整数的转换。这个转换过程是有讲究的,需要用到插值:最近邻插值、双线性插值等等。这里我使用的是最简单的最近邻插值,即对小数四舍五入成整数,C/C++ 实现四舍五入见 这里 )
图形图像课上一般会介绍旋转变换矩阵,其中 t 为需要旋转的角度,[x'; y']是变换后坐标(其中分号表示上下关系):
即表示为:[x'; y'] = [cos(t) sin(t); -sin(t) cos(t)][x; y]
因为我个人兴趣爱好(放P就是老师逼的。。。),不允许使用 OpenCV 封装好的旋转函数。只能自己实现,我开始的想法是:先求变换矩阵逆矩阵,然后将一张全黑图中每个点一一对应插值到原图中。
结果发现转换后图片全黑了……
后来发现原点设置不对。用OpenCV中的 Mat格式存储(或二维数组)的图片, 原点在左上角 。但是想要实现的 旋转原点在图片中心 。
同时, Mat格式存储(或二维数组)的 坐标系中 y轴正方向向下 。
本文共计1245个文字,预计阅读时间需要5分钟。
图片旋转,本质上是对旋转后图片中每个像素点在原图中的位置进行计算。然后将这些位置上的像素值复制过来,就完成了旋转。如果计算出的位置不是整数,则由于像素点是离散的,需要四舍五入到最近的像素点。
图片旋转,本质上是对旋转后的图片中每个像素点计算在原图的位置。然后照搬过来就好。
(多说一句,如果计算出来在原图中的位置不是整数而是小数,因为像素点个数都是整数,就需要小数到整数的转换。这个转换过程是有讲究的,需要用到插值:最近邻插值、双线性插值等等。这里我使用的是最简单的最近邻插值,即对小数四舍五入成整数,C/C++ 实现四舍五入见 这里 )
图形图像课上一般会介绍旋转变换矩阵,其中 t 为需要旋转的角度,[x'; y']是变换后坐标(其中分号表示上下关系):
即表示为:[x'; y'] = [cos(t) sin(t); -sin(t) cos(t)][x; y]
因为我个人兴趣爱好(放P就是老师逼的。。。),不允许使用 OpenCV 封装好的旋转函数。只能自己实现,我开始的想法是:先求变换矩阵逆矩阵,然后将一张全黑图中每个点一一对应插值到原图中。
结果发现转换后图片全黑了……
后来发现原点设置不对。用OpenCV中的 Mat格式存储(或二维数组)的图片, 原点在左上角 。但是想要实现的 旋转原点在图片中心 。
同时, Mat格式存储(或二维数组)的 坐标系中 y轴正方向向下 。

