外接矩形
外接最小面积矩形(旋转矩形)
外接闭合圆形
外接三角形
外接多边形(凸包检测)
//多边形包围
private void btn_surround_Click(object sender, EventArgs e)
{
if (ib_original.Image != null)
{
Mat src = new Image<Bgr, byte>(ib_original.Image.Bitmap).Mat;
Mat dst = new Mat();
Image<Bgr, byte> img = new Image<Bgr, byte>(ib_original.Image.Bitmap);
CvInvoke.Canny(src, dst, 120, 180);
//创建用于存储轮廓的VectorOfVectorOfPoint数据类型
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
CvInvoke.FindContours(dst, contours, null, Emgu.CV.CvEnum.RetrType.External,
Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
//获取联通区域个数
int ksize = contours.Size;
for (int i = 0; i < ksize; i++)
{
//获取独立的连通轮廓
VectorOfPoint contour = contours[i];
string str = ((Button)sender).Text;
switch (str)
{
case "外接矩形":
{
Rectangle rect = CvInvoke.BoundingRectangle(contour);
img.Draw(rect, new Bgr(0, 0, 255), 2);
}
break;
case "外接面积最小矩形":
{
RotatedRect rrect = CvInvoke.MinAreaRect(contour);
img.Draw(rrect, new Bgr(0, 0, 255), 2);
}
break;
case "外接闭合圆形":
{
CircleF circle = CvInvoke.MinEnclosingCircle(contour);
img.Draw(circle, new Bgr(0, 0, 255), 2);
}
break;
case "外接三角形":
{
VectorOfPoint tri = new VectorOfPoint();//存储三角形
double area = CvInvoke.MinEnclosingTriangle(contour, tri);
img.Draw(tri.ToArray(), new Bgr(0, 0, 255), 2);
}
break;
case "外接多边形":
{
//也叫凸包检测
VectorOfPoint hull = new VectorOfPoint();//存储凸包点
CvInvoke.ConvexHull(contour, hull);
img.Draw(hull.ToArray(), new Bgr(0, 0, 255), 2);
}
break;
default:
break;
}
}
ib_result.Image = img;
}
}