C++ opencv图像处理实现图片几何变换示例

 更新时间:2022年05月12日 16:08:42   作者:浅念念52  
这篇文章主要为大家介绍了C++ opencv图像处理实现图片几何变换示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!
如果你想靠AI翻身,你先需要一个靠谱的工具!

简介

图像的几何变换不改变图像的像素值,而是改变像素所在的几何位置,从变换的性质来分,图像的几何变换有图像的位置变换(平移,镜像,旋转)、图像的形状变换(放大,缩小,错切)等基本变换,以及图像的复合变换等,

一、图像平移

图像平移是将一幅图像中所有的点都按照指定的平移量在水平,垂直方向移动,平移后的图像与原图像相同,平移后的图像上的每一个点都可以在原图像中找到对应的点。图像是由像素组成,假设原来的像素坐标为(x0,y0),经过平移量(△x,△y)坐标变为(x1,y1)

用数学可以表示:x1=x0+△x,y1=y0+△xy

平移变换分为两种,一种是图像大小改变,这样最后的原图像会有一部分不在图像中,另一种是图像大小改变,这样可以保全原图像的内容

1.图像平移代码 (不改变图像大小)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
    Mat img1;
    img1 = imread("猫1.jpg");
    imshow("原图", img1);
    int r = img1.rows;
    int c = img1.cols;
    int x0 = 100;
    int y0 = 100;
    Mat img2(img1.size(), img1.type());
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            int x = j - x0;
            int y = i - y0;
            if (x >= 0 && y >= 0 && x < c&&y < r)
            {
                img2.at<Vec3b>(i, j) = img1.ptr<Vec3b>(y)[x];
            }
        }
    }
    imshow("不改变图像大小", img2);
    waitKey(0);
}

效果如下:

2.图像平移代码 (改变图像大小)

代码如下(示例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
int main()
{
    Mat img1;
    img1 = imread("猫1.jpg");
    imshow("原图", img1);
    int x0 = 100;
    int y0 = 100;
    int r = img1.rows + y0;
    int c = img1.cols + x0;
    Mat img2(r,c, img1.type());
    for (int i = 0; i < r; i++)
    {
        for (int j = 0; j < c; j++)
        {
            int x = j - x0;
            int y = i - y0;
            if (x >= 0 && y >= 0 && x < c&&y < r)
            {
                img2.at<Vec3b>(i, j) = img1.ptr<Vec3b>(y)[x];
            }
        }
    }
    imshow("改变图像大小", img2);
    waitKey(0);
}

效果如下:

二、图像旋转

图像旋转是数字图像处理的一个非常重要的环节,是图像的几何变换的手法之一。一般图像的旋转是图像的位置变换,但旋转后,图像的大小一般会改变。在图像旋转变换中,既可以把转出显示区域的图像截去,也可以扩大图像范围以显示所用的图像。

1.图像旋转函数

opencv提供的getRotationMatrix2D函数来实现图像旋转,用来计算出旋转矩阵。

1
2
3
4
Mat getRotationMatrix2D(Point2f center, double angle, double scale)
        center 旋转中心点
        angle  旋转的角度
        scale 图像缩放因子

2.仿射变换函数

计算出旋转矩阵后,还需要把旋转应用到仿射变换的输出,仿射变换函数是warpAffine

1
2
3
4
5
6
7
8
9
10
11
12
void warpAffine(InputArray src, OutputArray dst,
        InputArray M, Size dsize,
        int flags = INTER_LINEAR,
        int borderMode = BORDER_CONSTANT,
        const Scalar& borderValue = Scalar());
    src 输入
    dst 输出
    M 变换矩阵
    Size 尺寸
    flags 插值算法标识符
    borderMode 边界像素模式
    borderValue 边界取值

3.代码

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    Mat img1;
    img1 = imread("猫1.jpg");
    imshow("原图", img1);
    Point center(img1.cols / 2, img1.rows / 2);
    Mat m = getRotationMatrix2D(center, 30, 0.5);
    Mat img2;
    warpAffine(img1, img2, m, img1.size());
    imshow("旋转", img2);
    waitKey(0);
}

