private Mat FindContoursAndDraw(Bitmap originalMap, string objectName, int minArea = 500, int maxArea = 10000) { //var houghBitmap = HoughTransform(originalMap); //var invertedHoughBitmap = InvertImage(houghBitmap); Mat originalMat = BitmapConverter.ToMat(originalMap); //Mat invertedHoughMat = BitmapConverter.ToMat(invertedHoughBitmap); Mat blackWhiteMat = new Mat(); Mat edgesMat = new Mat(); Cv2.CvtColor(originalMat, blackWhiteMat, ColorConversionCodes.BGRA2GRAY); if (MapObjectsColors.GetInstance().Tight.Contains(objectName)) { Bitmap edgesMap = BitmapConverter.ToBitmap(blackWhiteMat); edgesMap = ImageFilter.SobelFilter(edgesMap, grayscale: true); edgesMat = BitmapConverter.ToMat(edgesMap); Cv2.CvtColor(edgesMat, edgesMat, ColorConversionCodes.BGRA2GRAY); } else { Cv2.Canny(blackWhiteMat, edgesMat, 50, 100); } OpenCvSharp.Point[][] contours; HierarchyIndex[] hierarchyIndexes; Cv2.FindContours( edgesMat, out contours, out hierarchyIndexes, mode: RetrievalModes.CComp, method: ContourApproximationModes.ApproxSimple); var componentCount = 0; var contourIndex = 0; var objectDict = mapObjects.getObjectDictionary(); if (contours.Length != 0) { if (objectDict.ContainsKey(objectName)) { objectDict[objectName] = contours; } else { objectDict.Add(objectName, contours); } while ((contourIndex >= 0)) { var contour = contours[contourIndex]; var boundingRect = Cv2.BoundingRect(contour); var boundingRectArea = boundingRect.Width * boundingRect.Height; var ca = Cv2.ContourArea(contour) * Convert.ToDouble(scaleBox.SelectedItem) / 100; var cal = Cv2.ArcLength(contour, closed: true) * Convert.ToDouble(scaleBox.SelectedItem) / 100; //if (boundingRectArea > minArea) //{ Cv2.PutText(originalMat, $"A:{ca.ToString("#.##")} km2", new OpenCvSharp.Point(boundingRect.X, boundingRect.Y + 10), HersheyFonts.HersheyPlain, 1, Scalar.White, 1); Cv2.PutText(originalMat, $"L:{cal.ToString("#.##")} km", new OpenCvSharp.Point(boundingRect.X, boundingRect.Y + 25), HersheyFonts.HersheyPlain, 1, Scalar.White, 1); //} //Cv2.DrawContours( // originalMat, // contours, // contourIndex, // color: Scalar.All(componentCount + 1), // thickness: -1, // lineType: LineTypes.Link8, // hierarchy: hierarchyIndexes, // maxLevel: int.MaxValue); componentCount++; contourIndex = hierarchyIndexes[contourIndex].Next; } } return(originalMat); }