Convex hull concept:
The smallest convex polygon containing all points in the point set S is called the convex hull
API
public static Point[] ConvexHull(IEnumerable<Point> points, bool clockwise = false);
Parameters:
points: the found contour
clockwise: indicates the direction of the convex hull, true clockwise or false counterclockwise
Return result: the found convex hull
Demo
private Mat inputMat;
private Mat outMat;
private Mat displayMat;
if (fileDialog.ShowDialog() == DialogResult.OK)
{
picFile = fileDialog.FileName;
inputMat = Cv2.ImRead(picFile, ImreadModes.Grayscale);
displayMat = Cv2.ImRead(picFile, ImreadModes.AnyColor);
outMat = new Mat(new Size(inputMat.Cols, inputMat.Rows), inputMat.Type());
//二值化
Cv2.Threshold(inputMat, outMat, 232, 255, ThresholdTypes.BinaryInv);
//查找轮廓
Cv2.FindContours(outMat, out OpenCvSharp.Point[][] contours, out HierarchyIndex[] outputArray, RetrievalModes.External, ContourApproximationModes.ApproxNone);
//根据轮廓大小建立凸包
Point[][] hull = new Point[contours.Length][];
for (int i = 0; i < contours.Length; i++)
{
//查找凸包
hull[i] = Cv2.ConvexHull(contours[i], false);
}
Scalar color = new Scalar(0, 0, 255);
for (int i = 0; i < hull.Length; i++) //contours.Length
{
//绘制凸包
Cv2.DrawContours(displayMat, hull, (int)i, color, 3, LineTypes.Link8, outputArray, 2);
}
picBox_Display.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(inputMat);
picBox_After.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(displayMat);
}
Additional notes:
The OpenCV library used in .NET in this case is OpenCvSharp4