《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换
7.4 仿射变换(Affine Transformation)
7.4.1 概念
1.仿射变换,放射映射,在几何中,一个向量空间按进行一次线性变换(乘以一个矩阵)并接上一个平移(加上一个向量),变换为另一个向量空间的过程,保持了二维图形的平直性和平行性。
2.变换形式:(1)旋转,rotation(2)平移,translation(3)缩放,scale
3.矩阵表示:
使用矩阵A和矩阵B对二维向量X=[x;y]做变换:
或
即:
4.涉及函数:warpAffine()和getRotationMatrix2D()函数
7.4.2 仿射变换函数:warpAffine()函数
1.函数原型:
void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
2.参数说明:
(1)输入图像
(2)输出图像
(3)2*3的变换矩阵M
(4)输出图像尺寸
(5)插值方式标识符,默认INTER_LINEAR,可选插值方式:
(6)边界像素模式,默认BORDER_CONSTANT
(7)在恒定边界情况下取的值,默认Scalar(),即0
7.4.3 计算二维旋转变换矩阵:getRotationMatrix2D()函数
1.函数原型:
void getRotationMatrix2D(Point2f center, double angle, double scale)
2.参数说明:
(1)源图像旋转中心
(2)旋转角度
(3)缩放系数
3.函数操作:
函数计算以下矩阵:
其中,
7.4.4 仿射变换示例
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【Warp后的图像】"
#define WINDOW_NAME3 "【Warp和Rotate后的图像】"int main()
{//参数准备//定义两组点,代表两个三角形Point2f srcTriangle[3];Point2f dstTriangle[3];//定义一些Mat变量Mat rotMat(2, 3, CV_32FC1);Mat warpMat(2, 3, CV_32FC1);Mat srcImage, dstImage_warp, dstImage_warp_rotate;//加载原图并初始化srcImage = imread("love.jpg");if (!srcImage.data){printf("载入原图失败~!\n");return false;}//设置目标图像大小和类型dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());//设置源图像与目标图像上的三组点以计算仿射变换srcTriangle[0] = Point2f(0, 0);srcTriangle[1] = Point2f(static_cast<float>(srcImage.cols - 1), 0);srcTriangle[2] = Point2f(0, static_cast<float>(srcImage.rows - 1));dstTriangle[0] = Point2f(static_cast<float>(srcImage.cols*0.0), static_cast<float>(srcImage.rows*0.33));dstTriangle[1] = Point2f(static_cast<float>(srcImage.cols*0.65), static_cast<float>(srcImage.rows*0.35));dstTriangle[2] = Point2f(static_cast<float>(srcImage.cols*0.15), static_cast<float>(srcImage.rows*0.6));//仿射变换warpMat = getAffineTransform(srcTriangle, dstTriangle);//对原图像应用刚求得的仿射变换warpAffine(srcImage, dstImage_warp, warpMat, dstImage_warp.size());//对图像进行缩放变换后再旋转//计算图像中点顺时针旋转50度缩放因子为0.6的矩阵Point center = Point(dstImage_warp.cols / 2, dstImage_warp.rows / 2);double angle = -50.0;double scale = 0.6;//通过上面的旋转细节信息求得旋转矩阵rotMat = getRotationMatrix2D(center, angle, scale);//旋转已缩放的图像warpAffine(dstImage_warp, dstImage_warp_rotate, rotMat, dstImage_warp.size());//显示结果imshow(WINDOW_NAME1, srcImage);imshow(WINDOW_NAME2, dstImage_warp);imshow(WINDOW_NAME3, dstImage_warp_rotate);waitKey(0);return 0;
}
运行效果:
《OpenCV3编程入门》学习笔记7 图像变换(四 )仿射变换相关推荐
- 原创 OpenCV3编程入门 学习笔记(总)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...
- OpenCV3编程入门 学习笔记(总)
OpenCV3编程入门 学习笔记 2018.12.12-2018.12.29 此博客为在看过毛星云版<OpenCV3编程入门>后所总结的一本笔记,可供复习使用. 文章目录 OpenCV3编 ...
- Opencv3编程入门学习笔记(五)之通道分离(split)与合并(merge)
若要对Opencv中(BGR)颜色通道进行单一处理,那必然会涉及到通道分离(split)与合并(merge).那么本篇博客笔者记录了两个方法的使用方法和案例.案例来源于<Opencv3编程入门学 ...
- Opencv3编程入门学习笔记(四)之split通道分离Debug过程中0xC0000005内存访问冲突问题
这是笔者学习<Opencv3编程入门>的第四篇博客,这篇博客主要是解决在Windows系统下VS 2013中Debug含有split分离通道色彩函数时报出的0xC0000005内存访问冲突 ...
- 【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV
邂逅OpenCV 文章目录 邂逅OpenCV 前言 1.1 OpenCV周边概念认知 1.1.1 图像处理.计算机视觉与OpenCV 1.1.2 OpenCV概述 1.1.3 起源及发展 1.1.4 ...
- Opencv3编程入门学习笔记(三)之访问图像像素的三种方法
访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...
- 【OpenCV3编程入门学习笔记】——第3章 HighGUI图形用户界面初步
文章目录 前言 3.1 图形的载入.显示和输出到文件 3.1.1 OpenCV的命名空间 3.1.2 Mat类简析 3.1.3 图像的载入与显示概述 3.1.4 图像的载入:imread()函数 3. ...
- Opencv3编程入门学习笔记(二)之显式创建Mat对象
以下总结是基于<Opencv3编程入门>一书4.1节总结的内容进行验证与总结,验证环境均为Windows10 ---VS2013 C++环境,验证Opencv3.0提供的开发包. 1. 方 ...
- 01.Java 编程入门学习笔记20210307
Java 编程入门学习笔记-day01 第0章:编程入门 1.计算机的概述 计算机 = 硬件 + 软件 1.1硬件:冯诺依曼体系 CPU: CPU的衡量标准:速度的计量单位是赫兹(Hz),1Hz相当于 ...
- Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)
全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...
最新文章
- 最新离婚大数据曝光:所有的分手,都是蓄谋已久
- 让你的JS代码更具可读性
- Linux(ubuntu)下安装JDK
- linux 编译C++错误整理
- Source insight关联QT库函数
- weblogic概览下的上下文根配置_Weblogic服务下获取上下文路劲问题
- 多学一招总没错吧?SpringBoot解决前后端分离的跨域问题
- 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
- Liferay7 BPM门户开发之10: 通用流程实现从Servlet到Portlet(Part1)
- 使用MAT分析dump文件
- matlab中polyfit与polyval的功能
- QT入门(一)——QT概述
- UV Mapping(UV贴图)
- ASP.NET MVC2 视频教程下载地址
- 用Google地图获取地图上某点的经纬度坐标
- 数字化改造大宗商品供应链 ,为大宗商品贸易增添活力
- 网络协议—三要素与五层网络协议
- 微信小程序--获取二维码(java后端)
- Windows 10 截图功能再度升级
- 集成电路开发及应用-版图设计专栏目录
热门文章
- NLP进阶之(七)膨胀卷积神经网络
- pytorch系列 -- 9 pytorch nn.init 中实现的初始化函数 uniform, normal, const, Xavier, He initialization...
- 使用idea新建maven工程的web项目的步骤
- i.MX6UL: i.MX 6UltraLite处理器 - 低功耗,安全,Arm® Cortex®-A7内核
- TVM交叉编译和远程RPC
- FPGA最全科普总结
- 2021年大数据Hadoop(二十六):YARN三大组件介绍
- 微信 request 合法域名校验出错
- pip install numpy/pandas时报错的解决方法
- 谷歌不更新android studio,彻底迈向64位:谷歌宣布 Android Studio 将停止 32 位版本更新...