• 关于EMGU CV的那些事——1.环境搭建(win8 vs2012 emgucv3.0)


    http://blog.csdn.net/aptx704610875/article/details/46045689

    楼主读研阶段研究图像处理,想用C#实现PTAM/PTAMM算法并用UNITY创建相关应用。对于PTAM(Parallel Tracking and Mapping)算法,使用了大量的第三方库,实现语言是C/C++。之所以选择C#,是因为楼主想要使用Unity将PTAM算法用于AR系统。那么问题来了,C/C++处理图像使用Open CV,C#就只能使用Open CV的兄弟Emgu CV了,Emgu CV对Open CV的函数进行了封装,使其能运行在.net环境中。

    首先我们到Emgu CV的官网那个下载最新3.0.0-rc1版本(http://sourceforge.net/projects/emgucv/files/emgucv/),对应封装的是3.0.0-rc1版本的Open CV。注意我们不需要安装Open CV!对于普通版和CUDA版,如果你不涉及显卡编程的话,没区别。如果需用CUDA或OpenCL对显卡编程,则需要下载CUDA版。楼主认为以后的图像处理,极有可能广泛应用显卡编程。

    下载完后,安装或解压。(楼主机子为windows 8.1 64位系统,IDE为VS2012 Update4.)开始配置环境变量。在用户变量里新建PATH,里面填上安装或解压后的Emgu目录下的bin和bin里的x86和x64。如下图所示:(32位只需x86,64位需加上x64)

    完成后注销或重启。打开VS2012,新建一个C# windows窗体应用程序(注意如果想以后使用unity的话,.net framework应该选3.5一下),打开 工具-选择工具箱项 浏览添加Emgu.CV.UI.dll(在bin目录里),然后右键 解决方案资源管理器里-引用-添加引用-浏览 添加bin目录下的Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll共五个DLL文件即可完成配置。注意每次新建一个工程都需要这一步。

    接下来奉上图片读取和灰度处理的代码:(需在头部加上using Emgu.CV; using Emgu.Util;)

    [csharp] view plaincopyprint?
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.ComponentModel;  
    4. using System.Data;  
    5. using System.Drawing;  
    6. using System.Linq;  
    7. using System.Text;  
    8. using System.Windows.Forms;  
    9.   
    10. using System.Diagnostics;  
    11. using Emgu.CV;  
    12. using Emgu.Util;  
    13.   
    14. namespace EMGU_STUDY_1._0  
    15. {  
    16.     public partial class Form1 : Form  
    17.     {  
    18.         Mat img1 = null;  
    19.         Mat img2 = null;  
    20.         Mat img3 = null;  
    21.         Stopwatch sw = new Stopwatch();  
    22.         public Form1()  
    23.         {  
    24.             InitializeComponent();  
    25.         }  
    26.   
    27.         private void button1_Click(object sender, EventArgs e)  
    28.         {  
    29.             OpenFileDialog lvse = new OpenFileDialog();  
    30.             lvse.Title = "选择图片";  
    31.             lvse.InitialDirectory = "";  
    32.             lvse.Filter = "图片文件|*.bmp;*.jpg;*.jpeg;*.gif;*.png";  
    33.             lvse.FilterIndex = 1;  
    34.   
    35.             if (lvse.ShowDialog() == DialogResult.OK)  
    36.             {  
    37.                 textBox1.Text = null;  
    38.                 sw.Reset();  
    39.                 sw.Start();  
    40.   
    41.                 img1 = CvInvoke.Imread(lvse.FileName, Emgu.CV.CvEnum.LoadImageType.AnyColor);  
    42.                 imageBox1.Width = img1.Width / 2;  
    43.                 imageBox1.Height = img1.Height / 2;  
    44.                 imageBox1.Image = img1;  
    45.   
    46.                 sw.Stop();  
    47.                 textBox1.Text = sw.ElapsedMilliseconds.ToString();  
    48.             }  
    49.   
    50.         }  
    51.   
    52.         private void button2_Click(object sender, EventArgs e)  
    53.         {  
    54.             if (img1 != null)  
    55.             {  
    56.                 img2 = new Mat(img1.Rows, img1.Cols, Emgu.CV.CvEnum.DepthType.Cv8U, 1);  
    57.                 textBox2.Text = null;  
    58.                 sw.Reset();  
    59.                 sw.Start();  
    60.   
    61.                 CvInvoke.CvtColor(img1, img2, Emgu.CV.CvEnum.ColorConversion.Bgr2Gray);  
    62.                 imageBox2.Width = img2.Width / 2;  
    63.                 imageBox2.Height = img2.Height / 2;  
    64.                 imageBox2.Image = img2;  
    65.   
    66.                 sw.Stop();  
    67.                 textBox2.Text = sw.ElapsedMilliseconds.ToString();  
    68.             }  
    69.         }  
    70.   
    71.         private void button3_Click(object sender, EventArgs e)  
    72.         {  
    73.             textBox3.Text = null;  
    74.             OpenFileDialog lvse = new OpenFileDialog();  
    75.             lvse.Title = "选择图片";  
    76.             lvse.InitialDirectory = "";  
    77.             lvse.Filter = "图片文件|*.bmp;*.jpg;*.jpeg;*.gif;*.png";  
    78.             lvse.FilterIndex = 1;  
    79.             if (lvse.ShowDialog() == DialogResult.OK)  
    80.             {  
    81.                 sw.Reset();  
    82.                 sw.Start();  
    83.   
    84.                 img3 = CvInvoke.Imread(lvse.FileName, Emgu.CV.CvEnum.LoadImageType.Grayscale);  
    85.                 imageBox3.Width = img3.Width/2;  
    86.                 imageBox3.Height = img3.Height/2;  
    87.                 imageBox3.Image = img3;  
    88.   
    89.                 sw.Stop();  
    90.                 textBox3.Text = sw.ElapsedMilliseconds.ToString();  
    91.             }  
    92.         }  
    93.   
    94.         private void button4_Click(object sender, EventArgs e)  
    95.         {  
    96.             img1 = null;  
    97.             img2 = null;  
    98.             img3 = null;  
    99.             imageBox1.Image = null;  
    100.             imageBox2.Image = null;  
    101.             imageBox3.Image = null;  
    102.             textBox1.Text = null;  
    103.             textBox2.Text = null;  
    104.             textBox3.Text = null;  
    105.         }  
    106.     }  
    107. }  


    代码里创建里三个imagebox控件。imagebox1显示由button1加载的彩色图片,imagebox2显示imagebox1中彩色图片通过灰度处理后的灰度图片,imagebox3显示由button3加载的灰度图片。button2使用的是灰度处理函数CvInvoke.CvtColor(),将已经加载好的彩色图像转化为灰度图像。button3中直接在加载时就处理为灰度图像。 本程序还使用Stopwatch计时器对三个过程进行了计时,分别显示在对应的textbox里。

    (PS: 对于button2里的灰度处理过程,第一次运行的时间长达200ms+,之后每次在3ms左右,楼主估计是第一次从库中检索并加载灰度处理函数的时间,之后都是直接调用,所以3ms为灰度处理过程的时间。)

    欢迎大家给出意见,共同学习!

  • 相关阅读:
    Struts2+Spring+Mybatis+Junit 测试
    struts2 action 页面跳转
    Java面试题(全)
    Java面试题
    Kubernets二进制安装(17)之安装部署Dashboard
    Kubernets二进制安装(16)之安装部署traefik(ingress)
    Kubernets二进制安装(15)之安装部署coredns
    Kubernets二进制安装(14)之flannel之SNAT规则优化
    Kubernets二进制安装(13)之部署Flannel
    Docker网络模型
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/4959057.html
Copyright © 2020-2023  润新知