当前位置: 首页 > news >正文

EmguCV学习笔记 C# 5.1 基本变换

 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

5.1 基本变换

5.1.1图像拼接

1、Vconcat方法用于将两个或多个Mat沿垂直拼接成一个大的Mat。常用声明如下:

public static void VConcat(

           IInputArray src1,

                    IInputArray src2,

           IOutputArray dst

)

参数说明:

  1. src1:输入的第一个Mat图像。
  2. src2:输入的第二个Mat图像,需要和第一个图像具有相同的列数和类型。
  3. dst:输出的Mat,用于存储拼接后的结果。

2、Hconcat方法用于将两个或多个Mat沿水平方向拼接成一个大的Mat。常用声明如下:

public static void HConcat(

           IInputArray src1,

                    IInputArray src2,

           IOutputArray dst

)

参数请参考Vconcat方法参数。

【代码位置:frmChapter5】Button1_Click

        //图像拼接:Vconcathconcat

        private void Button1_Click(object sender, EventArgs e)

        {

            Mat m1 = new Mat("C:\\learnEmgucv\\topleft.jpg", ImreadModes.Color);

            Mat m2 = new Mat("C:\\learnEmgucv\\topright.jpg", ImreadModes.Color);

            Mat m3 = new Mat("C:\\learnEmgucv\\bottomleft.jpg", ImreadModes.Color);

            Mat m4 = new Mat("C:\\learnEmgucv\\bottomright.jpg", ImreadModes.Color);

            //上下拼接

            Mat dst1 = new Mat();

            CvInvoke.VConcat(m1, m2, dst1);

            ImageBox1.Image = dst1;

            //上下拼接

            Mat dst2 = new Mat();

            CvInvoke.VConcat(m3, m4, dst2);

            ImageBox2.Image = dst2;

            //左右拼接

            Mat dst3 = new Mat();

            CvInvoke.HConcat(dst1, dst2, dst3);

            ImageBox3.Image = dst3;

        }

运行后如下图所示:

 

图5-1 图像拼接

3、Stiche类是一个图像拼接的工具,可以将多张图像拼接成一张大的全景图像。该类的主要方法为Stitch方法,可以接受多张输入图像并返回拼接后的图像。

【代码位置:frmChapter5】Button2_Click

        //Stitcher类进行拼接

        private void Button2_Click(object sender, EventArgs e)

        {

            Stitcher sc = new Stitcher();

            //这里选择3个图像进行拼接

            Mat[] msrc = new Mat[3];

            VectorOfMat images = new VectorOfMat();

            for(int i = 0;i<3;i++)

            {

                msrc[i] = new Mat("c:\\learnEmgucv\\" + i + ".jpg", ImreadModes.Color);

                images.Push(msrc[i]);

            }

            Mat result = new Mat();

            //拼接

            Stitcher.Status status = sc.Stitch(images, result);

            //如果状态为OK,那么成功

            if (status == Stitcher.Status.Ok)

                ImageBox1.Image = result;

            else

                Console.WriteLine("Stitching failed");

        }

运行后如下图所示:

 

图5-2 拼接好后的图像

需要注意的是,Stitcher的Stitch方法拼接比较慢。

5.1.2 Rotate旋转

1、Rotate方法,声明如下:

public static void Rotate(

           IInputArray src,

           IOutputArray dst,

           RotateFlags rotateCode

)

主要参数说明:

  1. rotateCode:支持90度倍数旋转,RotateFlags类型,包括Rotate90Clockwise(顺时针旋转90度)、Rotate90CounterClockwise(逆时针旋转90度)、Rotate180(旋转180度)。

2、Image类的Rotate方法。常用声明如下:

public Image<TColor, TDepth> Rotate( double angle, TColor background )

  1. angle:旋转角度。
  2. background:旋转后填充的背景颜色。

【代码位置:frmChapter5】Button3_Click

        //旋转

        private void Button3_Click(object sender, EventArgs e)

        {

            Mat m = new Mat("C:\\learnEmgucv\\lena.jpg", Emgu.CV.CvEnum.ImreadModes.AnyColor);

            //支持90度倍数旋转

            Mat mdst = new Mat();

            CvInvoke.Rotate(m, mdst, RotateFlags.Rotate90CounterClockwise);

            ImageBox1.Image = mdst;

            Image<Bgr, byte>img = new Image<Bgr, byte>("C:\\learnEmgucv\\lena.jpg");

            Image<Bgr, byte> imgdst;

            //旋转角度

            Double theta = 30;

            imgdst = img.Rotate(theta, new Bgr(255, 0, 0));

            ImageBox2.Image = imgdst;

        }

运行后如下图所示:

 

图5-3 图像旋转

5.1.3 缩放

1、Resize可以将给定输入图像缩放为指定大小的输出图像。声明如下:

public static void Resize(

           IInputArray src,

                    IOutputArray dst,

                    Size dsize,

                    double fx = 0,

                    double fy = 0,

           Inter interpolation = Inter.Linear

)

参数说明:

  1. dsize表示输出图像的大小。
  2. fx和fy表示x方向和y方向缩放因子。
  3. interpolation表示插值方法。这是Inter类型,主要成员有:
    1. Linear:线性插值算法。
    2. CUBIC:三次样条插值算法。
    3. AREA:区域插值算法

