OpenCvSharp 项目地址: https://github.com/shimat/opencvsharp
OpenCvSharp 文档地址: https://shimat.github.io/opencvsharp_docs/index.html
Windows 下建立C#项目
- 使用NuGet
项目→管理NuGet包→浏览并安装OpenCvSharp4
和OpenCvSharp4.runtime.win
两个NuGet包。
或者
项目→管理NuGet包→浏览并安装OpenCvSharp4.Windows
这一个合成包。 - 自行从release page下载 DLL文件
下载地址:https://github.com/shimat/opencvsharp/releases
自行下载并引用所需要的DLL文件。
建立测试程序
// Edge detection by Canny algorithm
using OpenCvSharp;
class Program
{
static void Main()
{
Mat src = new Mat("lenna.png", ImreadModes.Grayscale);
// Mat src = Cv2.ImRead("lenna.png", ImreadModes.Grayscale);
Mat dst = new Mat();
Cv2.Canny(src, dst, 50, 200);
using (new Window("src image", src))
using (new Window("dst image", dst))
{
Cv2.WaitKey();
}
}
}
在Debug目录下放入一张图片:lenna.png。运行后就可以看到两个弹出窗口,分别是图片的源图和铅笔画风格处理过的图片。
OpenCV中Mat的基本用法
在类 cv::Mat 中,图像数据以 unsigned char 形式保存在一块内存中。这块内存的首地址可以通过data成员变量得到。data是一个 unsigned char 型的指针,所以循环图像数据可以以如下方式开始:
uchar *data = image.data;
从当前行到下一行可以通过对指针加上 行宽 完成:
data += image.step; //下一行
step代表图像的行宽(包括填补像素),所以可以通过如下方式获得第j行第i列的像素的地址:
data = image.data + j * image.step + i * image.elemSize();
- Mat image(240, 320, CV8UC3);
第一个参数是rows,该矩阵的行数;第二个参数是cols,该矩阵的列数;第三个参数是该矩阵元素的类型。这句话表示创建一个大小为240×320的矩阵,里面的元素为8位unsigned型,通道数(channel)有3个。 - image.create(480, 640, CV8UC3);
分配(或重新分配)image矩阵,把大小设为480×640,类型设为CV8UC3。
和C#的接口类OpenCvSharp.Extensions
因为OpenCV的程序大部分是用C++写的,OpenCV类里缺少和C#的类型转换。这个类里提供了一些静态方法来转换OpenCV类型和C#类型。
static Bitmap OpenCvSharp.Extensions.BitmapConverter.ToBitmap(Mat mat); //Mat 转 Bitmap
static Mat OpenCvSharp.Extensions.BitmapConverter.ToMat(Image bitmap); //Bitmap 转 Mat
学习OpenCvSharp最新的示例包
下载地址: https://github.com/shimat/opencvsharp/releases
找到Sample-4.1.0-20190417.zip
,下载解压。用VS2017打开、重新编译。。。错误提示:
The current .NET SDK does not support targeting .NET Core 2.0. Either target .NET Core 1.1 or lower, or use a version of the .NET SDK that supports .NET Core 2.0.
说是我的电脑里没有安装.NET Core 2.0
。去微软的网站下载一个。如果运行平台是x86就下x86的包,是x64就下x64的。
下载地址: https://dotnet.microsoft.com/download/dotnet-core
下载完成后安装。然后cmd
输入命令dotnet --info
检查,显示安装成功。
再次编译运行,成功!