C#使用OpenCV
一、OpenCV的安装
1、需要安装两个拓展包:OpenCvSharp4和OpenCvSharp4.runtime.win
在VS中,通过其工具中自带的扩展包就安装了,不需要像C++中用opencv那样,还要配置属性。
安装步骤:工具——》Nuget包管理器——》管理解决方案的Nuget包。直接搜索opencvsharp。
2、出错
c# OpenCvSharp4 无法加载 DLLOpenCvSharpExtern:找不到指定的模块
这句话的意思是,这个包只包含内部算法的核心部分,因此,使用时还需添加OPENCV4.runtime
安装这个拓展包就可以使用了。
二、C#使用OpenCV的一些代码
1、需要加头文件
using OpenCvSharp; //为了使用opencv
using Point = OpenCvSharp.Point; //为了确定我们使用的point是opencv的而不是draw的
2、读取图片
Mat img1 = new Mat("F:\\all_truck\\truck_3.jpg", ImreadModes.Color);
Cv2.ImShow("win1", img1);
Cv2.WaitKey(0);
3、定义一个没有初始化的图片作为复制
//pBkImage是已经赋值了的图片,将这个图片复制到pBkImage_copy中
Mat pBkImage_copy = new Mat();
pBkImage.CopyTo(pBkImage_copy);
4、灰度化
CvtColor(InputArray src, OutputArray dst, ColorConversionCodes code, int dstCn = 0)
第一个参数 src 是原图像。
第二个参数 dst 是转换后的图像。
第三个参数 code 转换成什么格式的图片。
第四个参数 dstcn 为通道数。
这里第三个参数的编码格式,更快捷的方式是首先输入ColorConversionCodes.,然后按照c#或者python的代码中的BGR2GRAY直接输入就可以了,这里会自动跳出合适的选项。
Cv2.CvtColor(pBkImage_copy, pBkImage_gray, ColorConversionCodes.BGR2GRAY);
5、高斯模糊和size数据格式的定义
下面是size数据格式的定义
OpenCvSharp.Size up = new Size(1000, 500);
高斯模糊:难点是size格式的定义,这里使用了:new OpenCvSharp.Size(11,11)
Cv2.GaussianBlur(pBkImage_gray, pBkImage_gauss, new OpenCvSharp.Size(11,11), 4, 4);
6、二值化
难点:ThresholdTypes.Binary
Cv2.Threshold(Image_diff, Image_threshold, 60, 255, ThresholdTypes.Binary);
7、开闭运算
//自定义核,进行开、闭运算
Mat element = Cv2.GetStructuringElement(MorphShapes.Rect, new OpenCvSharp.Size(5, 5));
Cv2.MorphologyEx(Image_threshold, Image_morp, MorphTypes.Open, element);
Cv2.MorphologyEx(Image_morp, Image_morp, MorphTypes.Close, element);
8、FindContours查找轮廓和contours参数的定义和操作
C#中OpenCVSharp实现轮廓检测
这个链接的示例非常好
难点:contours,hierarchy格式的定义。contours.Length和Cv2.ContourArea(contours[i]);函数的使用
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(Image_morp, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple, new Point(0, 0));
if (contours.Length == 0)
{
System.Diagnostics.Debug.WriteLine("没有任何前景");
return 0;
}
double image_area = 0.0;
for (int i = 0; i < contours.Length; i++)
{
image_area += Cv2.ContourArea(contours[i]);
}
9、Rect和Size格式的定义
OpenCvSharp.Size up = new Size(1000, 500);
Rect rect =new Rect(x, y, width, height);
Rect rect =new OpenCvSharp.Rect(x, y