opencv 拉伸、扭曲、旋转图像-仿射变换 opencv1 / opencv2 / python cv2(代码)
来源:互联网 发布:域名到期时间影响seo 编辑:程序博客网 时间:2024/05/17 01:05
http://blog.csdn.net/u012005313/article/details/46714637
仿射变换-基于2x3矩阵进行的图像变换
一个任意的仿射变换可以表达为乘以一个矩阵再加上一个向量的形式。在OpenCV里,代表这种变换的标准形式是2x3矩阵。
######################################################
稠密仿射变换
src和dst表示数组或图像,可以是单通道或三通道的任意类型(假定我们大小和类型是相同的)
map_matrix是一个对所需要的变换进行量化的2x3矩阵
flags控制插值的方法以及下面一个或两个附加选项(通常用布尔或操作来组合)
CV_WARP_FILL_OUTLINES: 通常,变换的src图像不能和dst图像完美匹配-从源图像映射的像素可能实际上并不存在。如果设置了标志位,这些失去的值就会由fillval补充
CV_WARP_INVERSE_MAP:这个标志位用于方便地进行从dst到src的逆向变形,而不是从src到dst的变换
cvWarpAffine()涉及开销问题。
另一种方法是利用cvGetQuadrangleSubPix()。这个函数的选项更少但优点更多,尤其是,它的开销比较小而且可以处理源图像是8位而目标图像是32位浮点图像的特殊情况。同时它能处理多通道图像。
生成映射矩阵map_matrix。如果已有两幅图像要通过仿射变换发生关联或希望以那种方式来逼近可以使用如下函数:
src和dst是包含三个三维点(x,y)的数组,map_matrix所表示的仿射变换就是通过这些点来计算。
cvGetAffineTransform()中的pts_src和pts_dst是其中包含三个点的数组,它们定义了两个平行四边形。描述仿射变换的简单方法就是把pts_src设置为源图像的三个角-例如:源图像的左上角和左下角以及右上角。从源图像到目标图像的映射完全由特定的pts_dst定义,这三个点的位置将会被映射到目标图像。一旦这三个独立点(实际上是指定一个“有代表性”的平行四边形)的映射完成,所有其他点会依次变形。
note:只需要三个点,因为对于仿射变换来说,只需要表示一个平行四边形。涉及透视变换时,就需要四个点以表示一个普通梯形。
cv2DRotationMatrix()
用来计算围绕任意点的旋转的映射矩阵和一个可选择的尺度
第一个参数center是旋转中心
第2个和第3个参数给出了旋转的角度和缩放尺度
最后一个参数map_matrix是输出的映射矩阵,总是一个浮点类型的2x3矩阵
旋转图像
#############################################################################
参考:《OpenCV3编程入门》第7.4章
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html
opencv2
仿射变换(Affine Transformation 或 Affine Map),又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。
一个任意的仿射变换都能表示为乘以一个矩阵(线性变换),接着再加上一个向量(平移)的形式。
用仿射变换能表示如下三种常见的变换形式:
1.旋转,rotation(线性变换)
2.平移,translation(向量加)
3.缩放,scale(线性变换)
通常使用2x3的矩阵来表示仿射变换
OpenCV仿射变换一般涉及到warpAffine和getRotationMatrix2D函数:
1.使用OpenCv函数warpAffine来实现一些简单的重映射
2.使用OpenCV函数getRotationMatrix2D来获得旋转矩阵
仿射变换函数:warpAffine()
参数解析:
src:InputArray类型的src,输入图像,即源图像,使用Mat类的对象即可
dst:OutputArray类型的dst,函数调用后的运算结果存在这里,需要和源图像有一样的尺寸和类型
M:InputArray类型的M,2x3大小的变换矩阵
dsize:Size类型的dsize,表示输出图像的尺寸
flags:int类型的flags,插值方法的标识符。默认为INTER_LINEAR(线性插值)
可选的插值方法如下:
INTER_NEAREST:最近邻插值
INTER_LINEAR:线性插值(默认)
INTER_AREA:区域插值
INTER_CUBIC:三次样条插值
INTER_LANCZOS4:Lanczos插值
CV_WARP_FILL_OUTLIERS:填充所有输出图像的像素。如果部分像素落在输入图像的边界外,那么它们的值设定为fillval
CV_WARP_INVERSE_MAP:表示M为输出图像到输入图像的反变换。因此可以直接用来做像素插值。否则,warpAffine函数从M矩阵得到反变换
borderMode:int类型,边界像素模式,默认值为BORDER_CONSTANT
borderValue:const Scalar& 类型,在恒定的边界情况下取的值,默认值为Scalar(),即0。
二维旋转变换矩阵:getRotationMatrix2D矩阵
center:Point2f类型,表示源图像的旋转中心
angle:double类型,旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)
scale:double类型,缩放系数
其他函数:
src:Point2f类型的数组,里面包含源图像的3个点的坐标
dst:Point2f类型的数组,里面包含和src数组中对应的三个点的坐标
利用输入的src和dst,返回2x3大小的仿射变换矩阵新建头文件warpAffineTransform.h:
新建cpp文件warpAffineTransform.cpp:
结果为:
##############################################################################
- opencv 拉伸、扭曲、旋转图像-仿射变换 opencv1 / opencv2 / python cv2(代码)
- opencv 拉伸、扭曲、旋转图像-仿射变换 opencv1 / opencv2 / python cv2(代码)
- opencv 拉伸、扭曲、旋转图像-透视变换
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
- 图像变换 - 图像拉伸、收缩、扭曲、旋转- 仿射变换(cvWarpAffine)
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
- 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
- 图像变换-图像拉伸、收缩、扭曲、旋转[1] - 仿射变换(cvWarpAffine)
- 图像变换 - 图像拉伸、收缩、扭曲、旋转 - 透视变换(cvWarpPerspective)
- opencv for python (10) 图像旋转函数+仿射变换函数+透视变换
- opencv图像旋转--矩阵旋转和仿射变换相比较
- 第六章 - 图像变换 - 图像拉伸、收缩、扭曲、旋转[2] - 透视变换(cvWarpPerspective)
- Python-OpenCv之图像基本处理-平移,缩放,旋转,翻转,裁剪及仿射变换
- OpenCv调整图像大小及仿射变换(旋转)
- opencv实现图像的旋转与仿射变换
- 仿射变换 图像旋转
- 图像仿射变换及图像扭曲(Image Warping)
- 短信验证码
- date 显示日期与时间
- iOS 广告轮播图
- SSH日期录入,日期精确不能精准到时分秒处理
- 非接触式IC卡的分类(三)
- opencv 拉伸、扭曲、旋转图像-仿射变换 opencv1 / opencv2 / python cv2(代码)
- ES的文件导入到AS,分分钟开挂秒他
- WWDC 2012 Session笔记——405 Modern Objective-C
- Java文件操作大全(4)
- HEVC标准概览(五)Profile、Tier和Level
- iOS开发:UITableview的多选功能实现
- 2016下半年技术规划
- phpstorm + xdebug + Xdebug helper 调试php
- HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解