OpencvSharp 在WPF的Image控件中显示图像

1、安装OpencvSharp

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

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

image

搜索Opencv

image

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

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

离线安装方法:

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

后缀为nupkg。

image

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

image

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

image

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

image

2、建立WPF工程

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

image

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

using OpenCvSharp;

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

1Mat image = new Mat(@"girl.png", ImreadModes.Color); 2Cv2.ImShow("Demo", image); 3Cv2.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类型:

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

再转化为BitmapImage类型。

1public BitmapImage MatToBitmapImage(Mat image) 2 { 3 Bitmap bitmap = MatToBitmap(image); 4 using (MemoryStream stream = new MemoryStream()) 5 { 6 bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); // 坑点:格式选Bmp时,不带透明度 7 8 stream.Position = 0; 9 BitmapImage result = new BitmapImage(); 10 result.BeginInit(); 11 // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed." 12 // Force the bitmap to load right now so we can dispose the stream. 13 result.CacheOption = BitmapCacheOption.OnLoad; 14 result.StreamSource = stream; 15 result.EndInit(); 16 result.Freeze(); 17 return result; 18 } 19 }

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

1private void button2_Click(object sender, RoutedEventArgs e) 2 { 3 try 4 { 5 Mat image = new Mat(@"girl.png", ImreadModes.Color); 6 WPFImge.Source = MatToBitmapImage(image); 7 } 8 catch(Exception exp) 9 { 10 MessageBox.Show(exp.ToString()); 11 return; 12 } 13 }

参考文献:

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

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

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

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

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

imageimage

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

image

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )