Introduction to Emgu EE4H, M.Sc 04 24086 Computer Vision Dr. Mike Spann m.spann@bham.ac.uk http://www.eee.bham.ac.uk/spannm About Emgu All of this material is taken from an Emgu wiki tutorial http://www.emgu.com/wiki/index.php/Tutorial Also check out the API documentation http://www.emgu.com/wiki/files/2.4.2/document/In dex.html Emgu is a cross platform .NET wrapper to the OpenCV image processing library Written entirely in C# but Allowing OpenCV functions to be called from .NET compatible languages such as C#, VB, VC++, IronPython Setting up Emgu – C# There is a nice wiki article about how to set up Emgu using C# http://www.emgu.com/wiki/index.php/Setting_up_EM GU_C_Sharp Also the article presents a tutorial on writing a simple Emgu application Emgu to OpenCV mapping Can easily map from Emgu to OpenCV Function mapping Emgu.CV.CvInvoke Structure mapping Emgu.CV.Structure.Mxxx Enumeration mapping Emgu.CV.CvEnum Example: IntPtr image = CvInvoke.cvLoadImage("myImage.jpg", LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_GRAYSCALE); Emgu to OpenCV mapping Emgu also borrows some existing structures in .NET to represent structures in OpenCV: .NET Structure OpenCV structure System.Drawing.Point CvPoint System.Drawing.PointF CvPoint2D32f System.Drawing.Size CvSize System.Drawing.Rectangle CvRect Image representation in Emgu Normal to create an image using the genric class Image<TColor, TDepth> object instead of using CvInvoke.cvCreateImage() Several advantages of this Memory is automatically released by the garbage collector Image<TColor, TDepth > class can be examined by debugger Image<TColor, TDepth > class contains advanced methods that is not available on OpenCV such as conversion to bitmaps Image representation in Emgu Can create an un-initialized graylevel image of a given size Image<Gray, Byte> img1 = new Image<Gray, Byte>(400, 300); Or can initialize the pixel data Image<Gray, Byte> img2 = new Image<Gray, Byte>(400, 300, new Gray(30)); Similarly for an RGB image Image<Bgr, Byte> img3 = new Image<Bgr, Byte>(400,300, new Bgr(100, 100, 100)); Image representation in Emgu Images can also created from a file or a bitmap Image<Bgr, Byte> img1 = new Image<Bgr, Byte>("MyImage.jpg"); Image<Bgr, Byte> img3 = new Image<Bgr, Byte>(bmp); Getting or Setting Pixels in Emgu The slow way is to use the [] operator on the image object // Get the gray level Gray g = img[y, x]; // Set the gray level img[y,x] = new Gray(100); Faster way is to use the Data property of the image object Byte g = img.Data[y, x, 0]; http://stackoverflow.com/questions/5101986/iterate-over- pixels-of-an-image-with-emgu-cv gives some benchmarking for iterating over pixel data Displaying, drawing and converting images An image can be displayed using the ImageBox control ImageBox is a high performance control for displaying images. Displays a Bitmap that shares memory with the Image object, therefore no memory copy is needed (very fast). The Image class has a ToBitmap() function that return a Bitmap object Allows the image to be displayed on a PictureBox control There is also an ImageViewer class in the Emgu.CV.UI namespace Displaying, drawing and converting images The Draw() method in Image< Color,Depth> can be used to draw different types of objects, including fonts, lines, circles, rectangles, boxes, ellipses as well as contours Image<Gray, Byte> image = new Image<Gray, Byte>(400, 300); Rectangle rect =new Rectangle(0,0,200,300); image.Draw(rect, new Gray(200), 2); More efficient method is to draw as a graphics overlay Image<Gray, Byte> image = new Image<Gray, Byte>(400, 300); Rectangle rect =new Rectangle(0,0,200,300); Graphics.FromImage(image). DrawRectangle(new Pen(yellow), rect); Conclusions Emgu is a powerful development platform for image processing/computer vision Similar capabilities to OpenCV but has additional capabilities because of additional language features specific to C#