Opencv-C++笔记 (12) : opencv-仿射变化

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

一、概述

介绍完图像的缩放和翻转后,接下来将要介绍图像的旋转,但是在OpenCV
4中并没有专门用于图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转首先需要确定旋转角度和旋转中心,之后确定旋转矩阵,最终通过仿射变换实现图像旋转。

二、GetRotationMatrix2D

针对这个流程,OpenCV4提供了getRotationMatrix2D()函数用于计算旋转矩阵和warpAffine()函数用于实现图像的仿射变换。首先介绍计算旋转矩阵getRotationMatrix2D()函数,该函数的函数原型在代码清单3-31中给出。

Mat cv::getRotationMatrix2D (Point2f center,double  angle,double  scale)
  • center:图像旋转的中心位置。
  • angle:图像旋转的角度,单位为度,正值为逆时针旋转。
  • scale:两个轴的比例因子,可以实现旋转过程中的图像缩放,不缩放输入1。
    Opencv-C++笔记 (12) : opencv-仿射变化
    Opencv-C++笔记 (12) : opencv-仿射变化

三、warpAffine()

函数进行仿射变换,就可以实现图像的旋转,在代码清单3-32中给出了warpAffine()函数的函数原型。

 void cv::warpAffine(InputArray src,
                    OutputArray dst,
                    InputArray M,
                    Size dsize,
                    int  flags = INTER_LINEAR,
                    int  borderMode = BORDER_CONSTANT,
                    const Scalar& borderValue = Scalar()
)
  • src:输入图像。
  • dst:仿射变换后输出图像,与src数据类型相同,但是尺寸与dsize相同。
  • M:2×3的变换矩阵。
  • dsize:输出图像的尺寸。
  • flags:插值方法标志,可选参数及含义在表3-3和表3-4中给出。
  • borderMode:像素边界外推方法的标志。
  • borderValue:填充边界使用的数值,默认情况下为0。

该函数拥有多个参数,但是多数都与前面介绍的图像尺寸变换具有相同的含义。函数中第三个参数为前面求取的图像旋转矩阵,第四个参数是输出图像的尺寸。函数第五个参数是仿射变换插值方法的标志,这里相比于图像尺寸变换多增加了两个类型,可以与其他插值方法一起使用,这两种类型在表3-4中给出。函数第六个参数为像素边界外推方法的标志,其可以的标志和对应的方法在表3-5中给出。第七个参数是外推标志选择BORDER_CONSTANT时的定值,默认情况下为0。

Opencv-C++笔记 (12) : opencv-仿射变化
Opencv-C++笔记 (12) : opencv-仿射变化

在了解函数每个参数的含义之后,为了更好的理解函数作用,需要介绍一下仿射变换的概念。仿射变换就是图像的旋转、平移和缩放操作的统称,可以表示为线性变换和平移变换的叠加。仿射变换的数学表示是先乘以一个线形变换矩阵再加上一个平移向量,其中线性变换矩阵为2×2的矩阵,平移向量为2×1的向量,至此你可能理解了为什么函数需要输入一个2×3的变换矩阵。假设我们存在一个线性变换矩阵和平移矩阵,两者与输入的矩阵之间的关系如式(3.13)中所示。
Opencv-C++笔记 (12) : opencv-仿射变化
根据旋转矩阵和平移矩阵以及图像像素值,仿射变换的数学原理可以用式(3.14)来表示。
Opencv-C++笔记 (12) : opencv-仿射变化

  • src[]:原图像中的三个像素坐标。
  • dst[]:目标图像中的三个像素坐标。

该函数两个输入量都是存放浮点坐标的数组,在生成数组的时候像素点的输入顺序无关,但是需要保证像素点的对应关系,函数的返回值是一个2×3的变换矩阵。

有了前面变换矩阵的求取,就可以利用warpAffine()函数实现矩阵的仿射变换,我们在代码清单3-34的例程中实现了图像的旋转以及图像三点映射的仿射变换,最终结果在图3-23中给出。

#include<iostream>
#include<vector>
#include<string>
#include <opencv2/opencv.hpp>
#include "opencv/highgui.h"

using namespace std;
using namespace cv;

int main(int argc,char** argv) {
    cout<<"OpenCv Version: "<<CV_VERSION<<endl;
    Mat img=imread("699342568.jpg");
    if(img.empty()){
        cout<<"请确认输入的图像;路径是否正确"<<endl;
        return -1;
    }
    Mat img_;
    resize(img,img_,Size(img.rows/2,img.cols/2));
    imshow("src",img_);
    Mat rotation0,rotation1,img_warp0,img_warp1;
    double angle=30;//设置图像旋转的角度
    Size dst_size(img_.rows,img_.cols);//设置输出图像的尺寸
    Point2f center(img_.rows/2.0,img_.cols/2.0);//设置图像的旋转中心
    rotation0=getRotationMatrix2D(center,angle,1);//计算放射变换矩阵
    warpAffine(img_,img_warp0,rotation0,dst_size);//进行仿射变换
    imshow("img_warp0",img_warp0);
    //根据定义的三个点进行仿射变换
    Point2f src_points[3];
    Point2f dst_points[3];
    src_points[0]=Point2f(0,0);//原始图像的三个点
    src_points[1]=Point2f(0,(float)(img_.cols-1));
    src_points[2]=Point2f((float)(img_.rows-1),(float)(img_.cols-1));
    //仿射变换后图像中的三个点
    dst_points[0]=Point2f((float)(img_.rows)*0.11,(float)(img_.cols)*0.20);
    dst_points[1]=Point2f((float)(img_.rows)*0.15,(float)(img_.cols)*0.70);
    dst_points[0]=Point2f((float)(img_.rows)*0.81,(float)(img_.cols)*0.85);
    rotation1=getAffineTransform(src_points,dst_points);//根据对应点求取放射变换矩阵
    warpAffine(img_,img_warp1,rotation1,dst_size);//进行放射变换
    imshow("img_warp1",img_warp1);
    waitKey(0);
    return 0;
}

