1. 程式人生 > 其它 >影象處理技術OpencvSharp入門

影象處理技術OpencvSharp入門

目錄

第一部分 初識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)