效果如下:

三、图像缩放

图像比例缩放是值将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍

1.图像缩放函数

1
2
3
4
5
6
7
8
9
void resize(InputArray src, OutputArray dst,
        Size dsize, double fx = 0, double fy = 0,
        int interpolation = INTER_LINEAR);
    src 输入
    dst 输出
    dsize 尺寸
    fx 在x轴缩放比例
    fy 在y轴缩放比例
    interpolation 插值方式

2.图像缩小代码

1
2
3
4
5
6
7
8
9
10
int main()
{
    Mat img1;
    img1 = imread("猫1.jpg");
    imshow("原图", img1);
    Mat img2;
    resize(img1, img2, Size(img1.cols / 2, img1.rows / 2));
    imshow("缩小", img2);
    waitKey(0);
}

效果如下:

3.图像放大代码

1
2
3
4
5
6
7
8
9
10
int main()
{
    Mat img1;
    img1 = imread("猫1.jpg");
    imshow("原图", img1);
    Mat img2;
    resize(img1, img2, Size(img1.cols * 2, img1.rows * 2));
    imshow("放大", img2);
    waitKey(0);
}

效果如下:

总结

本文简单介绍了图像平移,旋转,缩放,这是最基本的调用函数解决,其中还有运用数学公式解决,这里没有介绍,有兴趣的可以去了解了解,更多关于C++ opencv几何变换的资料请关注脚本之家其它相关文章!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/Lightismore/article/details/123862474

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C语言实现xml构造解析器

    C语言实现xml构造解析器

    本文给大家分享的是使用C语言来实现xml构造解析器的方法和代码,简单易用,推荐给大家
    2016-07-07
  • C++内存管理之简易内存池的实现

    C++内存管理之简易内存池的实现

    大家好,本篇文章主要讲的是C++内存管理之简易内存池的实现,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2021-12-12
  • C++中map 字典的基本使用教程

    C++中map 字典的基本使用教程

    Map是字典一样的数据结构,它是(键,值)对的关联数组,其中每个唯一键仅与单个值相关联,下面这篇文章主要给大家介绍了关于C++中map 字典的基本使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • C++ 字符串的反转五种方法实例

    C++ 字符串的反转五种方法实例

    通过不同的方法,实现对所输入字符串的反转,有需要的朋友可以参考一下
    2013-09-09
  • C语言数组实现打砖块游戏

    C语言数组实现打砖块游戏

    这篇文章主要为大家详细介绍了C语言数组实现打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 一道面试题教你轻松玩转C++指针

    一道面试题教你轻松玩转C++指针

    下面小编就为大家带来一篇深入理解c++指针的指针和指针的引用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2021-09-09
  • C++中形参和实参的区别及说明

    C++中形参和实参的区别及说明

    这篇文章主要介绍了C++中形参和实参的区别及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++之编写高效Makefile文件最佳方法

    C++之编写高效Makefile文件最佳方法

    在软件开发过程中,Makefile是一个非常重要的工具,它可以帮助我们自动化构建、编译、测试和部署,然而,编写高效的Makefile文件并不是一件容易的事情。在本文中,我们将讨论如何编写高效的Makefile文件,以提高开发效率和产品质量,需要的朋友可以参考下
    2023-05-05
  • 基于C++实现去除字符串头尾指定字符功能

    基于C++实现去除字符串头尾指定字符功能

    编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格。本文为大家详细介绍了如何利用C++实现这一效果,需要的可以参考一下
    2022-04-04
  • C语言中全局变量,局部变量,静态局部变量的区分方式

    C语言中全局变量,局部变量,静态局部变量的区分方式

    这篇文章主要介绍了C语言中全局变量,局部变量,静态局部变量的区分方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论