初学opencv c++学习笔记(五)透视变换--warpPerspective()

这篇具有很好参考价值的文章主要介绍了初学opencv c++学习笔记(五)透视变换--warpPerspective()。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这篇博客将用简单的口吻谈一谈透视变换是啥以及如何操作~

   但是这篇博客,只要你看了,我相信会有收获~~~~~~~

~~~~~~~~~  

~~~~~~~~~

目录

一、透视变换介绍

1.基础介绍:

二、透视变换apl介绍---- warpPerspective()

1.官方定义

2.参数解释

三、搭配apl介绍---- getPerspectiveTransform()

1.官方定义

2.参数解释

四、代码实战

1.任务交代

2.营救修狗

拯救思路:

整体战况即结果展示

总结




提示:以下是本篇文章正文内容,下面案例可供参考


一、透视变换介绍

1.基础介绍:

        透视变换属于图像的几何变换

        生活中透视变换是一门普遍的技术,微信的“扫一扫”就运用到这个技术。我们上传的二维码图片往往是在空间上是倾斜的,就是二维码所在平面与设备的平面不平行,这就需要透射变换把二维码弄成板板正正的亚子。

        再比如拍照就能文本翻译的技术也需要透视变换。

实现:

        透视变换的实现,可以想象成是投影,投影中心照到原图像平面,投影到投影平面上,投影平面上的图像就是投影的结果。

图示:

c++warpperspective,opencv,人工智能,c++,计算机视觉


二、透视变换apl介绍---- warpPerspective()

1.官方定义

void warpPerspective( InputArray src, OutputArray dst,
                                   InputArray M, Size dsize,
                                   int flags = INTER_LINEAR,
                                   int borderMode = BORDER_CONSTANT,
                                   const Scalar& borderValue = Scalar());

2.参数解释

(1)  src  :  输入的原图像。

(2)  dst  :   输出的结果图。类型如src,大小为dsize.

(3) M  :  3 x 3的变换矩阵,Mat 类型。

  M 需要使用getPerspectiveTransform()函数获取,该函数放详细介绍放在下一个标题供大家食用。

(4)  dsize  :    输出图像的大小。

dsize参数形式:Size ( imgsrc.cols, imgdst.rows ) 

(5)  flag  :插值方法的组合。我们可以通过官方定义看到有默认值,一般不用管它。

(6)borderMode  :  像素外推方法。

(7)borderValue  :  外边框粗值 。在恒定边框的情况下使用的值;默认情况下,它等于 0。

最后三个参数都有默认值,不用管。


三、搭配apl介绍---- getPerspectiveTransform()

1.官方定义

Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU);

该函数通过原图像和结果图像的四个顶点坐标,从四对对应点计算透视变换。

计算3×3透视矩阵变换

2.参数解释

(1)src[ ]  :原图像的四个顶点坐标所构成的向量(数组)。

(2)dsr[ ]  :结果图像的四个顶点坐标所构成的向量(数组)。

代码定义:

        Point2f src[4]={Point2f(,),Point2f(,),Point2f(,),Point2f(,)};

        Point2f dst[4]={  Point2f(0,0)  ,  Point2f(dsize().width,0),

                              Point2f(0,dsize().height ),  Point2f (dsize().width ,dsize().height )   };

(3)solveMethod  : 求解方法传递给cv::solve的方法(分解类型) 该参数一般不需要调整,使用默认值即可。


四、代码实战

1.任务交代

现在组织下来了任务,修狗在一次战斗中了魔法变成下图的惨样,快使用你的力量帮助修狗恢复原样。

c++warpperspective,opencv,人工智能,c++,计算机视觉

2.营救修狗

---使用透视变换---

拯救思路:

(1)获取顶点坐标

使用透视变换的函数,最关键的是要获取图像的顶点坐标。

借助画图c++warpperspective,opencv,人工智能,c++,计算机视觉

 打开画图

c++warpperspective,opencv,人工智能,c++,计算机视觉

左下角就会出现鼠标对应位置的坐标

 c++warpperspective,opencv,人工智能,c++,计算机视觉

 原图像的四个顶点坐标就码好了

   Point2f src[4] = {Point2f(160,300),Point2f(931,253),Point2f(105,787),Point2f(1000,859)};

 结果图像的四个顶点坐标根据自己想要的来

图像大小比较大,我把结果图像的大小设置小一些

    Point2f dst[4] = {Point2f(0,0),Point2f(380,0),Point2f(0,360),Point2f(380,360)};

(2)使用 getPerspectiveTransform()获取M(M是warpPerspective()的参数)

直接用函数

    Mat TransImage = getPerspectiveTransform(src, dst);

 TransImage即M,我们要的3 x 3转换矩阵。

