安装EMGU库
EmguCV是OpenCV的一个跨平台的.Net封装,由于OpenCV是用C和C++编写的,Emgu用C#对其进行封装,允许用.Net语言来调用OpenCV函数,如C#、VB、VC++等,同时该封装也可以被编译到Mono平台和允许在Windows、Mac OS、Android、iPhone、iPad等多个平台上运行。官网:http://www.emgu.com/wiki/index.php/Main_Page
由于版本间差异较大,库的安装和引用有很大区别,这里推荐使用NuGet来自动配置依赖环境:
- VS 新建一个C# Windows 窗体应用项目
- 点击 Tools -> NuGet package management -> manage NuGet package for solution -> 搜索安装emgucv,选择相应项目和版本可以自动配置。本文使用v3.1.0.1版本,因为最新的4.x版本安装失败了。
- 包含头文件
using System; using System.IO; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; using Emgu.CV; using Emgu.CV.Structure; using Emgu.Util; using Emgu.CV.Util; using Emgu.CV.CvEnum; using System.Runtime.InteropServices; using System.Diagnostics;
添加UI控件
在.NET Framworks 已经引用了Emgu.CV.UI,但是控件工具箱中仍然没有图像类控件。
解决办法:
在Visual Studio中点击:工具 - 选项 - Windows窗体设计器 - 常规,将自动填充工具箱设为True,然后重新打开解决方案即可。
代码示例
用7行代码捕获摄像头
namespace GUIDemo {
static class Program {
static void Main() {
ImageViewer viewer = new ImageViewer(); //create an image viewer
Capture capture = new Capture(); //create a camera captue
Application.Idle += new EventHandler(delegate (object sender, EventArgs e) {
viewer.Image = capture.QueryFrame();
});
viewer.ShowDialog();
}
}
}
用OpenCV的方式去使用
namespace GUIDemo {
static class Program {
static void Main() {
String win1 = "Demo";
CvInvoke.NamedWindow(win1);
Mat img = new Mat(200, 500, DepthType.Cv8U, 3);
img.SetTo(new Bgr(255, 0, 0).MCvScalar);
CvInvoke.PutText(img, "Hello, world",
new System.Drawing.Point(10, 80),
FontFace.HersheyComplex, 2.0,
new Bgr(0, 255, 255).MCvScalar, 4);
CvInvoke.Imshow(win1, img);
CvInvoke.WaitKey(0);
CvInvoke.DestroyWindow(win1);
}
}
}
ImageBox:在GUI窗口中嵌入图像,实时显示直方图
namespace GUIDemo {
public partial class Form1 : Form {
private Capture capture;
private bool runFlag = false;
private Mat frame = new Mat();
public Form1() {
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
CvInvoke.UseOpenCL = false;
try {
capture = new Capture();
capture.ImageGrabbed += frameProcess;
}
catch (NullReferenceException excpt) {
MessageBox.Show(excpt.Message);
}
}
private void frameProcess(object sender, EventArgs arg) {
capture.Retrieve(frame);
imgbox_src.Image = frame;
histbox.ClearHistogram();
histbox.GenerateHistograms(frame, 256);
histbox.Refresh();
}
private void button1_Click(object sender, EventArgs e) {
runFlag = !runFlag;
if (runFlag) {
btn_play_pause.Text = "暂停";
capture.Start();
}
else {
btn_play_pause.Text = "播放";
capture.Pause();
}
}
}
}
PictureBox:编写一个简易的视频播放器
原始项目 的EMCU的版本已经比较老了,我改过后的项目可以直接运行 点击此处下载,默认把视频缩小了50%再播放,界面如下: