一 首先下載EmguCV,就是可以在Visual Studio2005/2008中引用OpenCV的函數(shù)的dll庫(kù)。可以到這里下載:http://download.csdn.net/source/1051040 名為“Emgu.CV.Windows.Binary-1.3.0.0.zip” 二 將文件解壓出來,放到哪里都可以,不過建議將解壓出來的文件夾放到OpenCV的目錄下面,這樣不會(huì)誤刪吧,呵呵。 三 當(dāng)然,在用EmguCV之前,要安裝了OpenCV,并且OpenCV的各項(xiàng)配置都配置OK了,我這里說的只是配置EmguCV的。所以,請(qǐng)確保在配置EmguCV之前你的OpenCV的開發(fā)環(huán)境已經(jīng)配置OK了。如果不會(huì),可以看我的一篇文章。就在“學(xué)海泛舟篇”中,找找看吧。 四 打開Visual Studio 2005/2008,新建C#的Win32窗體應(yīng)用程序。然后,點(diǎn)擊“項(xiàng)目”-〉“添加引用”-〉“瀏覽”,然后把EmguCV1.3.0目錄下的Emgu.CV.dll Emgu.Util.dll ZedGraph.dll zlib.net.dll 都添加到引用里面,其實(shí)也不用全部添加,不過由于我們不知道有些函數(shù)在那些dll中,所以索性全添加就可以了。 五 然后,再程序的開頭中加上 using Emgu.CV; using Emgu.Util; 之后就可以用EmguCV中所有的庫(kù)函數(shù)了。 六 在窗體上畫一個(gè)按鈕,然后再按紐的下面寫上如下的程序: private void btnOpenImage_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|JPEG文件|*.jpeg|所有文件|*.*"; if (openFileDialog.ShowDialog() == DialogResult.OK) { CvInvoke.cvNamedWindow("打開圖片"); IntPtr img = CvInvoke.cvLoadImage(openFileDialog.FileName, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_UNCHANGED); CvInvoke.cvShowImage("打開圖片", img); this.img = img; CvInvoke.cvWaitKey(0); CvInvoke.cvReleaseImage(ref img); CvInvoke.cvDestroyWindow("打開圖片"); } } 這樣,我們就能用OpenCv的函數(shù)來打開和顯示一個(gè)圖片了。如果要保存圖片可以如下: private void btnSaveImage_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|JPEG文件|*.jpeg|所有文件|*.*"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { CvInvoke.cvSaveImage(saveFileDialog.FileName, this.img); } } 如果要打開一個(gè)AVI視頻文件,可以如下: private void btnOpenAVI_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "AVI文件|*.avi"; if (openFileDialog.ShowDialog() == DialogResult.OK) { CvInvoke.cvNamedWindow("打開視頻"); IntPtr capture=CvInvoke.cvCreateFileCapture(openFileDialog.FileName); this.video = capture; IntPtr frame = new IntPtr(); while (true) { frame = CvInvoke.cvQueryFrame(capture); CvInvoke.cvShowImage("打開視頻", frame); //if (!frame) break; int c = CvInvoke.cvWaitKey(20); if (c == 13) break; } //this.video = capture; CvInvoke.cvWaitKey(0); CvInvoke.cvReleaseCapture(ref capture); CvInvoke.cvDestroyWindow("打開視頻"); } } 要保存一個(gè)AVI文件可以如下: private void btnSaveAVI_Click(object sender, EventArgs e) { IntPtr avi = this.video; SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "BMP文件|*.bmp|JPG文件|*.jpg|JPEG文件|*.jpeg|所有文件|*.*"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { IntPtr videoWriter = CvInvoke.cvCreateVideoWriter(saveFileDialog.FileName, -1, 20, new Emgu.CV.MCvSize(480, 500), 1); IntPtr capture=CvInvoke.cvCreateFileCapture(saveFileDialog.FileName); IntPtr frame = new IntPtr(); while (true) { frame = CvInvoke.cvQueryFrame(capture); CvInvoke.cvWriteFrame(videoWriter, frame); } } } 注意上面的保存AVI和打開AVI文件還存在問題:就是在AVI文件結(jié)尾處,如何退出的問題。在C++里面我們可以用if(!frame) break;來退出。但是在C#中這樣是不行的,因?yàn)樵贑#中圖片的類型是IntPtr類型。所以,在打開AVI文件的程序中,我用了cvWaitKey()的返回值來退出播放AVI文件。而在保存中沒有設(shè)置什么時(shí)候保存完畢,所以,保存AVI文件會(huì)出現(xiàn)問題。不過,只是提供了一種思路罷了。如果想起有其他的方法來檢測(cè)什么時(shí)候AVI文件播放完畢,在貼上來。 |
聯(lián)系客服