OpenCV(Emgu)入门系列(8):在C#的PictureBox显示由EmguCV读取的图片

使用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

效果图

image

关键代码

直接使用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才可以正常使用。

转载于:https://www.cnblogs.com/9keyes/archive/2012/08/08/2627545.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值