C#使用OpenCV | 您所在的位置:网站首页 › videosource什么意思 › C#使用OpenCV |
C#使用OpenCV
一、OpenCV的安装1、需要安装两个拓展包:OpenCvSharp4和OpenCvSharp4.runtime.win2、出错
二、C#使用OpenCV的一些代码1、需要加头文件2、读取图片3、定义一个没有初始化的图片作为复制4、灰度化5、高斯模糊和size数据格式的定义6、二值化7、开闭运算8、FindContours查找轮廓和contours参数的定义和操作9、Rect和Size格式的定义10、 resize函数在图片上画矩形框在图片上画直线
不错的链接一些完成的代码1、帧差法判断当前帧有没有物体
一、OpenCV的安装
1、需要安装两个拓展包:OpenCvSharp4和OpenCvSharp4.runtime.win
在VS中,通过其工具中自带的扩展包就安装了,不需要像C++中用opencv那样,还要配置属性。 安装步骤:工具——》Nuget包管理器——》管理解决方案的Nuget包。直接搜索opencvsharp。
CvtColor(InputArray src, OutputArray dst, ColorConversionCodes code, int dstCn = 0) 第一个参数 src 是原图像。 第二个参数 dst 是转换后的图像。 第三个参数 code 转换成什么格式的图片。 第四个参数 dstcn 为通道数。 这里第三个参数的编码格式,更快捷的方式是首先输入ColorConversionCodes.,然后按照c#或者python的代码中的BGR2GRAY直接输入就可以了,这里会自动跳出合适的选项。 下面是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 string source_wrl = "C:/Users/liu/source/repos/car_segment_1/car_segment"; string fileUrl_Bk = source_wrl + "/photo/background_absdiff/Wide_angle_78_1/0.jpg"; string fileUrl_Fr = source_wrl + "/photo/background_absdiff/Wide_angle_78_1/15.jpg"; Mat pFrImage = new Mat(fileUrl_Fr, ImreadModes.Color); Mat pBkImage = new Mat(fileUrl_Bk, ImreadModes.Color); textBox1.Text = "213"; int s = 9; s = object_judgment(fileUrl_Bk,fileUrl_Fr); textBox1.Text = s.ToString(); } public void redefineWH(int weight, int hight, int maxSize, int[] size) { int maxValue = Math.Max(weight, hight); float rate = (float)maxSize / (float)maxValue; int w = (int)Math.Round(weight * rate); int h = (int)Math.Round(hight * rate); size[0] = w; size[1] = h; } //如果返回0说明没有物体,如果返回1说明有物体 public int target_judgment(Mat pBkImage, Mat pFrImage) { //这里需要加上一个图片是否存在的判断 /*cout //approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); //cout //Mat pBkImage_mid, pFrImage_mid, pBkImage_resize, pFrImage_resize; //定义了前景和背景帧 //定义了前景和背景帧 Mat pBkImage = new Mat(); Mat pFrImage = new Mat(); Mat pBkImage_mid = new Mat(); Mat pFrImage_mid = new Mat(); Mat pBkImage_resize = new Mat(); Mat pFrImage_resize = new Mat(); //pBkImage = imread("./photo/background_absdiff/Wide_angle_78_1/0.jpg"); //pFrImage = imread("./photo/background_absdiff/Wide_angle_78_1/14.jpg"); pBkImage = Cv2.ImRead(pBkImage_file, ImreadModes.Color); pFrImage = Cv2.ImRead(pFrImage_file, ImreadModes.Color); Mat a = Cv2.ImRead(pBkImage_file, ImreadModes.Color); Cv2.ImShow("a", a); Cv2.ImShow("pFrImage", pFrImage); if (pBkImage.Empty()) { System.Diagnostics.Debug.WriteLine("没有背景图片"); return -1; } if (pFrImage.Empty()) { System.Diagnostics.Debug.WriteLine("没有前景图片"); return -1; } pBkImage.CopyTo(pBkImage_mid); pFrImage.CopyTo(pFrImage_mid); int x, y, width, height; x = 0; y = (int)(pBkImage.Rows / 3); width = (int)(pBkImage.Cols); height = (int)(pBkImage.Rows / 6); //cout |
CopyRight 2018-2019 实验室设备网 版权所有 |