现在的位置: 首页 > 综合 > 正文

Emgu CV–基础知识

2018年04月03日 ⁄ 综合 ⁄ 共 6493字 ⁄ 字号 评论关闭

首先由于最近需要,要学习一下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的关系,根据需要大家自己看吧。

 

EmguCVArchitecture.png

 

二 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

 

抱歉!评论已关闭.