API函数

1、获取仿射矩阵

(1)getAffineTransform       //设置原图像与目标图像上三点计算矩阵
Mat A=getAffineTransform(const Point2f* src, const Point2f* dst)
      参数const Point2f* src:原图的三个固定顶点
      参数const Point2f* dst:目标图像的三个固定顶点
      返回值:Mat型变换矩阵,可直接用于warpAffine()函数
      注意,顶点数组长度超过3个,则会自动以前3个为变换顶点;数组可用Point2f[]或Point2f*表示
(2)getRotationMatrix2D       //计算二维旋转变换矩阵
Mat B=getRotationMatrix2D (CvPoint2D32f  center,double angle,double scale)
       参数CvPoint2D32f  center,表示源图像旋转中心
       参数double angle,旋转角度,正值表示逆时针旋转
       参数double scale,缩放系数

2、进行仿射变换

C++ void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
       //参数InputArray src:输入变换前图像
        //参数OutputArray dst:输出变换后图像,需要初始化一个空矩阵用来保存结果,不用设定矩阵尺寸
        //参数InputArray M:变换矩阵,用另一个函数getAffineTransform()计算
        //参数Size dsize:设置输出图像大小
        //参数int flags = INTER_LINEAR:设置插值方式,默认方式为线性插值(另一种WARP_FILL_OUTLIERS)
        //参数int borderMode=BORDER_CONSTANT:边界像素模式,默认值BORDER_CONSTANT
        //参数const Scalar& borderValue=Scalar(),在恒定边界情况下取的值,默认值为Scalar(),即0

示例代码

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;//全局变量
Mat warpmat(2, 3, CV_32FC1);
Mat ropmat(2, 3, CV_32FC1);
int s11, s12, s21, s22, s31, s32;
int d11, d12, d21, d22, d31, d32;void warp()
{//定义原图与目标图像的三组点Point2f src_point[3];Point2f dst_point[3];cout << "请输入原图像的第一个点" << endl;cin >> s11;cin >> s12;src_point[0] = Point2f(s11, s12);cout << "请输入原图像的第二个点" << endl;cin >> s21;cin >> s22;src_point[1] = Point2f(s21, s22); cout << "请输入原图像的第三个点" << endl;cin >> s31;cin >> s32;src_point[2] = Point2f(s31, s32);cout << "原图像的三个点为:" << endl;cout << src_point[0] << " ";cout << src_point[1] << " ";cout << src_point[2] << endl;cout << "——————————————" << endl;cout << "请输入目标图像的第一个点" << endl;cin >> d11;cin >> d12;dst_point[0] = Point2f(d11, d12);cout << "请输入目标图像的第二个点" << endl;cin >> d21;cin >> d22;dst_point[1] = Point2f(d21,d22);cout << "请输入目标图像的第三个点" << endl;cin >> d31;cin >> d32;dst_point[2] = Point2f(d31, d32);cout << "目标图像的三个点为:" << endl;cout << dst_point[0] << " ";cout << dst_point[1] << " ";cout << dst_point[2] << endl;cout << "——————————————" << endl;warpmat = getAffineTransform(src_point, dst_point);
}void rot(Mat src)
{//图像旋转中心Point center = Point(src.cols / 2, src.rows / 2);//旋转角度:角度为正表示逆时针旋转double angle;cout << "旋转角度为:" << endl;cin >> angle;//缩放系数double scale;cout << "缩放系数为" << endl;cin >> scale;cout << "——————————————" << endl;//得到旋转矩阵ropmat = getRotationMatrix2D(center, angle, scale);
}int main()
{//载入原图Mat src = imread("12.bmp");cvtColor(src, src, COLOR_BGR2GRAY);Mat dst=Mat::zeros(src.size(),src.type());Mat dst1 = Mat::zeros(src.size(), src.type());//改变console(控制台)字体颜色  system("color 0B");//判断图片是否读入if (!src.data){printf("读取图片image0错误~! \n");return false;}//先显示原图namedWindow("【原始图像】");imshow("【原始图像】", src);//循环轮询按键while (1){cout << "\n此图像的大小为:" << src.size() << endl;cout << "按下任意数字键开始程序" << endl;cout << "按下Esc键退出程序" << endl;cout << "——————————————" << endl;//获取键盘按键int c = waitKey(0);//判断ESC是否按下,若按下便退出if ((c & 255) == 27){cout << "程序退出!\n";break;}//得到坐标变换矩阵warp();cout << "您是否需要进行旋转变换" << endl;cout << "【1】:否" << endl;cout << "【2】:是" << endl;cin >> c;if (c == 1){cout << "您正在进行坐标变换图像操作" << endl;//进行仿射变换warpAffine(src, dst, warpmat, dst.size());imshow("【结果图】", dst);}else if (c == 2){cout << "您正在进行旋转图像操作" << endl;//得到旋转变换矩阵rot(src);//进行仿射变换warpAffine(src, dst, warpmat, dst.size());warpAffine(dst, dst, ropmat, dst.size());imshow("【旋转结果图】", dst);}}return 0;
}

