本文测试环境:
win10 64位
vistual studio 2019
Emgu CV 4.6.0
环境配置准备:
1 新增控制台项目,.net framework为4.7.2
2 把win-x64目录的native目录下的文件全部拷贝到项目的运行目录Debug目录下
3 项目选择x64
4 添加项目引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Drawing.dll和System.Runtime.InteropServices.RuntimeInformation.dll
具体配置参考:
Emgu CV4图像处理之环境搭建1(C#)_zxy2847225301的博客-CSDN博客
下面内容部分转自:
EmguCV-第12讲-图像的几何变换(缩放、平移、旋转、转置、镜像和重映射)_YADONCHEN的博客-CSDN博客_emgucv 缩放
1 图像平移
代码如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
ImgMove(srcPic, 20, 30);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 图像平移
/// </summary>
/// <param name="srcPic"></param>
/// <param name="xOffset"></param>
/// <param name="yOffset"></param>
private static void ImgMove(Image<Bgr, Byte> srcPic, int xOffset,int yOffset)
{
Image<Bgr, Byte> dstImg = new Image<Bgr, byte>(new System.Drawing.Size(srcPic.Width, srcPic.Height));
for (int i = 0; i < srcPic.Rows; i++)
{
for (int y = 0; y < srcPic.Cols; y++)
{
if ((i + yOffset)>0&&(y + xOffset)>0&&(i + yOffset) < srcPic.Rows && (y + xOffset) < srcPic.Cols)
{
dstImg[i + yOffset, y + xOffset] = srcPic[i, y];
}
}
}
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.Imshow("dstImg", dstImg);
CvInvoke.WaitKey(0);
}
}
}
运行结果如下:
2 图像旋转
图中说到的仿射可以参考:仿射变换可以通过一系列的原子变换的复合来实现,包括:平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)
仿射变换(Affine Transformation) - 是大高呀 - 博客园
参考代码如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
ImgRotate(srcPic, 45, 1);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 图片旋转
/// </summary>
/// <param name="srcPic">原图片</param>
/// <param name="angle">旋转的角度</param>
/// <param name="scale">缩放比例</param>
private static void ImgRotate(Image<Bgr, Byte> srcPic, double angle,double scale)
{
//旋转中心点
PointF center = new PointF(srcPic.Cols/2,srcPic.Rows/2);
Mat mapMat = new Mat();
CvInvoke.GetRotationMatrix2D(center, angle, scale, mapMat);
//CvInvoke.Imshow("mapMat", mapMat); //发现显示只有标题栏,无图像
Mat dstPic = new Mat();
CvInvoke.WarpAffine(srcPic, dstPic, mapMat, new Size(srcPic.Cols, srcPic.Rows));
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.Imshow("dstPic", dstPic);
CvInvoke.WaitKey(0);
}
}
}
运行结果如下:
3 图像转置和镜像
转置代码如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
ImgTranspose(srcPic);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 图像转置
/// </summary>
/// <param name="srcPic"></param>
private static void ImgTranspose(Image<Bgr, Byte> srcPic)
{
Image<Bgr, Byte> dstPic = new Image<Bgr, byte>(srcPic.Cols, srcPic.Rows);
CvInvoke.Transpose(srcPic, dstPic);
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.Imshow("dstPic", dstPic);
CvInvoke.WaitKey(0);
}
}
}
运行结果如下:
图像镜像代码如下:
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.Util;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EmguCVDemo2
{
class Program
{
static void Main(string[] args)
{
Image<Bgr,Byte> srcPic = new Image<Bgr, Byte>("chunfen1.png");
ImgFlip(srcPic);
CvInvoke.WaitKey(0);
Console.ReadLine();
}
/// <summary>
/// 图像镜像
/// </summary>
/// <param name="srcPic"></param>
private static void ImgFlip(Image<Bgr, Byte> srcPic)
{
Image<Bgr, Byte> dstPic = new Image<Bgr, byte>(srcPic.Cols, srcPic.Rows);
CvInvoke.Flip(srcPic, dstPic,Emgu.CV.CvEnum.FlipType.Horizontal);//水平镜像
CvInvoke.Imshow("srcPic", srcPic);
CvInvoke.Imshow("dstPic", dstPic);
CvInvoke.WaitKey(0);
}
}
}
运行结果如下: