首页 > 其他分享 >图像处理技术OpencvSharp入门

图像处理技术OpencvSharp入门

时间:2022-12-05 12:12:00浏览次数:53  
标签:gray 入门 ImShow Cv2 OpenCV 图像处理 OpencvSharp Mat mat

目录

第一部分 初识Opencv

1.C# 下Opencv库

2.安装OpenCvSharp

第二部分 OpencvSharp入门

1.加载图像文件

2.显示图像

第三部分 基础应用

1.颜色转换

2.尺寸调整

3.二值化

4.四则运算

5.颜色分割

6.直线检测

初识Opencv

C# 下使用Opencv 库

 

•在.NET下常用OpenCV进行图像处理工作,常用的.NET下的OpenCV库有Emgu CV和OpenCVSharp。

• Emgu CV是.NET平台下对OpenCV图像处理库的封装,也就是.NET版的OpenCV。由于OpenCV是用C和C++编写的,Emgu用C#对其进行封装,允许用.Net语言来调用OpenCV函数,如C#、VB、VC++等。

•OpenCvSharp 是一个OpenCV的.Net wrapper,应用最新的OpenCV库开发,使用习惯比EmguCV更接近原始的OpenCV,有详细的使用样例供参考。该库采用LGPL发行,对商业应用友好。使用OpenCvSharp,可用C#,VB.NET等语言实现多种流行的图像处理(image processing)与计算机视觉(computer vision)算法。

•使用VS2022新建一个.net6窗体项目。

•搜索安装opencvsharp4,安装OpenCvSharp4.Windows包。

 

OpencvSharp入门

加载图像文件

•创建一个帮助类OpencvHelper,后面都在此类中实现功能

•首先 usingOpenCvSharp;

•如何加载一个图像,返回Mat对象

•Mat mat= Cv2.ImRead(fileName, ImreadModes.Color);//加载为彩色图像,结果是三通道

•Mat mat= Cv2.ImRead(fileName, ImreadModes.Grayscale);//加载为灰度图像,结果是单通道,彩色的默认转灰色

•Mat mat= Cv2.ImRead(fileName, ImreadModes.AnyColor);//加载任意图像,结果随图像,灰色或者彩色。

Cv2.ImShow(“窗口名称”, mat);//mat是将要显示的Mat对象,

此处显示Mat对象必须是BGR格式,其他像素格式,需要转回BGR格

式再显示

•Cv2.WaitKey();//用于Cv2.ImShow的等待。没有此句则立即执行下一行代码

颜色转换

•Mat mat = Cv2.ImRead(fileName, ImreadModes.Color);

•Mat gray= newMat();

Cv2.CvtColor(mat, gray, ColorConversionCodes.BGR2GRAY);

 

 

 

•Mat mat = Cv2.ImRead(fileName, ImreadModes.Color);

•Mat hsv= newMat();

Cv2.CvtColor(mat, gray, ColorConversionCodes.BGR2HSV);//BGR转HSV格式

重点:ColorConversionCodes枚举

 

尺寸调整

•Mat result = newMat();

•Cv2.Resize(mat, result,  newOpenCvSharp.Size(100,100));

•重点:Cv2.Resize方法,有多个重载

 

二值化

•Mat gray = newMat();

•Cv2.CvtColor(mat, gray, ColorConversionCodes.BGR2GRAY);//转灰度图

•Scalarscalar  = Cv2.Mean(gray);//计算灰度图平均值

•Cv2.Threshold(gray, gray, scalar.Val0, 255, ThresholdTypes.Binary);//二值化

 

 

 

四则运算

•原则:通道相同,尺寸相同,才能运算。

Cv2.BitwiseAnd//与预算

Cv2.BitwiseNot//取反运算

Cv2.BitwiseOr //或运算

Cv2.BitwiseXor //异或运算

Cv2.Add//两图相加

Cv2.Subtract//两图相减

Cv2.Multiply //乘法

Cv2.Divide //除法

颜色分割

 

•//  HSV:H颜色范围

•// Orange  0 - 22

•//Yellow 22 - 38

•// Green 38 - 75

•// Blue 75 - 130

•// Violet 130 - 160

•// Red 160 - 179

 

•下面示例实分割红色区域代码

