【OpenCV】-仿射变换

这篇具有很好参考价值的文章主要介绍了【OpenCV】-仿射变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、认识仿射变换

仿射变换(Affine Map)又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。保持二维图形之间的相对位置保持不变,平行线依然是平行线,且直线上的点的位置顺序不变。

一个任意的仿射变换都可以表示为乘以一个矩阵接着再加上一个向量的形式。三种常见的变换形式:

  • 旋转:ratation(线性变换)
  • 平移:translation(向量加)
  • 缩放:scale(线性变换)

通常使用2 x 3的矩阵来表示仿射变换:

【OpenCV】-仿射变换

【OpenCV】-仿射变换

2、仿射变换的求法

说明:仿射变换表示的就是两幅图片之间的一种联系,关于这种联系的信息大致可以分为以下两种场景:

  • 已知X和T,而且已知它们是有联系的,接下来的跟着就是求出矩阵M。
  • 已知M和X,想要求得T。只要应用算式T=M*X即可。

【OpenCV】-仿射变换

如上,点1、2、3(在Image 1中形成一个三角形)与Image 2中的三个点是一一映射的关系,且它们仍然形成三角形,但形状已经和之前的不一样的,可以通过这样的两组三点求出仿射变换,然后把这种变换应用到图像中去。

3、进行仿射变换:warpAffine()函数

warpAffine()函数的作用依据下面的公式对图像做仿射变换:
d s t ( x , y ) = s r c ( M 11 X + M 12 Y + M 13 , M 21 X + M 22 Y + M 23 ) dst(x,y)=src(M11X+M12Y+M13,M21X+M22Y+M23) dst(x,y)=src(M11X+M12Y+M13,M21X+M22Y+M23)

void warpAffine(InputArray src,OutputArray dst,InputArray M,Size dsize,int flags=INTER_LINEAR,intborderMOde=BODER_CONSTANT,const Scalar& borderValue=Scalar())
  • 第一个参数:输入图像

  • 第二个参数:输出图像,函数调用后的运算结果存在这里,需要和源图片有一样的尺寸和类型

  • 第三个参数:2 x 3的变换矩阵,求得的仿射变换

  • 第四个参数:表示输出图像的尺寸

  • 第五个参数:插值方法的标识符。默认值是线性插值法(INTER_LINEAR)

    【OpenCV】-仿射变换

  • 第六个参数:边界像素模式

  • 第七个参数:在恒定的边界情况下取值,默认值Scalar(),即0

4、计算二维旋转变换矩阵:getRotationMatrix2D()函数

说明:getRotationMatrix2D()函数用于计算二维旋转变换矩阵。变换会将旋转中心映射到它自身

Mat getRotationMatrix2D(Point2f center,double angle,double scale)
  • 第一个参数:表示源图像的旋转中心
  • 第二个参数:旋转角度。角度为正值表示向逆时针旋转(坐标原点是左上角)
  • 第三个参数:缩放系统

5、示例程序:

#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
#define WINDOW_NAME1 "【原始图窗口】"
#define WINDOW_NAME2 "【经过Warp后的窗口】"
#define WINDOW_NAME3 "【经过Warp和Rotate后的窗口】"
int main()
{
	system("color 2F");
	//参数准备
	Point2f srcTriangle[3];
	Point2f dstTriangle[3];

	Mat rotMat(2, 3, CV_32FC1);
	Mat warpMat(2, 3, CV_32FC1);
	Mat srcImage, dstImage_warp, dstImage_warp_rotate;
	//加载源图像
	srcImage = imread("E:\\Pec\\lan.jpg",1);
	//设置目标图像的大小和类型与源图像一致
	dstImage_warp = Mat::zeros(srcImage.rows, srcImage.cols, srcImage.type());
	//设置源图像和目标图像上的三组点以计算仿射变换
	//srcTriangle[0] = Point2f(0, 0); //Point2f表示Point类的两个数据x,y为float类型;vector 表示存放四维int
	//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));
	//获取变换矩阵,指定三个点
	srcTriangle[0] = Point2f(50, 50); 
	srcTriangle[1] = Point2f(200, 50);
	srcTriangle[2] = Point2f(50, 200);
	dstTriangle[0] = Point2f(100, 100);
	dstTriangle[1] = Point2f(200, 50);
	dstTriangle[2] = Point2f(100, 250);
	//求仿射变换,得到一个2x3的矩阵
	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 = -30.0;
	double scale = 0.8;
	//通过上面的旋转细节信息求出旋转矩阵
	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;

}

【OpenCV】-仿射变换文章来源地址https://www.toymoban.com/news/detail-477391.html

到了这里,关于【OpenCV】-仿射变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • opencv仿射变换

    #include opencv2/opencv.hpp /* 功能:对一系列坐标点进行平移仿射变换 参数: srcPoints:输入点坐标 dstPoints:变换后的点坐标 x:x方向平移的距离 y:y方向平移的距离 */ void tranlatePoints(std::vectorcv::Point2f srcPoints, std::vectorcv::Point2f dstPoints,double x,double y) {     cv::Mat affineMatrix = (cv::Mat_double

    2024年01月16日
    浏览(29)
  • 【OpenCV】-仿射变换

    1、认识仿射变换 仿射变换(Affine Map)又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间的过程。保持二维图形之间的相对位置保持不变,平行线依然是平行线,且直线上的点的位置顺序不变。 一个任意的仿射变换都可以

    2024年02月08日
    浏览(57)
  • 仿射变换代码opencv

    顺时针为正,左上角为默认坐标原点 CV_INSTRUMENT_REGION() 是一个OpenCV宏,用于在代码中进行性能分析和测量。它可以用于标记代码的某个区域,以便在运行时获取该区域的性能指标。(不太明白,先放一下)  

    2024年01月17日
    浏览(81)
  • 【C++ OpenCV】图像变换:连接、尺寸、翻转、旋转、仿射变换

    目录 图像缩放变换 图像翻转 图像拼接 纵向拼接 横向拼接 图像插值原理 作用 单线性插值 双线性插值的公式 双线性插值的例子 双线性插值的直观展示 意义 仿射变换 图像旋转 实操 一、实现图像旋转 二、根据定义的三个点实现仿射变换,并且求取仿射变换矩阵 源码 src -

    2024年01月18日
    浏览(38)
  • 【OpenCV】图像变换(缩放、平移、旋转、仿射)

    图像变换是指通过对图像进行缩放、平移、旋转、仿射、透视等变换来改变图像的形状和大小。在本篇博客中,我们将详细介绍OpenCV中的图像变换函数,并提供示例代码以帮助读者更好地理解这些函数的使用方法。 缩放变换是指通过改变图像的大小来改变图像的形状。在Op

    2024年02月07日
    浏览(39)
  • OPENCV C++(六)canny边缘检测+仿射变换+透射变换

    图像的缩放  输入图像 输出图像 大小变换 canny边缘算子的使用  必须先转化为灰度图,作为输入 超过100是真的边缘 低于40是确定不是边缘 在中间若连接边缘 则为边缘  普通旋转缩放变换(仿射变换) 获取仿射变换的矩阵 中心点 旋转角度 大小是否变换 -10是顺时针转 输入

    2024年02月14日
    浏览(38)
  • OpenCV图像的仿射变换、旋转和缩放

    以下是对代码的逐行解释:

    2024年02月13日
    浏览(31)
  • 我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

    几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine :使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。 cv2.warpPerspective :使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等操作。 cv2.getAffineTransform :计算仿射变换

    2024年02月05日
    浏览(38)
  • 【Python图像处理篇】opencv中的仿射变换和透视变换

    仿射变换可以将矩形图片映射为平行四边形, 透视变换可以将矩形图片映射为任意四边形。 opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective, 使用这两个函数可以实现所有类型的变换。 cv2.warpAffine 接收的参数2x3的变换矩阵; 而 cv2.warpPerspective 接收的3x3的变换矩阵。

    2024年01月24日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包