1、安装OpencvSharp

我使用的是VS2013 社区版,安装OpencvSharp3.0

在线安装方法:进入Tools,打开NuGet的包管理器

搜索Opencv

安装之后就可以使用,无需再做其他配置。

但是有个问题就是每新建一个解决方案就得重新下载安装,对网速慢的小伙伴很不友好。

离线安装方法:

打开一个已经安装过OpencvSharp3的解决方案的目录,在Package目录下有OpencvSharp的安装包,

后缀为nupkg。

打开新建的未安装OpencvSharp的解决方案,进到Tools,NuGet管理器,选择左下角的Setting。

添加一个package source,并将其source设置为刚才OpencvSharp安装包所在的目录即可,然后取一个好记得名字。

回到NuGet包管理界面,会发现Online里多了一个Package Source 选项,这个选项里可以看到刚才目录下的安装包,点击安装即可。

2、建立WPF工程

新建WPF工程,拖入两个button,一个Image控件。

为了使用OpencvSharp,需要在文件开头添加:

using OpenCvSharp;

之后在button1的响应函数下添加图片显示的代码:

Mat image = new Mat(@"girl.png", ImreadModes.Color);
Cv2.ImShow("Demo", image);
Cv2.WaitKey(0);

这样就实现了图片显示的功能,但是图片会显示在一个弹出的窗口上,而不会显示在Image控件上。

3、Bitmap 转 BitmapImage

将图片显示在Image控件上很简单,只需要设置Image控件的source属性,可参考:WPF中使用Image控件显示图片 - CSDN博客 https://blog.csdn.net/chuangand/article/details/48031271

WPFImge.Source = BitmapImage;

因此需要把Mat类型转化为BitmapImage类型。

先把Mat转化为Bitmap类型:

public Bitmap MatToBitmap(Mat image)
{
return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
}

再转化为BitmapImage类型。

public BitmapImage MatToBitmapImage(Mat image)
{
Bitmap bitmap = MatToBitmap(image);
using (MemoryStream stream = new MemoryStream())
{
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); // 坑点:格式选Bmp时,不带透明度 stream.Position = 0;
BitmapImage result = new BitmapImage();
result.BeginInit();
// According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
// Force the bitmap to load right now so we can dispose the stream.
result.CacheOption = BitmapCacheOption.OnLoad;
result.StreamSource = stream;
result.EndInit();
result.Freeze();
return result;
}
}

最后在button2的响应函数中添加显示图像的代码:

private void button2_Click(object sender, RoutedEventArgs e)
{
try
{
Mat image = new Mat(@"girl.png", ImreadModes.Color);
WPFImge.Source = MatToBitmapImage(image);
}
catch(Exception exp)
{
MessageBox.Show(exp.ToString());
return;
}
}

参考文献:

c# 4.0 - How can I convert Mat to Bitmap using OpenCVSharp? - Stack Overflow https://stackoverflow.com/questions/37540750/how-can-i-convert-mat-to-bitmap-using-opencvsharp

【C#/WPF】Bitmap、BitmapImage、ImageSource 、byte[]转换问题 - CSDN博客 https://blog.csdn.net/qq_18995513/article/details/53693554

4、添加引用:using和reference

上一节中用到的变量类型对应的命名空间如下:

using System.Windows.Media.Imaging; //使用BitMapImage类型
using OpenCvSharp; //OpencvSharp
using System.Drawing; //使用Bitmap类型
using System.IO; //使用MemoryStream类型

如果代码中添加了命名空间还是报错,就需要手动添加reference。

首先看看用到的命名空间是否在现有的reference中:

如果没有,就要手动Add Reference…比如我新建的项目中就没有自动添加Drawing这个命名空间:

