C#使用OpenCV 您所在的位置:网站首页 videosource什么意思 C#使用OpenCV

C#使用OpenCV

2023-09-10 16:34| 来源: 网络整理| 查看: 265

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。 在这里插入图片描述

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 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 实验室设备网 版权所有