private void AutoCrop(string path) { using var image = new Image <Bgr, byte>(path); // Grayscale var grayScaleImage = image.Convert <Gray, byte>(); // Applying GaussianBlur var blurredImage = grayScaleImage.SmoothGaussian(5, 5, 0, 0); // OR CvInvoke.GaussianBlur(grayScaleImage, blurredImage, new Size(5, 5), 0); // Applying Canny algorithm var cannyImage = new UMat(); CvInvoke.Canny(blurredImage, cannyImage, 50, 150); // Finding largest contours var contours = new VectorOfVectorOfPointF(); CvInvoke.FindContours(cannyImage, contours, null, RetrType.Tree, ChainApproxMethod.ChainApproxSimple); for (int i = 0; i < contours.Size; i++) { var contourVector = contours[i]; using var contour = new VectorOfPoint(); var peri = CvInvoke.ArcLength(contourVector, true); CvInvoke.ApproxPolyDP(contourVector, contour, 0.1 * peri, true); if (contour.ToArray().Length == 4 && CvInvoke.IsContourConvex(contour)) { Debug.WriteLine(contour.ToString()); // return contour; } } }