使用VC++对着《学习OpenCV》做了几个例子之后,我觉得该改用C#了。因为我想自己实验一下OpenCV的功能,比如弄几个输入框、按扭来控制程序,发现使用VC++特别难(相对我的c++水平来说)。对于这种非核心的部分,我不愿意浪费太多时间,于是果断转向C#。
在C#中使用OpenCV,就要使用它的wrapper了。目前发现有两个:
- EmguCV 开发活跃、功能强,使用者也多一些,可惜是GPL/商业授权。好在License不是很贵,200$左右,用得好的话买一个也可以接受
- OpencvSharp 由日本人开发,LGPL,相对EmguCV友好一些,对API的封装看起来也舒服一些。比如CV.LoadImage(),而不像Emgu的CvInvoke.cvLoadImage()
最开始试的是OpencvSharp,可惜在写简单的Hello world时,不知道哪里的库没调对,总是出错,折腾半天放弃了,转而使用Emgu。实际上在Emgu中也遇到了同样的问题,好在解决了就先用着吧。
因为Emgu/OpencvSharp的API都跟OpenCV相当相似,所以以后根据情况切换应该也不麻烦。
任务
虽然Emgu提供了一个功能强大的ImageBox控件,但这里我想先测试一下,如何将Emgu与C#的控件结合起来:由Emgu读取图片,显示在C#的控件PictureBox中。
注意:使用64位的OpenCV和Emgu
效果图
关键代码
直接使用PictureBox显示一幅图片,或者直接使用Emgu的API把一张图片显示到一个窗口,都是很容易的事。难点在于,如何把Emgu读取的图片,转为PictureBox可使用的Bitmap呢?
看以下代码:
IntPtr image = CvInvoke.cvLoadImage(filename, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
Image<Bgr, byte> dest = new Image<Bgr, byte>(CvInvoke.cvGetSize(image));
CvInvoke.cvCopy(image, dest, IntPtr.Zero);
pictureBox1.Image = dest.ToBitmap();
其中image是由Emgu读取的图片,它实际上是一个指针(IntPtr),如果想把它转为Bitmap,需要一个中间步骤:创建一个Emgu.CV.Image对象,再用cvCopy把数据拷贝过去,然后再调用ToBitmap()方法转换即可。
完整代码
以下为Form1的完整代码,不包含GUI的布局:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.CV.Structure;
namespace ShowCVImage {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
var dialog = new OpenFileDialog();
dialog.Filter = "图片(*.jpg/*.png/*.gif/*.bmp)|*.jpg;*.png;*.gif;*.bmp";
if (dialog.ShowDialog() == DialogResult.OK) {
var filename = dialog.FileName;
IntPtr image = CvInvoke.cvLoadImage(filename, Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR);
Image<Bgr, byte> dest = new Image<Bgr, byte>(CvInvoke.cvGetSize(image));
CvInvoke.cvCopy(image, dest, IntPtr.Zero);
pictureBox1.Image = dest.ToBitmap();
}
}
}
}
可见还是相当简洁的。
注意事项
注意这是一个x64程序,使用的OpenCV链接库、Emgu和编译平台,都应该是x64的。有一项不对则程序无法正常运行。
这里再复习一遍
- PATH中:E:\OpenCV\OpenCV-2.4.0\build\x64\vc10\bin;E:\OpenCV\OpenCV-2.4.0\build\common\tbb\intel64\vc10;E:\OpenCV\Emgu\emgucv-windows-x64 2.4.0.1717\bin
- 项目引用:Emgu.CV和Emgu.Util即可
- 编译平台:右键“解决方案”->“属性”->“配置管理器”->“活动解决方案平台”->“新建”->“键入或选择新平台”选x64 -> 确定即可
另外,当前的OpenCV版本为2.4.2,但Emgu和OpencvSharp使用的还是2.4.0。也就是说,你需要下载OpenCV2.4.0才可以正常使用。