(3)最后一步,透视函数上场! 

dsize参数的设置:

        dst的大小默认是src的大小,dsize如下面的代码设定的话在输出窗口(输出窗口默认为src大小)会有一大片黑色区域。

        设置成Size(380,360)就只有我们想要的图片区域。

        但是设置下方代码方便调换。 

    warpPerspective(imgsrc, imgdst, TransImage, Size(imgdst.cols, imgdst.rows));

整体战况即结果展示

#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;
int main()
{
    Mat imgsrc = imread("C:/r/dog.jpg");//读取图像
    Mat imgdst; //定义结果图,用于存放透视变换的结果

    Point2f src[4] = {Point2f(160,300),Point2f(931,253),Point2f(105,787),Point2f(1000,859)};
    Point2f dst[4] = {Point2f(0,0),Point2f(380,0),Point2f(0,360),Point2f(380,360)};

    Mat TransImage = getPerspectiveTransform(src, dst);//获取变换矩阵
    warpPerspective(imgsrc, imgdst, TransImage, Size(380, 360));//进行透视变换

    imshow("原图",imgsrc);//展示原图和结果图
    imshow("目标图像", imgdst);
    waitKey(0);
    return 0;
}

 c++warpperspective,opencv,人工智能,c++,计算机视觉

 当当!拯救成功!


总结

这篇博客到这就结束了!谢谢看到这的小可爱!

如有错误,请指正!文章来源地址https://www.toymoban.com/news/detail-812518.html

到了这里,关于初学opencv c++学习笔记(五)透视变换--warpPerspective()的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

    图像旋转是指图像按照某个位置转动一定的角度的过程,旋转中图像仍保持着原始尺寸。图像旋转后图像水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。 假设有一个点:P(x,y),它在绕原点 O(0,0) 旋转 β 后,被转换成

    2024年02月14日
    浏览(71)
  • 初学opencv c++学习笔记(二)图像空间色彩转换cvtColor()

    对图像的色彩转换用到cvtColor()函数,本章将对此其用法进行解析。 目录 一、色彩空间转换 官方定义  函数参数解释 代码演示 RGB——HSV  RGB——GRAY  BGR——RGB 总结 提示:以下是本篇文章正文内容,下面案例可供参考 APL:cvtColor() 1. src (source):输入的源图像。为矩阵形式。

    2024年02月05日
    浏览(50)
  • 用OpenCV进行透视变换

    欢迎回来!今天我们将焦点聚焦在我在图像处理中最喜欢的话题之一——透视变换。使用该技术,可以灵活方便的实现各种各样好玩的特效。 闲话少说,我们直接开始吧! 我们首先展开对单应矩阵的深入研究。作为图像处理的基本工具,它在捕捉图像中的几何变换方面发挥

    2024年02月10日
    浏览(44)
  • 【opencv】:图像的透视变换

    仿射变换(Affine Transformation或 Affine Map) , 又称为仿射映射, 是指在几何中, 图像进行从一个向量空间进行一次线性变换和一次平移, 变换为到另一个向量空间的过程。我们常说的仿射变换是透视变换的一个特例。 以上便是透视变换的原理图,即将源图像通过投影映射,

    2024年02月15日
    浏览(44)
  • OpenCV 实现透视变换

    仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之地。两种变换原理相似,结果也类似,可针对不同的场合使用适当的变换。 仿射变换和

    2024年02月04日
    浏览(55)
  • OpenCV利用透视变换矫正图像

    案例:使用OpenCV将一张折射的图片给矫正过来 实现步骤: 1.载入图像 2.图像灰度化 3.二值分割 4.形态学操作去除噪点 5.轮廓发现 6.使用霍夫直线检测,检测上下左右四条直线(有可能是多条,但是无所谓) 7.绘制出直线 8.寻找与定位上下左右是条直线 9.拟合四条直线方程 1

    2024年02月06日
    浏览(66)
  • 使用opencv对图像进行透视变换

    一.什么是透视变换 透视变换就是透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简单的来说就是

    2024年02月08日
    浏览(51)
  • Python中OpenCV透视变换恢复扭曲图像

    在处理图像问题时,经常会遇到将要处理的目标的位置是斜的,需要使用透视变换进行矫正。如下图,该图片中左边的目标是扭曲倾斜拍摄的,那么任务就是将其矫正过来,如下图右图所示。 前提1:这里假设我已经知道四个点坐标(可用深度学习方法检测/分割)和目标宽高

    2024年01月20日
    浏览(50)
  • 【Python】【OpenCV】OCR识别(二)——透视变换

    对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的。 针对上述情况,所以我们在处理有角度的图象时,需要将图像“摆正”,将使用到getPerspectiveTransform方法和

    2024年02月03日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包