二 將文件解壓出來,放到哪里都可以,,不過建議將解壓出來的文件夾放到OpenCV的目錄下面,,這樣不會誤刪吧,,呵呵。
三 當(dāng)然,,在用EmguCV之前,,要安裝了OpenCV,并且OpenCV的各項配置都配置OK了,,我這里說的只是配置EmguCV的,。所以,請確保在配置EmguCV之前你的OpenCV的開發(fā)環(huán)境已經(jīng)配置OK了,。如果不會,,可以看我的一篇文章。就在“學(xué)海泛舟篇”中,,找找看吧,。
四 打開Visual Studio 2005/2008,新建C#的Win32窗體應(yīng)用程序,。然后,,點擊“項目”-〉“添加引用”-〉“瀏覽”,然后把EmguCV1.3.0目錄下的Emgu.CV.dll Emgu.Util.dll ZedGraph.dll zlib.net.dll 都添加到引用里面,,其實也不用全部添加,,不過由于我們不知道有些函數(shù)在那些dll中,所以索性全添加就可以了,。
五 然后,,再程序的開頭中加上 using Emgu.CV; using Emgu.Util; 之后就可以用EmguCV中所有的庫函數(shù)了。
六 在窗體上畫一個按鈕,,然后再按紐的下面寫上如下的程序:
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ù)來打開和顯示一個圖片了。如果要保存圖片可以如下:
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);
}
}
如果要打開一個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("打開視頻");
}
}
要保存一個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#中這樣是不行的,因為在C#中圖片的類型是IntPtr類型,。所以,,在打開AVI文件的程序中,我用了cvWaitKey()的返回值來退出播放AVI文件,。而在保存中沒有設(shè)置什么時候保存完畢,,所以,保存AVI文件會出現(xiàn)問題,。不過,,只是提供了一種思路罷了。如果想起有其他的方法來檢測什么時候AVI文件播放完畢,在貼上來,。