Emgu學習之(二)——圖像讀取、顯示、保存


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控件和FlipSaveAs按鍵,布局如下:

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按鍵,然后保存圖片,保存后的圖片是翻轉了圖片:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM