返回顶部
首页 > 资讯 > 后端开发 > Python >OpenCV仿射变换的示例代码
  • 696
分享到

OpenCV仿射变换的示例代码

2024-04-02 19:04:59 696人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1、认识仿射变换2、仿射变换的求法3、进行仿射变换:warpAffine()函数4、计算二维旋转变换矩阵:getRotationMatrix2D()函数5、示例程序:1、认识仿射

1、认识仿射变换

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

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

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

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

2、仿射变换的求法

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

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

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

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

warpAffine()函数的作用依据下面的公式对图像做仿射变换:

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)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oCWwUOWK-1659625193572)(F:\学习记录\opencv\截图\image-20220804143908462.jpg)]

  • 第六个参数:边界像素模式
  • 第七个参数:在恒定的边界情况下取值,默认值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仿射变换的示例代码的文章就介绍到这了,更多相关OpenCV 仿射变换内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网! 

--结束END--

本文标题: OpenCV仿射变换的示例代码

本文链接: https://lsjlt.com/news/119859.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • OpenCV仿射变换的示例代码
    目录1、认识仿射变换2、仿射变换的求法3、进行仿射变换:warpAffine()函数4、计算二维旋转变换矩阵:getRotationMatrix2D()函数5、示例程序:1、认识仿射...
    99+
    2024-04-02
  • Python移位密码、仿射变换解密实例代码
    目录前言一、移位密码二、仿射变换三、全部代码总结前言 这个代码是很久之前的,已经忘记具体的思路了,你可以结合此文章来了解两个加密方式的内容。 前两个步骤是对应加密方式的函数,第三个步...
    99+
    2024-04-02
  • OpenCV+Python几何变换的实现示例
    目录几何变换1 缩放2 翻转3 仿射(一)平移(二)旋转4 透视5 重映射(一)复制(二)绕x轴翻转(三)绕y轴翻转(四)绕x轴y轴翻转(五)x轴、y轴互换(六)图像的缩放几何变换 ...
    99+
    2024-04-02
  • OpenCV霍夫圆变换cv2.HoughCircles()的示例分析
    这篇文章主要介绍OpenCV霍夫圆变换cv2.HoughCircles()的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!circles = cv2.HoughCircles(img,cv2.HOUGH_GR...
    99+
    2023-06-20
  • Opencv对象追踪的示例代码
    1 HSV上下限 颜色的HSV上下限如下表: 2 追踪单个颜色 import cv2 as cv import numpy as np cap = cv.VideoCapt...
    99+
    2024-04-02
  • vue实现数字变换动画的示例代码
    最近开发项目的时候有个屏保的部分,就几个数字觉得过于单调,索性加点特效在里边,UI图数字部分如下: emmm。所以加了个数字动态变动的效果 一开始直接在网上copy了一份。但是部分...
    99+
    2024-04-02
  • Python手动实现Hough圆变换的示例代码
    Hough圆变换的原理很多博客都已经说得非常清楚了,但是手动实现的比较少,所以本文直接贴上手动实现的代码。 这里使用的图片是一堆硬币:  首先利用通过计算梯度来寻找边缘,...
    99+
    2024-04-02
  • OpenCV 绘制同心圆的示例代码
    目录功能函数测试代码最近在学习OpenCV,本文主要介绍了OpenCV 绘制同心圆的示例代码,分享给大家,具体如下: 功能函数 // 绘制同心圆 void DrawConcent...
    99+
    2024-04-02
  • OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换
    目录一、翻转(镜像)二、仿射扭曲获取变换矩阵仿射扭曲函数 warpAffine旋转平移三、仿射变换四、透视变换综合示例总结官网教程 一、翻转(镜像) 头文件 quick_opencv...
    99+
    2024-04-02
  • Python实现希尔伯特变换(Hilberttransform)的示例代码
    目录前言一、希尔伯特变换是什么二、VC中的实现原理及代码示例三、用Python代码实现总结前言 在数学和信号处理中,**希尔伯特变换(Hilbert transform)**是一个对...
    99+
    2023-05-15
    Python实现希尔伯特变换 Python希尔伯特变换
  • OpenCV实现视频绿幕背景替换功能的示例代码
    目录1、概述2、代码示例1、概述 案例:使用OpenCV实现视频绿幕背景替换 算法步骤: 1.初始化VideoCapture并使用其open方法加载视频 2.while循环加读取fr...
    99+
    2023-02-19
    OpenCV视频绿幕背景替换 OpenCV绿幕背景替换 OpenCV 背景替换
  • Android仿淘宝切换商品列表布局效果的示例代码
    最近电商项目中有这样一个需求,就是在进入商品列表界面,有一个按钮可以切换商品列表的布局(网格或者垂直列表排列)。效果图:上面两幅图分别是点击右上角按钮后显示两种不同布局的效果。简单的流程可以概括为:第一次进入页面,有个默认的布局(网格布局)...
    99+
    2023-05-30
    android 商品列表 roi
  • OpenCV绘制圆端矩形的示例代码
    目录功能函数测试代码测试效果本文主要介绍了OpenCV绘制圆端矩形的示例代码,分享给大家,具体如下: 功能函数 // 绘制圆端矩形(药丸状,pill) void DrawPill...
    99+
    2024-04-02
  • openCV实现图像融合的示例代码
    目录1. 概念2. 流程3 代码1. 概念 图像融合: 两幅图片叠加在一起,形成前景背景的效果。 2. 流程 (1)读入要融合的两幅图片。(2)把两幅图片调整到统一大小,方便下一步叠...
    99+
    2024-04-02
  • C++OpenCV实现像素画的示例代码
    目录准备工作代码实现完整代码最近在学习OpenCV,准备后续更新一波OpenCV相关的内容。代码实现主要是以 C++ 为主, 另外为了辅助学习,还会使用C# 开发一款桌面的软件,用于...
    99+
    2024-04-02
  • C++ opencv图像处理实现灰度变换示例
    目录灰度变换概念灰度变换的作用灰度变换的方法灰度化灰度的概念对彩色图进行灰度化1.加权平均值法2.取最大值3.平均值灰度的线性变换1.线性变换2.分段线性变换灰度的非线性变换1.对数...
    99+
    2024-04-02
  • Flutter仿钉钉考勤日历的示例代码
    本文主要介绍了Flutter仿钉钉考勤日历的示例代码,分享给大家,具体如下: 效果 原型 开发 1. 使用 // 考勤日历 Dat...
    99+
    2024-04-02
  • Spring MVC URL地址映射的示例代码
    目录1.@RequestMapping的介绍2.映射单个URL3.映射多个URL4.映射URL在控制器上5.@RequestMapping的常用属性5.1value属性5.2meth...
    99+
    2024-04-02
  • Python+OpenCV实现角度测量的示例代码
    本文介绍如何使用python语言实现角度测量,程序包括鼠标选点、直线斜率计算、角度计算三个子程序和一个主程序。最终实现效果:在图片上用鼠标确认三点,程序将会显示由此三点确定的角度,如...
    99+
    2024-04-02
  • Python+Opencv实现数字识别的示例代码
    一、什么是数字识别?   所谓的数字识别,就是使用算法自动识别出图片中的数字。具体的效果如下图所示: 上图展示了算法的处理效果,算法能够自动的识别到LC...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作