首先由于最近需要,要学习一下Emgu CV的相关知识。由于需要做的东西只是一些简单的东西,在这里先了解一下基础知识,与大家共同学习
一 Emgu CV与OpenCV的关系
Emgu CV is a cross platform .Net wrapper to the OpenCV image processing library. Allowing OpenCV functions to be called from .NET compatible languages such as C#, VB, VC++, IronPython etc. The wrapper can be compiled in Mono and run on Windows, Linux, Mac OS X, iPhone, iPad and Android devices
Emgu CV是在.NET库下对OpenCV的封装库,主要是为了在.NET平台下用C#、VB、vc++调用OpenCV.这个封装库在Mono编译后,可以运行在Windows,linux,Mac osx ,iphoe,ipad和Android上。
Emgu CV has two layers of wrapper as shown below
Emgu CV 有两层封装,如下:
1.第一层是基本层,直接对应OpenCV.包括函数、结构和枚举类型
2.第二层是扩充层,包括与.NET库的一些混合类,适合.NET的优势。
下面的图是对Emgu CV的基本架构,我们在前面的配置过程中,也用到了下面的库文件,在这里我们可以看到他们的具体作用和架构。
Emgu.Util是模板库,算是基类吧(这样描述不正确,由于个人能力有限,只称述自己的观点,希望大家批评指正),它下面是Emgu CV ,也就是两层架构的实现
下面的就是Emgu CV 与OpenCV的关系,根据需要大家自己看吧。
二 Emgu CV中一些基本结构
2. 1.hello word
代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; // using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using Emgu.CV.UI; using System.Drawing; using System.Windows.Forms; namespace hello_word { class Program { static void Main(string[] args) { //窗口的名字 String win1 = "Test Window"; //创建窗口 CvInvoke.cvNamedWindow(win1); //创建一个400*200的蓝色图像 using (Image<Bgr, Byte> img = new Image<Bgr, byte>(400, 200, new Bgr(255, 0, 0))) { //创建字体,在我的程序里需要将CvEnum.FONT.CV_FONT_HERSHEY_COMPLEX的CvEnum去掉,原因不解 //MCvFont f = new MCvFont(CvEnum.FONT.CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0); MCvFont f = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 1.0, 1.0); //D将"Hello, world."画在图像上 img.Draw("Hello, world", ref f, new Point(10, 80), new Bgr(0, 255, 0)); /* 第一种方式 //Show the image CvInvoke.cvShowImage(win1, img.Ptr); //Wait for the key pressing event CvInvoke.cvWaitKey(0); //Destory the window CvInvoke.cvDestroyWindow(win1); * */ //第二种方式 ImageViewer.Show(img, "Test Window"); } } } }
这是一个hello word 程序,下面看一下具体的数据类型和函数
2.1.1 Image
// 摘要: // Create an empty Image protected Image(); // // 摘要: // Obtain the image from the specific Bitmap // // 参数: // bmp: // The bitmap which will be converted to the image public Image(Bitmap bmp); // // 摘要: // Create a multi-channel image from multiple gray scale images // // 参数: // channels: // The image channels to be merged into a single image public Image(Image<Gray, TDepth>[] channels); // // 摘要: // Create a blank Image of the specific size // // 参数: // size: // The size of the image public Image(Size size); // // 摘要: // Read image from a file // // 参数: // fileName: // the name of the file that contains the image public Image(string fileName); // // 摘要: // Create image from the specific multi-dimensional data, where the 1st dimesion // is # of rows (height), the 2nd dimension is # cols (width) and the 3rd dimension // is the channel // // 参数: // data: // The multi-dimensional data where the 1st dimension is # of rows (height), // the 2nd dimension is # cols (width) and the 3rd dimension is the channel public Image(TDepth[, ,] data); // // 摘要: // Create a blank Image of the specified width and height. // // 参数: // width: // The width of the image // // height: // The height of the image public Image(int width, int height); // // 摘要: // Constructor used to deserialize runtime serialized object // // 参数: // info: // The serialization info // // context: // The streaming context public Image(SerializationInfo info, StreamingContext context); // // 摘要: // Create a blank Image of the specified width, height and color. // // 参数: // width: // The width of the image // // height: // The height of the image // // value: // The initial color of the image public Image(int width, int height, TColor value); // // 摘要: // Create an Image from unmanaged data. // // 参数: // width: // The width of the image // // height: // The height of the image // // stride: // Size of aligned image row in bytes // // scan0: // Pointer to aligned image data, where each row should be 4-align // // 备注: // The caller is responsible for allocating and freeing the block of memory // specified by the scan0 parameter, however, the memory should not be released // until the related Image is released. public Image(int width, int height, int stride, IntPtr scan0);
以上是我跟踪的代码,可以看到Image有很多重载的构造函数,在这里我们只看代码中用到的,其余的根据参数代价可以自己测
Image<Bgr, Byte> img = new Image<Bgr, byte>(400, 200, new Bgr(255, 0, 0))程序中的这个构造函数采用的是上述代码中的导数第二个,
public Image(int width, int height, TColor value);
在这里面还用到了TColor,它是Bgr的父类,在代码中我们用了Create a BGR color using the specific values,即用BGR的三个数据创建Bgr,也就是三通道的彩色图像。
// 摘要: // Defines a Bgr (Blue Green Red) color [ColorInfo(ConversionCodename = "BGR")] public struct Bgr : IColor, IEquatable<Bgr> { // // 摘要: // Create a Bgr color using the System.Drawing.Color // // 参数: // winColor: // System.Drawing.Color public Bgr(Color winColor); // // 摘要: // Create a BGR color using the specific values // // 参数: // blue: // The blue value for this color // // green: // The green value for this color // // red: // The red value for this color public Bgr(double blue, double green, double red); // 摘要: // Get or set the intensity of the blue color channel [DisplayColor(255, 0, 0)] public double Blue { get; set; } // // 摘要: // Get the dimension of this color public int Dimension { get; } // // 摘要: // Get or set the intensity of the green color channel [DisplayColor(0, 255, 0)] public double Green { get; set; } // // 摘要: // Get or Set the equivalent MCvScalar value public MCvScalar MCvScalar { get; set; } // // 摘要: // Get or set the intensity of the red color channel [DisplayColor(0, 0, 255)] public double Red { get; set; } // 摘要: // Return true if the two color equals // // 参数: // other: // The other color to compare with // // 返回结果: // true if the two color equals public bool Equals(Bgr other); // // 摘要: // Represent this color as a String // // 返回结果: // The string representation of this color public override string ToString(); }
因为在这我只关心Imga类,其它都可以类似查看,当然可以看API,比着方便多了,我因为上不去网站,所以只能用原始的方法做了。
// 摘要: // Defines a Bgr (Blue Green Red) color [ColorInfo(ConversionCodename = "BGR")] public struct Bgr : IColor, IEquatable<Bgr> { // // 摘要: // Create a Bgr color using the System.Drawing.Color // // 参数: // winColor: // System.Drawing.Color public Bgr(Color winColor); // // 摘要: // Create a BGR color using the specific values // // 参数: // blue: // The blue value for this color // // green: // The green value for this color // // red: // The red value for this color public Bgr(double blue, double green, double red); // 摘要: // Get or set the intensity of the blue color channel [DisplayColor(255, 0, 0)] public double Blue { get; set; } // // 摘要: // Get the dimension of this color public int Dimension { get; } // // 摘要: // Get or set the intensity of the green color channel [DisplayColor(0, 255, 0)] public double Green { get; set; } // // 摘要: // Get or Set the equivalent MCvScalar value public MCvScalar MCvScalar { get; set; } // // 摘要: // Get or set the intensity of the red color channel [DisplayColor(0, 0, 255)] public double Red { get; set; } // 摘要: // Return true if the two color equals // // 参数: // other: // The other color to compare with // // 返回结果: // true if the two color equals public bool Equals(Bgr other); // // 摘要: // Represent this color as a String // // 返回结果: // The string representation of this color public override string ToString(); }
Emgu CV的网站:http://www.emgu.com/wiki/index.php/Main_Page
人脸识别的例子http://www.cnblogs.com/zengqs/archive/2009/02/01/1382024.html