visual Studio Community 2015 工程和源代碼:http://pan.baidu.com/s/1o6u5Fdw
內容
在這篇文章中將提到以下內容:
- 從文件中讀取圖像
- Image類
- 顯示圖像
- 保存圖像
在上一篇文章Emgu學習之(一)——Emgu介紹中,我介紹了如何創建Emgu的工程,但是上一個Demo使用的是OpenCV的HighGUI窗體顯示圖像,這一
次我們要用WinForm窗體顯示圖像,並將圖像進行操作后另存為新的圖像文件。首先我們要做的是在Visual studio中新建一個ImageShowing的WinForm
窗體項目。再在工具箱中添加Emgu的控件,控件添加地址為Emgu安裝目錄下的..\bin\Emgu.CV.UI.dll,添加完成后如下圖:
添加完Emgu的控件后,在Form1中添加Emgu下的ImageBox控件和Flip、SaveAs按鍵,布局如下:
在From1.cs文件中添加命名空間引用:
1 using Emgu.CV; 2 using Emgu.CV.Structure; 3 using Emgu.CV.CvEnum; 4 using Emgu.Util;
為Flip按鍵添加控件事件代碼:
1 private void FlipButton_Click(object sender, EventArgs e) 2 { 3 if(imageBox1.Image != null) 4 { 5 var image = (Image<Bgr, Byte>)imageBox1.Image; 6 image._Flip(FlipType.Horizontal);//翻轉圖像 7 imageBox1.Image = image; 8 } 9 }
從文件中讀取圖像並顯示
為Form1添加Load事件代碼如下:
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 Image<Bgr, Byte> image = new Image<Bgr, byte>(@"D:\src.jpg");//從文件加載圖片 4 imageBox1.Image = image;//顯示圖片 5 }
以上代碼,我們新建一個Image類的對象,我們指定了這個對象的色彩空間為BGR(OpenCV使用BGR而不是RBG),值深度為Byte。然后將這個對象賦值給
imageBox.Image屬性。運行以上代碼,效果如圖:
Image類
OpenCV中使用IplImage數據結構描述圖像數據,Emgu則將圖像數據封裝為一個托管類:Image<TColor, TDepth>,這個類包含兩個泛型參數:TColor和
TDepth,也就是說當你要定義一個Image對象時,你需要指定色彩空間類型和數據深度。為了創建一個8bit 無符號整型灰度圖像,在Emgu中需要像如下代碼:
Image<Gray, Byte> image = new Image<Gray, Byte>(width, height);
其中Gray為圖像的色彩控件,Emgu支持的色彩類型有:
- Gray
- Bgr (Blue Green Red)
- Bgra (Blue Green Red Alpha)
- Hsv (Hue Saturation Value)
- Hls (Hue Lightness Saturation)
- Lab (CIE L*a*b*)
- Luv (CIE L*u*v*)
- Xyz (CIE XYZ.Rec 709 with D65 white point)
- Ycc (YCrCb JPEG)
Byte為圖像的值深度,Emgu支持的值深度類型有:
- Byte
- SByte
- Single (float)
- Double
- UInt16
- Int16
- Int32 (int)
盡管可以使用CVInvoke.cvCreateImage創建圖像對象,但是仍然建議你使用Image<TColor, TDepth>類創建對象。使用Image<TColor, TDepth>這個托
管類,垃圾回收器會在對象沒用時自動釋放對象的內存空間,並且Image<TColor, TDepth>以類的方式提供了一些更方便的方法(這些方法OpenCV本身並未
提供)。
Image<TColor, TDepth>類繼承了IDisposable接口,也就說你可以使用using關鍵字使image對象在使用完后可以被及時地釋放。因為垃圾回收是在不確定的
時刻發生的,所以建議你顯示使用Dispose方法或using關鍵字來限定image的作用域。
using (Image<Gray, Single> image = new Image<Gray, Single>(1000, 800)) { ... //使用image對象 } //image對象的Dispose方法會自動被調用,內存會被釋放
對image的更多介紹會在后續的文章中一一介紹,更多內容請查看Emgu官方頁面:http://www.emgu.com/wiki/index.php/Working_with_Images
保存圖像
為SaveAs按鍵添加控件事件代碼:
1 private void SaveAsButton_Click(object sender, EventArgs e) 2 { 3 if(imageBox1.Image != null) 4 { 5 imageBox1.Image.Save(@"D:\tmp.jpg");//保存圖片 6 } 7 }
你可以點擊Flip按鍵,然后保存圖片,保存后的圖片是翻轉了圖片: