OpencvSharp入門學(xué)習(xí)

OpencvSharp筆記???Mat:矩陣
??
using OpenCvSharp;
一:加載圖像文件
//加載圖像,返回Mat對象,fileName為圖像的路徑+名字
Mat?img = CV2.ImRead(fileName , ImreadModes.Color);???//加載為彩色圖像,結(jié)果是三通道
Mat?img = CV2.ImRead(fileName , ImreadModes.Grayscale);???//加載為灰度圖像,結(jié)果是單通道
Mat?img = CV2.ImRead(fileName , ImreadModes.AnyColor);???//加載任意圖像,結(jié)果隨圖像,原圖為幾通道就是幾通道
二:顯示圖像文件
CV2.ImShow("窗口名稱", img);???//img是將要顯示的Mat對象,此處顯示Mat對象必須是BGR格式,其他像素格式需要轉(zhuǎn)回BGR格式再顯示
CV2.WaitKey();???//用于CV2.ImShow的等待。沒有此句則立即執(zhí)行下一行代碼
三:顏色轉(zhuǎn)換??ColorConversionCodes是枚舉
Mat img = CV2.ImRead(fileName , ImreadModes.Color); //加載彩色圖像
Mat gray = new Mat();
CV2.CvtColor(img , gray , ColorConversionCodes.BGR2GRAY); //將img圖像轉(zhuǎn)為灰度圖格式
Mat hsy = new Mat();
CV2.CvtColor(img , hsy , ColorConversionCodes.BGR2HSV); //將BGR格式轉(zhuǎn)為HSV格式
四:尺寸調(diào)整
Mat?result = new Mat();
CV2.Resize(img , result , new OpenCvSharp.Size(100,100)); //括號內(nèi)100,100?為像素大小
CV2.Resize(img , result , new OpenCvSharp.Size(0,0),2,2); //若括號內(nèi)為0,0?則表示用外面的2,2?意思是放大倍數(shù)
//CV2.Resize方法有多個(gè)重載
五:二值化
Mat?gray = new Mat();
CV2.CvtColor(img , gray , ColorConversionCodes.BGR2GRAY); //轉(zhuǎn)為灰度圖
Scalar scalar = CV2.Mean(gray); //計(jì)算灰度圖平均值
CV2.Threshold(gray , gray , scalar.va10 , 255 , ThreshoidTypes.Binary); //二值化(即黑白二色)?
六:四則運(yùn)算?注:不可以單通道圖和多通道圖相運(yùn)算,只能:單通道與單通道,多通道與多通道運(yùn)算
CV2.BitwiseAnd?//與運(yùn)算
CV2.BitwiseNot?//取反運(yùn)算
CV2.BitwiseOr?//或運(yùn)算
CV2.BitwiseXor?//異或運(yùn)算
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
//見截圖,桌面 yansefenge
八:直線檢測
CV2.ImShow("haha",img);
Mat gray = ConvertToBlackBinary(img); //二值化
CV2.ImShow("二值化",gray);
var?kenal3 = CV2.GetStructuringElement(MorphShapes.Rect , new OpenCvSharp.Size(2,2));?// 腐蝕
CV2.Dilate(gray , gray , kenal3);?//膨脹
CV2.ImShow("二值化Dilate" , gray);
CV2.Canny(gray , gray , 50 , 150);?//找輪廓
CV2.ImShow("Canny" , gray);
var lines = CV2.HoughLinesP(gray , 1 , Math.PI/180 , 100 , 250 , 50); //劃線
if(lines.Length>0)
?{
??for(int i=0 ; i<lines.Length ; i++)
????{
?????CV2.Line(img , lines[i].P1 , lines[i].P2 , new Scalar(255 , 0 , 0) , 1 , LineTypes.AntiAlias);
????}
?}
CV2.ImShow("結(jié)束" , img);
return img;