getAffineTransform函数
getAffineTransform函数
函数作用:
主要用于生成仿射变换矩阵
一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移).
综上所述, 我们能够用仿射变换来表示:
- 旋转 (线性变换)
- 平移 (向量加)
- 缩放操作 (线性变换)
你现在可以知道, 事实上, 仿射变换代表的是两幅图之间的 关系 .
我们通常使用 矩阵来表示仿射变换.
考虑到我们要使用矩阵 和 对二维向量 做变换, 所以也能表示为下列形式:
or
怎样才能求得一个仿射变换?
好问题. 我们在上文有提到过仿射变换基本表示的就是两幅图片之间的 联系 . 关于这种联系的信息大致可从以下两种场景获得:
- 我们已知 和 T 而且我们知道他们是有联系的. 接下来我们的工作就是求出矩阵
- 我们已知 and . 要想求得 . 我们只要应用算式 即可. 对于这种联系的信息可以用矩阵 清晰的表达 (即给出明确的2×3矩阵) 或者也可以用两幅图片点之间几何关系来表达.
让我们形象地说明一下. 因为矩阵 联系着两幅图片, 我们以其表示两图中各三点直接的联系为例. 见下图:
点1, 2 和 3 (在图一中形成一个三角形) 与图二中三个点一一映射, 仍然形成三角形, 但形状已经大大改变. 如果我们能通过这样两组三点求出仿射变换 (你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点.
函数的调用形式:
C++:Mat getAffineTransform(InputArray src, InputArray dst)
参数详解:
InputArray src:表示输入的三个点
InputArray dstL:表示输出的三个点
获取变换矩阵
opencv代码:
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h>using namespace cv; using namespace std;/// 全局变量 char* source_window = "Source image"; char* warp_window = "Warp"; char* warp_rotate_window = "Warp + Rotate";/** @function main */int main( int argc, char** argv ){Point2f srcTri[3];Point2f dstTri[3];Mat rot_mat( 2, 3, CV_32FC1 );Mat warp_mat( 2, 3, CV_32FC1 );Mat src, warp_dst, warp_rotate_dst;/// 加载源图像src = imread( argv[1], 1 );/// 设置目标图像的大小和类型与源图像一致warp_dst = Mat::zeros( src.rows, src.cols, src.type() );/// 设置源图像和目标图像上的三组点以计算仿射变换srcTri[0] = Point2f( 0,0 );srcTri[1] = Point2f( src.cols - 1, 0 );srcTri[2] = Point2f( 0, src.rows - 1 );dstTri[0] = Point2f( src.cols*0.0, src.rows*0.33 );dstTri[1] = Point2f( src.cols*0.85, src.rows*0.25 );dstTri[2] = Point2f( src.cols*0.15, src.rows*0.7 );/// 求得仿射变换warp_mat = getAffineTransform( srcTri, dstTri );/// 对源图像应用上面求得的仿射变换warpAffine( src, warp_dst, warp_mat, warp_dst.size() );/** 对图像扭曲后再旋转 *//// 计算绕图像中点顺时针旋转50度缩放因子为0.6的旋转矩阵Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );double angle = -50.0;double scale = 0.6;/// 通过上面的旋转细节信息求得旋转矩阵rot_mat = getRotationMatrix2D( center, angle, scale );/// 旋转已扭曲图像warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );/// 显示结果namedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );namedWindow( warp_window, CV_WINDOW_AUTOSIZE );imshow( warp_window, warp_dst );namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE );imshow( warp_rotate_window, warp_rotate_dst );/// 等待用户按任意按键退出程序waitKey(0);return 0;}
getAffineTransform函数相关推荐
- listen函数的第二个参数_【图像处理】OpenCV系列十七 --- 几何图像变换函数详解(一)...
上一篇我们学习了仿射变换的warpAffine函数,知道了如何用这个函数对图像进行旋转.平移等操作,那么本节我们一起来学习一下与仿射变换相关的其他函数以及相关的几何图像变换. 一.convertMap ...
- OpenCV每日函数 专栏简述(陆续整理中)
一.OpenCV概述 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库.OpenCV库拥有超过 2500 种优化算法,其中包 ...
- 【OpenCV 4开发详解】图像仿射变换
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...
- 【学习笔记】opencv的python接口 几何变换
先跑一下示例代码: 平移: import cv2 as cv import numpy as np from matplotlib import pyplot as plt img = cv.imre ...
- python 几何教学_opencv-python教程学习系列11-几何变换
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍几何变换,坚持学习,共同进步. 系统环境 系统:win7_x64; python版本:python ...
- OpenCV3学习(5.1)——图像变换之缩放、金字塔、仿射、透射
resize函数 OpenCV提供了resize函数来改变图像的大小,函数原型如下: CV_EXPORTS_W void resize( InputArray src, OutputArray dst ...
- [练气期]计算机视觉之从矩阵本质修炼图像几何变换秘籍
[练气期]计算机视觉之从矩阵本质修炼图像几何变换秘籍 练气期,我们需要掌握哪些图像处理知识? 掌握OpenCV和图像处理的基础知识,并进行实践操作,具体包含: 为什么选择OpenCV,OpenCV是什 ...
- Qt5 和 OpenCV4 计算机视觉项目:1~5
原文:Qt 5 and OpenCV 4 Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后 ...
- 精通 Python OpenCV4:第二部分
原文:Mastering OpenCV 4 with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MTPE)流程来尽 ...
最新文章
- 最新 30 道 Dubbo 面试题及答案
- Easyui 让DataGrid适应浏览器宽度
- 构造数独 算法及代码实现
- java命令行执行编译好的类_Java命令行编译并执行Java程序
- Java基础学习总结(99)——Java代码性能优化总结
- MySQL数据库专家分享资深DBA经验
- 关于Cocoa框架的争论
- c++用类实现高斯消元法求解线性方程组的解_高斯消元
- Leetcode-401-二进制手表
- ai人工智能有哪些_进入AI有多么简单
- python qt 按钮实现拖放_[Python自学] PyQT5-控件拖拽、剪切板
- 常成员函数函数和返回值为常量的函数
- SEO优化:自建站图片优化攻略
- 视图、存储过程、触发器
- 短信平台验证码的特点
- 一次使用NodeJS实现网页爬虫记 - huanping - 博客园
- UI交互设计:红绿立体图片的制作
- angular(使用Angular指令)
- /*数电 译码器3-8变4-16
- python中用plot绘制两条直线_在Matplotlib中绘制两条直线之间角度的最佳方法