影象處理技術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)