使用Resize函数时,可以通过设置dsize参数来指定输出图像的大小,也可以通过设置fx和fy参数来指定缩放因子。当dsize和fx/fy同时指定时,Resize函数会使用dsize指定的大小进行缩放,并忽略fx和fy参数。当只设置fx或fy参数时,Resize函数会按比例缩放图像,输出图像的大小为输入图像大小乘以对应的缩放因子。

【代码位置:frmChapter5】Button4_Click

        //Resize

        private void Button4_Click(object sender, EventArgs e)

        {

            Mat msrc = new Mat("C:\\learnEmgucv\\lena.jpg", Emgu.CV.CvEnum.ImreadModes.Color);

            ImageBox1.Image = msrc;

            Mat smallm = new Mat();

            //将源图像缩小到1/8

            CvInvoke.Resize(msrc, smallm, new Size(msrc.Width / 8, msrc.Height / 8));

            ImageBox2.Image = smallm;

            Mat bigm = new Mat();

            //将小图像放大8

            CvInvoke.Resize(smallm, bigm, new Size(smallm.Width * 8, smallm.Height * 8), 0, 0, Inter.Cubic);

            ImageBox3.Image = bigm;

        }

运行后如下图所示:

 

图5-4 图像缩小后再放大

2、PyrDown和PyrUp

PyrDown将给定图像进行降采样,生成一个大小为原图像的二分之一的输出图像。

PyrUp将给定输入图像进行上采样,生成一个大小为原图像的两倍的输出图像。

【代码位置:frmChapter5】Button5_Click

        //PyrDown PyrUp

        private void Button5_Click(object sender, EventArgs e)

        {

            Mat msrc = new Mat("C:\\learnEmgucv\\lena.jpg", Emgu.CV.CvEnum.ImreadModes.Color);

            CvInvoke.Imshow("msrc", msrc);

            Mat mPyrDown = new Mat();

            //缩小到1/2

            CvInvoke.PyrDown(msrc, mPyrDown);

            CvInvoke.Imshow("PyrDown", mPyrDown);

            Mat mPyrUp = new Mat();

            //放大2

            CvInvoke.PyrUp(msrc, mPyrUp);

            CvInvoke.Imshow("PyrUp", mPyrUp);

        }

运行后如下图所示:

 

图5-5 图像缩放

5.1.4 翻转Flip

Flip方法可以对给定的输入图像进行水平、垂直或同时水平垂直翻转,生成一个翻转后的输出图像。该方法声明如下:

public static void Flip(

           IInputArray src,

                    IOutputArray dst,

           FlipType flipType

)

主要参数说明:

  1. flipType:翻转方式。这是一个FlipType枚举类型,包含以下成员:
    1. Horizontal:水平翻转
    2. Vertical:垂直翻转
    3. Both:同时水平垂直翻转

【代码位置:frmChapter5】Button6_Click

       //图像翻转

        private void Button6_Click(object sender, EventArgs e)

        {

            Mat m1 = new Mat("C:\\learnEmgucv\\lena.jpg", Emgu.CV.CvEnum.ImreadModes.Color);

            //垂直翻转

            Mat dst1 = new Mat();

            CvInvoke.Flip(m1, dst1, FlipType.Vertical);

            ImageBox1.Image = dst1;

            //水平翻转

            Mat dst2 = new Mat();

            CvInvoke.Flip(m1, dst2, FlipType.Horizontal);

            ImageBox2.Image = dst2;

            //同时水平垂直翻转

            Mat dst3 = new Mat();

            CvInvoke.Flip(m1, dst3, FlipType.Both);

            ImageBox3.Image = dst3;

        }

运行后如下图所示:

 

图5-6 图像翻转


http://www.mrgr.cn/news/2855.html

相关文章:

  • SQLite 删除表
  • Leetcode-高频面试题-143.重排链表
  • 树莓派3B运行rasa init和rasa shell遇到的tensorflow报错总结
  • SOMEIP_ETS_052: echoUTF8DYNAMIC_wrong_BOM
  • ansible初使用与http原理
  • 【C++】OJ习题(初阶)
  • C语言--静态链表
  • 测试环境频繁报:RedisCommandInterruptedException: Command interrupted
  • 父子模块的maven以及Ajax实现人工管理系统
  • 《给所有人的生成式 AI 课》学习笔记(三)
  • 无人机测绘技术及应前景详解
  • Python 连接数据库实现 CRUD(MySQL)
  • 在 Vue 2.0 中集成 Markdown 编辑器
  • 平衡二叉树、B树、B+树、红黑树解析
  • WEB渗透免杀篇-Golang免杀
  • JavaScript判断数组是否包含某个值
  • 五大无线领夹麦克风误区科普:领夹麦杂音干扰不耐用问题必须规避
  • Mac文件需要分卷压缩怎么办 Mac上怎么解压分卷压缩的文件
  • 打卡学习Python爬虫第二天|Requests的使用
  • 测绘程序设计|C#基本数据类型|值类型与引用类型