C#中OpenCVSharp實現輪廓檢測
阿新 • • 發佈:2020-11-18
OpenCv提供了函式 findContours()用於對物體輪廓進行檢測,該函式實現演算法是由S.suzuki K.Abe於1985年發表的。OpenCVSharp封裝了這個函式,有2個引數(contours,hierarchy)要做特別的說明。
public static void FindContours(InputOutputArray image,out Point[][] contours,out HierarchyIndex[] hierarchy,RetrievalModes mode,ContourApproximationModes method,Point? offset = null);
解析:contours 的型別是Point[][],它相當於OpenCV中的Vector<Vector<Point>> contours
,儲存多個輪廓,每個輪廓是由若干個點組成,可以在該函式前宣告Point[][] contours;
,在C#中沒有賦值的變數在用的時候是不允許的,因為它是輸出的結果,可以不需要給它new空間,但必須在函式的引數中宣告是out;引數hierarchy為包含影象拓撲結構的資訊,它是HierarchyIndex[]型別,這是輸入的結果,同樣要在函式的引數中宣告為out。具體程式碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using OpenCvSharp; using OpenCvSharp.Extensions; namespace OpenCvSharp_03 { class Program { static void Main(string[] args) { Mat srcImage = Cv2.ImRead(@"D:\MyData\circle.jpg"); Mat dst_Image = MyFindContours(srcImage); Cv2.ImShow("srcImage:",srcImage); Cv2.ImShow("contours",dst_Image); Cv2.WaitKey(); } public static Mat MyFindContours(Mat srcImage) { //轉化為灰度圖 Mat src_gray = new Mat(); Cv2.CvtColor(srcImage,src_gray,ColorConversionCodes.RGB2GRAY); //濾波 Cv2.Blur(src_gray,new Size(3,3)); //Canny邊緣檢測 Mat canny_Image = new Mat(); Cv2.Canny(src_gray,canny_Image,100,200); //獲得輪廓 Point[][] contours; HierarchyIndex[] hierarchly; Cv2.FindContours(canny_Image,out contours,out hierarchly,RetrievalModes.Tree,ContourApproximationModes.ApproxSimple,new Point(0,0)); //將結果畫出並返回結果 Mat dst_Image = Mat.Zeros(canny_Image.Size(),srcImage.Type()); Random rnd = new Random(); for (int i = 0; i < contours.Length; i++) { Scalar color = new Scalar(rnd.Next(0,255),rnd.Next(0,255)); Cv2.DrawContours(dst_Image,contours,i,color,2,LineTypes.Link8,hierarchly); } return dst_Image; } } }
我封裝好了MyFindContours()這個函式,方便大家呼叫進行測試
測試結果如下:
到此這篇關於C#中OpenCVSharp實現輪廓檢測的文章就介紹到這了,更多相關C# OpenCVSharp輪廓檢測內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!