版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
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
)
参数说明:
- src1:输入的第一个Mat图像。
- src2:输入的第二个Mat图像,需要和第一个图像具有相同的列数和类型。
- dst:输出的Mat,用于存储拼接后的结果。
2、Hconcat方法用于将两个或多个Mat沿水平方向拼接成一个大的Mat。常用声明如下:
public static void HConcat(
IInputArray src1,
IInputArray src2,
IOutputArray dst
)
参数请参考Vconcat方法参数。
【代码位置:frmChapter5】Button1_Click
//图像拼接:Vconcat、hconcat
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
)
主要参数说明:
- rotateCode:支持90度倍数旋转,RotateFlags类型,包括Rotate90Clockwise(顺时针旋转90度)、Rotate90CounterClockwise(逆时针旋转90度)、Rotate180(旋转180度)。
2、Image类的Rotate方法。常用声明如下:
public Image<TColor, TDepth> Rotate( double angle, TColor background )
- angle:旋转角度。
- 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
)
参数说明:
- dsize表示输出图像的大小。
- fx和fy表示x方向和y方向缩放因子。
- interpolation表示插值方法。这是Inter类型,主要成员有:
- Linear:线性插值算法。
- CUBIC:三次样条插值算法。
- 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
)
主要参数说明:
- flipType:翻转方式。这是一个FlipType枚举类型,包含以下成员:
- Horizontal:水平翻转
- Vertical:垂直翻转
- 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 图像翻转