Emgu CV is a cross platform .Net wrapper to the OpenCV image processing library. Allowing OpenCV functions to be called from .NET compatible languages such as C#, VB, VC++, IronPython etc. The wrapper can be compiled by Visual Studio, Xamarin Studio and Unity, it can run on Windows, Linux, Mac OS X, iOS, Android and Windows Phone.
Emgu CV 下載地址:http://www.emgu.com/wiki/index.php/Main_Page,需要下載3.0版本以后的,Emgu CV 3.0集成了ffmpeg
Capture _capture = new Capture(fileName); //rtsp://user:password@192.168.1.66:554/ _capture.ImageGrabbed += capture_ImageGrabbed; _capture.Start();
private void capture_ImageGrabbed(object sender, EventArgs e)
{
try
{
Mat frame = new Mat();
lock (lockObj)
{
if (capture != null)
{
if (!capture.Retrieve(frame))
{
frame.Dispose();
return;
}
if (frame.IsEmpty)
return;
//顯示圖片 可以使用Emgu CV 提供的 ImageBox顯示視頻, 也可以轉成 BitmapSource顯示。
//略
}
}
}
catch (Exception ex)
{
}
}
public static class BitmapSourceConvert { /// <summary> /// Delete a GDI object /// </summary> /// <param name="o">The poniter to the GDI object to be deleted</param> /// <returns></returns> [DllImport("gdi32")] private static extern int DeleteObject(IntPtr o); /// <summary> /// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source /// </summary> /// <param name="image">The Emgu CV Image</param> /// <returns>The equivalent BitmapSource</returns> public static BitmapSource ToBitmapSource(IImage image) { using (System.Drawing.Bitmap source = image.Bitmap) { IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( ptr, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); DeleteObject(ptr); //release the HBitmap return bs; } } }
注意事項:由於ffmpeg 默認使用TCP阻塞方式建立連接,連接超時時間很長。如果連接不成功,會導致阻塞。需要設置ffmpeg連接方式或者設置超時時間。
設置方式:
public bool SetCaptureProperty(CapProp property, double value); //Capture方法。具體怎么設置不知道、或者Emgu CV沒有提供這個接口