public static Mat GetColor(Mat mat){

•Cv2.ImShow("mat", mat);

•Mat hsv = newMat();//HSV格式对象

•Cv2.CvtColor(mat,hsv, ColorConversionCodes.BGR2HSV);//颜色转换

•var mask = hsv.InRange(newScalar(0, 46, 46), newScalar(29, 255, 255));//红色区域

•varmask2 = hsv.InRange(newScalar(165, 46, 46), newScalar(180, 255, 255));//红色区域

•Cv2.BitwiseOr(mask, mask2, mask);//范围叠加

•Cv2.BitwiseNot(mask, mask);//取反,黑白颜色反过来

•Cv2.ImShow("mask", mask);

•Mat mat1 = newMat();

•Cv2.CvtColor(mask, mat1, ColorConversionCodes.GRAY2BGR);//灰度图转彩色图,

•Cv2.Add(mat, mat1, mat1);//与原图相加,获取红色的区域

•Cv2.ImShow("mat1", mat1);

•Cv2.WaitKey();

•returnmat1;

}

 

直线检测

 Cv2.ImShow("mat", mat);

Mat gray = ConvertToBlackBinary(mat);

Cv2.ImShow("二值化", gray);

varkenal3 = Cv2.GetStructuringElement(MorphShapes.Rect, newOpenCvSharp.Size(2, 2));

Cv2.Dilate(gray, gray, kenal3);//

Cv2.ImShow("二值化Dilate", gray);

Cv2.Canny(gray, gray, 50, 150);

Cv2.ImShow("Canny", gray);

varlines = Cv2.HoughLinesP(gray, 1, Math.PI / 180, 100, 250, 50);

if (lines.Length > 0)

{

  for (int i = 0; i < lines.Length; i++)

  {

   Cv2.Line(mat, lines[i].P1, lines[i].P2,newScalar(255,0,0),1, LineTypes.AntiAlias);

  }

}

Cv2.ImShow("结果", mat);

return mat;

 

 

欢迎加入QQ群交流群进行技术交流,

本文项目代码地址:


OpenCvSharpStudy: OpenCvSharp学习实践项目 (gitee.com)

 

标签:gray,入门,ImShow,Cv2,OpenCV,图像处理,OpencvSharp,Mat,mat
From: https://www.cnblogs.com/raoyutian/p/16951932.html

相关文章

  • 利用傅立叶变换进行图像处理的代码演示
    前面有篇文件介绍过使用DCT(离散余弦)变换进行图像处理的例子:方法和思路: 关于傅立叶变换的实践,可以参考这篇文章:代码演示:高频滤波操作:#-*-coding:utf-8-*-importnumpyimpo......
  • redis快速入门
    ​​https://gold.xitu.io/post/5880590d1b69e60058c72803​​​解压后的安装#make指定安装目录:#makePREFIX=/usr/local/redisinstall进入/......
  • JavaScript入门⑤-欲罢不能的对象原型与继承-全网一般图文版
    JavaScript入门系列目录JavaScript入门①-基础知识筑基JavaScript入门②-函数(1)基础{浅出}JavaScript入门③-函数(2)原理{深入}执行上下文JavaScript入门④-万物皆......
  • Web入门:JavaScript文字动画
    欢迎来的我的小院,恭喜你今天又要涨知识了!案例内容利用JavaScript实现文字逐步展现的动画效果。演示学习<!DOCTYPEhtml><htmllang="en"><head><metach......
  • 【图像处理笔记】总目录
    1图像增强1.1图像增强 2形态学2.1 二值图像形态学2.2 灰度级形态学2.3 形态学重建 3图像分割3.1 图像分割之基于灰度不连续性的分割方法......
  • MongoDB入门
    MongoDB数据库https://www.liuqingzheng.top/db/Mongodb系列/Mongodb快速入门/1MongoDB介绍#MongoDB数据库简单介绍是一个面对文档(document-oriented)的数据库,不......
  • 1.C++入门基础(上)
    C++关键字C++关键字全集(参考C++Primer):asmautobad_castbad_typeidboolbreakcasecatchcharclassconstconst_castcontinuedefaultdelete......
  • 2.C++入门基础(下)
    内联函数C++中函数的使用我们已经比较清楚了,与C语言中函数的使用大多相同,主要是增加了重载的特性,对C语言的函数的一些缺陷做了一些补充。那么对于一些比较简单却又经常使......
  • GORM快速入门
    Gorm(Go-orm框架)ThefantasticORMlibraryforGolangaimstobedeveloperfriendly.(Go语言对开发者最友好的ORM框架。)gorm是一个使用Go语言编写的ORM框架。它文档......
  • 算法刷题入门线性表|单调栈
     一、概念1、栈的定义栈 是仅限在 一端 进行 插入 和 删除 的 线性表。 栈 又被称为后进先出(LastInFirstOut)的线性表,简称LIFO。2、栈顶栈 是一......