OpencvSharp 在WPF的Image控件中显示图像的更多相关文章

  1. 在WPF的WebBrowser控件中抑制脚本错误

    原文:在WPF的WebBrowser控件中抑制脚本错误 今天用WPF的WebBrowser控件的时候,发现其竟然没有ScriptErrorsSuppressed属性,导致其到处乱弹脚本错误的对话框,在 ...

  2. 关于使用MVVM模式在WPF的DataGrid控件中实现ComboBox编辑列

    最近在做一个组态软件的项目,有一个需求需要在建立IO设备变量的时候选择变量的类型等. 建立IO变量的界面是一个DataGrid实现的,可以一行一行的新建变量,如下如所示: 这里需要使用带有ComboB ...

  3. 在WPF的WebBrowser控件中屏蔽脚本错误的提示

    在WPF中使用WebBrowser控件显示网页时,经常会报脚本错误的提示,如何屏蔽掉这些错误提示呢.方法是定义如下方法: public void SuppressScriptErrors(WebBro ...

  4. 获取WPF的DataGrid控件中,是否存在没有通过错误验证的Cell

     /// <summary>         /// 获取DataGrid的所有行是否存在验证错误.         /// </summary>         /// &l ...

  5. WPF Image控件中的ImageSource与Bitmap的互相转换

    原文:WPF Image控件中的ImageSource与Bitmap的互相转换  1.从bitmap转换成ImageSource [DllImport("gdi32.dll", ...

  6. WPF 在绘图控件(Shape)中添加文字 [2018.7.15]

    原文:WPF 在绘图控件(Shape)中添加文字 [2018.7.15] Q:使用Shape的子类Ellipse画一个圆,如何在圆中添加文字? A:Shape类中不包含Text属性.可使用Shape类 ...

  7. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

  8. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  9. 【WPF】将控件事件中的参数,传递到ViewModel中

    在MVVM模式下,在通常使用命令(Command)绑定的方式的时候 ,使用的是 CommandParameter 属性进行参数的传递. 但是很多时候,有一些事件我们需要使用其中的一些事件里面的参数,以 ...

随机推荐

  1. redis集群中的主从复制架构(3主3从)

    架构图如下 首先开启6个实例,这里为了演示方便,只是在一个linux上开启了6个redis实例 6380 (主)   6480 (从) 6381(主)   6481(从) 6382(主)   6482 ...

  2. CSS学习笔记:盒子模型

    盒子模型(CSS basic box model):When laying out a document, the browser's rendering engine represents each ...

  3. 【Tomcat】Tomcat + Memcached 实现session共享

    概述 web项目中,Tomcat的访问量总是有限的,这时候就需要用到Tomcat集群,多个Tomcat的时候就要考虑Session共享的问题,这里介绍一种使用Memcached做Session共享的解 ...

  4. MySQL把本地数据库上传到linux

    今天是要导入数据库到linux系统 先用Navicat把sql导出,然后登陆到linux去执行 登陆mysql: mysql -uroot -p123456 创建数据库:create database ...

  5. 树状数组训练题2:SuperBrother打鼹鼠(vijos1512)

    先给题目链接:打鼹鼠 这道题怎么写? 很明显是树状数组. 而且,很明显是二维树状数组. 如果你没学过二维的树状数组,那么戳开这里:二维树状数组 看完以后,你就会知道怎么做了. 没有什么好解释的,几乎就 ...

  6. Yii2 数据库查询汇总

    1.基础查询 User::find()->all(); 此方法返回所有数据: User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find( ...

  7. Educational Codeforces Round 61 C 枚举 + 差分前缀和

    https://codeforces.com/contest/1132/problem/C 枚举 + 差分前缀和 题意 有一段[1,n]的线段,有q个区间,选择其中q-2个区间,使得覆盖线段上的点最多 ...

  8. laravel 5.1 简单配置例子

    这里演示5.1版本 一.数据库配置 .env文件(也可以直接修改config/database.php) DB_HOST=localhost DB_DATABASE=test  //数据库名称 DB_ ...

  9. user表中存在多条相同user不同host用户信息时MySQL该匹配哪条记录登录?

    问题: 当用户名相同,但主机名不同的多条记录.用户由不同主机登录时,选择使用那条记录来验证,数据库版本为:5.6.25 如:IP为192.168.141.241 hostname为vhost02主机上 ...

  10. ==和equals的比较

    一 : == 的特点: a == b ; 1.如果A和B是基本数据类型    ==   比较的是两个变量的值 2.如果A和B是引用数据类型    == 比较的是两个变量的内存地址 二:重写的equal ...