opencv仿射变换相关推荐

  1. OpenCV仿射变换 SURF特征点描述合辑

    原文:http://blog.csdn.net/poem_qianmo/article/details/33320997?utm_source=tuicool&utm_medium=refer ...

  2. OpenCV仿射变换Affine Transformations

    OpenCV仿射变换Affine Transformations 仿射变换Affine Transformations 目标 理论 什么是仿射变换? 我们如何获得仿射变换? 代码 这个程序做什么? 解 ...

  3. opencv仿射变换:平移,缩放和旋转

    目录 仿射变换原理 opencv中仿射变换实现 使用getAffineTransform()函数求仿射变换矩阵 使用 getRotationMatrix2D()函数获取仿射矩阵 使用仿射矩阵对图像做仿 ...

  4. OpenCV仿射变换--平移

    OpenCV仿射变换--平移 OpenCV仿射变换--平移 OpenCV仿射变换--平移 公式及原理 OpenCV函数 实现代码 代码执行效果 公式及原理 定义原坐标为(x,y),平移后(xoffec ...

  5. opencv 仿射变换与透视变换详解

    常见的2D图像变换从原理上讲主要包括基于2×3矩阵的仿射变换和基于3×3矩阵透视变换. 仿射变换 原理 基本的图像变换就是二维坐标的变换:从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换: ...

  6. (三) OpenCV仿射变换与透射变换(Affine and Perspective Transform)

    图像最基本的变换即仿射变换(Affine Transform)和透射变换(Perspective Transform).仿射变换是对一个向量空间进行一次线性变换并接上一次平移.透射变换是中心投影的射影 ...

  7. OpenCV——仿射变换

    getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换 Mat getRotationMatrix2D( Point2f center, d ...

  8. opencv仿射变换和透视变换门牌号实践总结

    前几日在门牌号识别优化过程中发现当摄像头拍摄角度倾斜或者相机仰头拍摄出来的门牌号发生了畸变,即使能够找到门牌号区域也大大降低了识别的准确度,因此想到了倾斜矫正--仿射变换和透视变换,关于这两个概念网上 ...

  9. OpenCV 仿射变换

    图像的仿射变换涉及到图像的形状位置角度的变化,是深度学习预处理中常到的功能,仿射变换主要是对图像的缩放,旋转,翻转和平移等操作的组合. 仿射变换:一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换 ...

最新文章

  1. python3 opencv_Python3 OpenCV3 图像处理基础
  2. einsum,一个函数走天下
  3. 终于可以光明正大的推别人了
  4. java学习笔记4--对象的初始化与回收
  5. 线程wait()和sleep()的区别
  6. HDU- 2973 YAPTCHA(威尔逊定理)
  7. Hadoop 2.0安装以及不停集群加datanode
  8. .bat是什么语言_简单说说当我们打开网页时,浏览器到底做了什么?
  9. applicationproperties不是小叶子_为何“砂糖桔”是带着叶子出售?原来其中有着“猫腻”,涨知识了...
  10. 泥塑课c语言,【C】泥塑课(From http://www.jisuanke.com/)
  11. eclipse插件 - lombok的安装
  12. 银行突发事件演练方案_【工作动态】准旗联社组织开展优质文明服务应急演练,为优质服务保驾护航!...
  13. Idea 里svn的导入使用
  14. Minecraft 1.12.2模组开发(三十七) 3D盔甲
  15. python123高次方程求根_GitHub - loveunk/math-advanced-algebra-notes: 根据丘维声的《高等代数》整理...
  16. 何水无鱼?何山无石?何人无父?何女无夫?何树无枝?何城无市?
  17. 京东2019春招商业分析试卷[题目整理]
  18. 【python基础教程】计算器
  19. katago安装使用
  20. 链接被微信拦截(被封锁、被屏蔽、被和谐)最新方法

热门文章

  1. HarmonyOS UI开发 PositionLayout(位置布局) 的使用
  2. python 保存内容到记事本里面
  3. Java / Android String.format 的使用
  4. Installation error: INSTALL_FAILED_VERSION_DOWNGRADE
  5. R.Java文件报错
  6. VS各种错误集成总结,持续更新
  7. 2022-2028年中国中小企业电子商务市场投资分析及前景预测报告
  8. POJ 1410 Intersection
  9. 可以发张图片做链接用吗
  10. leetcode:Search in Rotated Sorted Array