Opencv-C++笔记 (12) : opencv-仿射变化文章来源地址https://www.toymoban.com/news/detail-500980.html

到了这里,关于Opencv-C++笔记 (12) : opencv-仿射变化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Opencv-C++笔记 (10) : opencv-图像像素计算

    我们可以将数字图像理解成一定尺寸的矩阵,矩阵中每个元素的大小表示了图像中每个像素的亮暗程度,因此统计矩阵中的最大值,就是寻找图像中灰度值最大的像素,计算平均值就是计算图像像素平均灰度,可以用来表示图像整体的亮暗程度。因此针对矩阵数据的统计工作

    2024年02月09日
    浏览(37)
  • Opencv-C++笔记 (6) : opencv-图片和视频操作

    filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名 flags:读取图像形式的标志,如将彩色图像按照灰度图读取,默认参数是按照彩色图像格式读取,可 选参数在表2-3给出。 函数用于读取指定的图像并将其返回给一个Mat类变量,如果图像文件不存在、破

    2024年02月09日
    浏览(43)
  • Opencv-C++笔记 (9) : opencv-多通道分离和合并

    在图像颜色模型中不同的分量存放在不同的通道中,如果我们只需要颜色模型的某一个分量,例如只需要处理RGB图像中的红色通道,可以将红色通道从三通道的数据中分离出来再进行处理,这种方式可以减少数据所占据的内存,加快程序的运行速度。同时,当我们分别处理完

    2024年02月09日
    浏览(47)
  • Opencv-C++笔记 (18) : 轮廓和凸包

    轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。 所以边缘提取的阈值选定会影响最终轮廓发现结果 轮廓查找步骤: 输入图像转为灰度图像cvtColor 使用Canny进行边缘提取或者threshold阈值操作,得到二值图像 使用findContours寻找轮廓 使用drawContours绘制轮廓 在二值图像

    2024年02月11日
    浏览(35)
  • Opencv-C++笔记 (7) : opencv-文件操作XML和YMAL文件

    除了图像数据之外,有时程序中的尺寸较小的Mat类矩阵、字符串、数组等 数据也需要进行保存,这些数据通常保存成XML文件或者YAML文件。本小节中将介绍如何利用OpenCV 4中的函数将数据保存成XML文件或者YAML文件以及如何读取这两种文件中的数据。 XML是一种元标记语言,所谓

    2024年02月09日
    浏览(68)
  • Opencv-C++笔记 (15) : 像素重映射 与 图像扭曲

    重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程。即: 在重映射过程中,图像的大小也可以同时发生改变。此时像素与像素之间的关系就不是一一对应关系,因此在重映射过程中,可能会涉及到像素值的插值计算。 头文件 quick_opencv.h:声明类与公共

    2024年02月13日
    浏览(48)
  • Opencv-C++笔记 (13) : opencv-图像卷积一(均值、中值、高斯、双边滤波)与 边缘处理

    头文件 quick_opencv.h:声明类与公共函数 主函数调用 src:输入图像 。 dst:输出图像 。 ksize:内核大小 ,一般用 Size(w,h),w 为宽度,h 为深度。 anchor:被平滑的点,表示取 内核中心 ,默认值 Point(-1,-1)。 boderType:推断图像外部像素的某种边界模式。默认值 BORDER_DEFAULT 目的:

    2024年02月16日
    浏览(125)
  • opencv-c++

    1、接口类 类型 说明 InputArray 只读输入数组传递到 OpenCV 函数的代理类 OutputArray 这种类型与 InputArray 非常相似,只是它用于输入/输出和输出函数参数 InputOutputArray 继承了OutputArray,作为输入输出接口,增加了一些功能 InputArrayOfArrays typedef InputArrayInputArrayOfArrays OutputArrayOfArray

    2024年02月08日
    浏览(80)
  • OpenCV(十一):图像仿射变换

    目录 1.图像仿射变换介绍  仿射变换: 仿射变换矩阵: 仿射变换公式: 2.仿射变换函数 仿射变换函数:warpAffine() 图像旋转:getRotationMatrix2D() 计算仿射变换矩阵:getAffineTransform()  3.demo 1.图像仿射变换介绍  仿射变换:        仿射变换是由平移、缩放、旋转、翻转和错切组

    2024年02月10日
    浏览(51)
  • 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日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包