【Opencv图像处理】透视与仿射变换

C++透视与仿射变换

透视与仿射变换

【Opencv图像处理】透视与仿射变换
这种现象是透视投影的一个特征,其中 3D 场景中的点(例如,矩形角)通过针孔投影到平面(相机图像传感器)上。靠近照相机的线段比距离照相机较远的相同长度的线段显示得更长。直角可能变得尖锐或钝,平行线可能看起来会聚到消失点。

【Opencv图像处理】透视与仿射变换
上图显示了反转透视失真的效果(此处为代码)。在本例中,书的角被映射到正方形的任意点,并用红色圆圈标记。右侧的图像更适合自动检测,因为可以轻松定位特征并与模板进行比较。
OpenCV提供了两个可以做到这一点的函数:warpAffine()和warpPerspective()。它们具有相同的签名,除了 warpAffine() 需要一个 2×3 转换矩阵,而 warpPerspective() 需要一个 3×3 转换矩阵。这些矩阵分别由函数 getAffineTransform() 和 getPerspectiveTransform() 计算。前者需要三对匹配的坐标,后者需要四对匹配的坐标。直观地说,得到三对比四对更容易,所以问题出现了:在什么情况下我们可以逃脱三对坐标并使用仿射变换而不是透视变换?
【Opencv图像处理】透视与仿射变换
【Opencv图像处理】透视与仿射变换
【Opencv图像处理】透视与仿射变换
我们应该使用的标准是保持线路平行度。仿射变换可保持线并行性。如果要检查的对象在3D世界中具有平行线,并且图像中的相应线是平行的,则仿射变换就足够了。相反,如果3D世界中的平行线在图像中发散,则仿射变换是不够的:我们需要透视变换。
【Opencv图像处理】透视与仿射变换
【Opencv图像处理】透视与仿射变换

Opencv代码

仿射变换


void cv::warpAffine (   InputArray  src,
OutputArray     dst,
InputArray  M,
Size    dsize,
int     flags = , INTER_LINEAR
int     borderMode = , BORDER_CONSTANT
const Scalar &  borderValue = Scalar()
)
Python:
cv.warpAffine(  src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]  ) ->    dst

参数InputArray src:输入变换前的图像;
参数OutputArray dst:输出变换后图像,需要初始化一个空矩阵用来保存结果,不用设定矩阵尺寸;
参数InputArray M:变换矩阵;
参数Size dsize:设置输出图像大小;
参数int flags=INTER_LINEAR:设置插值方式,默认方式为线性插值;
M参数的获得Opencv中也有对应的函数

Mat getAffineTransform(const Point2f* src, const Point2f* dst)

参数const Point2f src:原图像的变换点像素坐标;
参数const Point2f
dst:输出图像的变换点像素坐标;

代码

    string path = "D:\\QT\\Opencv\\Resources\\cards.jpg";  //"D:\QT\Opencv\Resources\cards.png"
    Mat img = cv::imread(path);

    Point2f src[4]= {{529,142},{771,190},{405,395},{674,457}};
    Point2f dst[4]= {{0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h}};

    for(int i = 0; i < 4; i++)
    {
        circle(img,src[i], 10, Scalar(0, 69, 255), FILLED);
    }

    matrix1 = getAffineTransform(src, dst);
    warpAffine(img, imgWarpAffine, matrix1, Point(w,h));

    imshow("Image",img);
    imshow("Image WarpAffine",imgWarpAffine);
    waitKey(0);

【Opencv图像处理】透视与仿射变换
【Opencv图像处理】透视与仿射变换

透视变换


void cv::warpPerspective    (   InputArray  src,
OutputArray     dst,
InputArray  M,
Size    dsize,
int     flags = , INTER_LINEAR
int     borderMode = , BORDER_CONSTANT
const Scalar &  borderValue = Scalar()
)
Python:
cv.warpPerspective( src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]  ) ->    dst

参数InputArray src:输入变换前的图像;
参数OutputArray dst:输出变换后图像,需要初始化一个空矩阵用来保存结果,不用设定矩阵尺寸;
参数InputArray M:变换矩阵;
参数Size dsize:设置输出图像大小;
参数int flags=INTER_LINEAR:设置插值方式,默认方式为线性插值;

M参数的获得Opencv中也有对应的函数

Mat cv::getPerspectiveTransform (   const Point2f   src[],
const Point2f   dst[]
)

参数const Point2f src:原图像的变换点像素坐标;
参数const Point2f
dst:输出图像的变换点像素坐标;

代码

    string path = "D:\\QT\\Opencv\\Resources\\cards.jpg";  //"D:\QT\Opencv\Resources\cards.png"
    Mat img = cv::imread(path);

    Point2f src[4]= {{529,142},{771,190},{405,395},{674,457}};
    Point2f dst[4]= {{0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h}};

    for(int i = 0; i < 4; i++)
    {
        circle(img,src[i], 10, Scalar(0, 69, 255), FILLED);
    }

    matrix = getPerspectiveTransform(src,dst);
    warpPerspective(img, imgWarp, matrix, Point(w,h));

    imshow("Image",img);
    imshow("Image Warp",imgWarp);
    waitKey(0);

