opencv 图像旋转
理论
http://www.cnblogs.com/wangguchangqing/p/4045150.html
翻开任意一本图像处理的书,都会讲到图像的几何变换,这里面包括:仿射变换(affine transformation)、投影变换(projecttive transformation)。前者针对的是平面上的物体位姿变化,如水平/垂直方向位移、旋转、缩小/放大,常见的应用有ORC字符识别。后者针对的是三维空间中的位置变化,受限于物体依然是平面的,也称为二维投影变换,常见的应用有车牌识别。
图像变换:以上所有变换均可以通过矩阵描述,将输入图像与变换矩阵进行矩阵乘法得到变换后的图像坐标。显然,这种方式非常适合编程实现。
opencv仿射变换函数说明
opencv提供了,从变换矩阵计算,到图像变换,每个流程的一揽子解决方案。
以opencv 3.0为例,参考几何变换模块说明:
1、getAffineTransform
Mat getAffineTransform(InputArray src, InputArray dst)
该函数需要已知变换前与变换后的坐标,返回相应的变换矩阵,至于是何种变换无需事先知道。适用于目标检测场合,通过检测得到的特征点进行图像匹配。
2、getRotationMatrix2D
Mat getRotationMatrix2D(Point2f center, double angle, double scale)
已知旋转中心坐标(坐标原点为图像左上端点)、旋转角度(单位为度°,顺时针为负,逆时针为正)、放缩比例,返回旋转/放缩矩阵。与getAffineTransform相比,无需知道变换后坐标,适用于一般情况下的图像变换。
3、warpAffine
void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
根据etAffineTransform或getRotationMatrix2D得到的变换矩阵,计算变换后的图像。
src为输入图像
dst为变换后图像,类型与src一致。
M为变换矩阵,需要通过其它函数获得,当然也可以手动输入。
dsize为输出图像的大小
flags,插值算法,详细如下:
-
enum InterpolationFlags{
-
/** nearest neighbor interpolation */
-
INTER_NEAREST = 0, //最近邻插值
-
/** bilinear interpolation */
-
INTER_LINEAR = 1, //双线性插值
-
/** bicubic interpolation */
-
INTER_CUBIC = 2, //双三次插值
-
/** resampling using pixel area relation. It may be a preferred method for image decimation, as
-
it gives moire'-free results. But when the image is zoomed, it is similar to the INTER_NEAREST
-
method. */
-
INTER_AREA = 3, //区域插值,使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 <span style="font-family: Arial, Helvetica, sans-serif;">INTER_NEAREST</span>方法
-
/** Lanczos interpolation over 8x8 neighborhood */
-
INTER_LANCZOS4 = 4, //Lanczos插值(超过8×8像素邻域的Lanczos插值)
-
/** mask for interpolation codes */
-
INTER_MAX = 7,
-
/** flag, fills all of the destination image pixels. If some of them correspond to outliers in the
-
source image, they are set to zero */
-
WARP_FILL_OUTLIERS = 8, //填充所有输出图像的象素
-
/** flag, inverse transformation
-
-
For example, polar transforms:
-
- flag is __not__ set: \f$dst( \phi , \rho ) = src(x,y)\f$
-
- flag is set: \f$dst(x,y) = src( \phi , \rho )\f$
-
*/
-
WARP_INVERSE_MAP = 16 //逆变换
-
};
borderMode,边界处理方式
-
enum BorderTypes {
-
BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i`
-
BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
-
BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb`
-
BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg`
-
BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
-
BORDER_TRANSPARENT = 5, //!< `uvwxyz|absdefgh|ijklmno`
-
-
BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
-
BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
-
BORDER_ISOLATED = 16 //!< do not look outside of ROI
-
};
opencv实现图像旋转(其它仿射变换的流程与此一致)
-
Mat src;
-
Mat dst(src.size(),src.type());
-
...
-
cv::Point2f center(x0,y0);
-
double ang = -30;
-
cv::Mat rotMat = cv::getRotationMatrix2D(center,ang,1);
-
cv::warpAffine(src,dst,rotMat,src.size());
顺时针旋转30度
更多请参考:
opencv 图像旋转的更多相关文章
- OpenCV:OpenCV图像旋转的代码
OpenCV图像旋转的代码 cv::transpose( bfM, bfM ) 前提:使用两个矩阵Mat型进行下标操作是不行的,耗费的时间太长了.直接使用两个指针对拷贝才是王道.不知道和OpenCV比 ...
- OpenCV图像旋转
图像旋转是指图像按照某个位置转动一定角度的过程,旋转中图像仍保持这原始尺寸.图像旋转后图像的水平对称轴.垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换. 如下图: 假 ...
- OpenCV 图像旋转实现
1 旋转矩形 首先建议阅读图像旋转算法原理-旋转矩阵,这篇博客可以让你很好地理解图像中的每一个点是如何进行旋转操作的.其中涉及到了图像原点与笛卡尔坐标原点之间的相互转换以及点旋转的一些公式推导. 这里 ...
- OpenCL + OpenCV 图像旋转
▶ 使用 OpenCV 从文件读取彩色的 png 图像,旋转一定角度以后写回文件 ● 代码,核函数 // rotate.cl //__constant sampler_t sampler = CLK_ ...
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...
- [opencv] 图像几何变换:旋转,缩放,斜切
几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...
- 基于c++和opencv底层的图像旋转
图像旋转:本质上是对旋转后的图片中的每个像素计算在原图的位置. 在opencv包里有自带的旋转函数,当你知道倾斜角度theta时: 用getRotationMatrix2D可得2X3的旋转变换矩阵 M ...
- OpenCV计算机视觉学习(11)——图像空间几何变换(图像缩放,图像旋转,图像翻转,图像平移,仿射变换,镜像变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 图像 ...
- 【OpenCV学习笔记】之六 手写图像旋转函数---万丈高楼平地起
话说,平凡之处显真格,这一点也没错! 比如,对旋转图像进行双线性插值,很简单吧? 可,对我,折腾了大半天,也没有达到预期效果! 尤其是三个误区让我抓瞎好久: 1,坐标旋转公式. 这东西,要用 ...
随机推荐
- java高并发系列 - 第3天:有关并行的两个重要定律
有关为什么要使用并行程序的问题前面已经进行了简单的探讨.总的来说,最重要的应该是处于两个目的. 第一,为了获得更好的性能: 第二,由于业务模型的需要,确实需要多个执行实体. 在这里,我将更加关注第一种 ...
- TCP协议如何保证可靠传输?
一.TCP的可靠传输如何保证? 在TCP连接中,数据流必须以正确的顺序传送给对方.TCP的可靠性是通过顺序编号和确认(ACK)实现的.TCP在开始传送一个段时,为准备重传而首先将该段插入到发送队列中, ...
- H265之格式解析
头定义如下: 上一段码流: 前面 4个字节位00 00 00 01 为nul头,这个和H264是一样的. 下面两个字节为40 01 ====>二进制 0100 0000 0000 0001 F ...
- 一款开源且超好用的网站克隆机 HTTrack
0x00 前言 我们在学习前端的时候,总是会想着去学习其他人网站是如何制作的,或者我们遇到一些比较有用的知识点的时候,我们可能会选择通过 Ctrl + C / Ctrl + V 去扒下内容,然而我并非 ...
- Python—基本数据类型
核心数据类型: 数字(int整型.float浮点型.complex复数.bool布尔型) 字符串 str 列表(List) 元组(Tuple) 字典(Dictionary) 集合() 数字 整数,浮点 ...
- liteos CPU占用率(十六)
1. 概述 1.1 基本概念 CPU(中央处理器, Central Processing Unit)占用率可以分为系统CPU占用率和任务CPU占用率两种. 系统CPU占用率(CPU Percent)是 ...
- Centos系统配置bond0
版权声明:本文为博主原创文章,支持原创,转载请附上原文出处链接和本声明. 本文链接地址:https://www.cnblogs.com/wannengachao/p/11942254.html 1.查 ...
- 实时SSH网络吞吐量测试
centos 需要epel 源安装pv 软件,debian 需要安装pv 软件 #测试本机到192.168.1.158 的实时速率 yes | pv | ssh 192.168.1.158 " ...
- c# 第22节 c#四大方法 静态方法、实例方法、虚方法、重新方法
本节内容: 1:静态方法和实例方法什么 2:虚方法是什么 3:重写方法 4:禁止重写方法 1:静态方法和实例方法是什么 静态方法,一般是类的常用方法,允许在不创建类的实例的情况下,直接调用. 静态方法 ...
- 鱼嘤嘤小分队 Alpha冲刺阶段博客目录
会议记录 周数 链接 主要工作 第六周 第六周链接 确定技术路线 第七周 第七周链接 讨论进展 最近的主要工作: 由于我们的代码能力以及pyhon的基础知识已经网络通信的知识储备是不够的,所以我们 ...