EMGU:开发用于图像处理的C#窗体程序


安装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来自动配置依赖环境:

  1. VS 新建一个C# Windows 窗体应用项目
  2. 点击 Tools -> NuGet package management -> manage NuGet package for solution -> 搜索安装emgucv,选择相应项目和版本可以自动配置。本文使用v3.1.0.1版本,因为最新的4.x版本安装失败了。
  3. 包含头文件
    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%再播放,界面如下:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值