【Opencv图像处理】透视与仿射变换
【Opencv图像处理】透视与仿射变换

Original: https://blog.csdn.net/qq_40301351/article/details/123323784
Author: 点云兔子
Title: 【Opencv图像处理】透视与仿射变换

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/642118/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 线 性 回 归

    实验目的 感知机算法以及二分类的理论基础后学习了线性回归。如果是正常机器学习的流程当前学习进度,本次实验是我们第一次接触机器学习中的回归问题。 ; 实验原理 分类:输出离散回归:输…

    人工智能 2023年6月17日
    077
  • Python数据处理中 pd.concat 与 pd.merge 区别

    数据的合并与关联是数据处理过程中经常遇到的问题,在SQL、HQL中大家可能都有用到 join、uion all 等 ,在 Pandas 中也有同样的功能,来满足数据处理需求,个人感…

    人工智能 2023年7月17日
    078
  • Vue的底层原理

    当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty…

    人工智能 2023年7月30日
    085
  • 多视图聚类概念

    生成(基于模型)的方法 目的:试图了解数据的基本分布,并使用生成模型表示数据,每个模型表示一个集群。 区分(基于相似性)的方法 目的:直接优化包括相似性的目标函数,以最小化簇内的平…

    人工智能 2023年5月31日
    0113
  • 模糊c均值聚类算法原理详细讲解

    模糊c均值聚类算法详细讲解 (一)聚类和模糊简述 (二)模糊c均值聚类原理 * (1)目标函数 (2)隶属度矩阵Uij和簇中心Cij (3)终止条件 (三)模糊c均值聚类算法步骤 …

    人工智能 2023年6月2日
    0109
  • 【毕业设计】口罩佩戴检测系统 – opencv 卷积神经网络 机器视觉 深度学习

    文章目录 🚩 0 简介 🚩1 课题背景 🚩 2 口罩佩戴算法实现 * 2.1 YOLO 模型概览 2.2 YOLOv3 2.3 YOLO 口罩佩戴检测实现 2.4 实现代码 2.5…

    人工智能 2023年6月28日
    078
  • 【ITK学习笔记】刚性配准实践

    本书介绍 TCP/ IP_及其应用。 _TCP/ IP_是Internet上使用的协议,而Internet是世界上最大的互联网络。本书内容十分丰富,几乎涵盖了有关 _TCP/ IP…

    人工智能 2023年6月20日
    090
  • python数据处理表格csv文件小案例

    用jutyper写的一个小案例 我们先看数据集 在数据集的同级目录下新建一个项目 导入pandas库 import pandas as pd 读取文件并且只读前3行 df=pd.r…

    人工智能 2023年7月7日
    081
  • 【OpenCV学习】(九)目标识别之车辆检测与计数

    【OpenCV学习】(九)目标识别之车辆检测及计数 背景 本篇将具体介绍一个实际应用项目——车辆检测及计数,在交通安全中是很重要的一项计数;当然,本次完全采用OpenCV进行实现,…

    人工智能 2023年6月17日
    0103
  • pandas数据处理

    pandas数据处理 目录 pandas数据处理 * 1.处理丢失数据 2.处理空值操作 4.处理重复数据 5. 处理异常数据 – 6. 随机查看5条数据 1.处理丢失…

    人工智能 2023年7月7日
    063
  • 十大机器学习算法

    初学者应该知道的十大机器学习算法 来源:https://builtin.com/data-science/tour-top-10-algorithms-machine-learni…

    人工智能 2023年6月16日
    093
  • 彻底卸载anaconda教程

    如何彻底卸载anaconda —(前言废话,直接pass)这篇文章主要是写一下我最近在用anaconda时出现的一些问题,在无法解决之后想到最原始也是最有效的方法,就是卸载重装。但…

    人工智能 2023年7月4日
    0102
  • CNN基础教学+Pytorch代码实现

    目录 1、卷积神经网络和传统神经网络的区别 1.1、传统神将网络(nn) 1.2、卷积神经网络 2、卷积神经网络的具体介绍 2.1、输入层 2.2、卷积层——提取特征 2.3、池化…

    人工智能 2023年7月14日
    069
  • TF-GNN踩坑记录(三)

    在Tensorflow-GNN中使用batch size除了需要注意上面的链接问题之外,最近我在调试的发现,使用了merge_batch_to_components() 之后,使用…

    人工智能 2023年6月4日
    081
  • python 实现自动化点击界面方案

    相关自动化相关库: PC 端自动化测试使用到的 python 模块主要有 pywinauto、win32gui、pyautogui,主要功能如下: pywinauto: 主要使用到…

    人工智能 2023年6月19日
    0106
  • Pyhton 批量筛选Excel的方法——Pandas的使用

    Pyhton 批量筛选Excel的方法——Pandas的使用 摘要 说明 * 1、初始化数据(可跳过) 2、根据条件筛选数据 摘要 在进行数据处理时,经常需要筛选出满足条件的数据,…

    人工智能 2023年7月7日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球