【opencv学习之三十三】轮廓特征应用:凸包

本文通过简单易懂的方式介绍了凸包的概念,并提供了一个基于OpenCV的轮廓检测实例。该实例展示了如何从图片中提取轮廓,并计算这些轮廓的凸包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

凸包这个概念学术上讲的比较深,通俗简单来说(当然不太准确)就是轮廓最外侧点的连线形成的区域结果,例如下面样子:


外面红色轮廓就是凸包的结果:

贴一下简单用于的代码:

void imgConvex()//25.轮廓凸包
{
    Mat img=imread("D:/ImageTest/convex.png");//加载图片
    Mat dst;
    cv::cvtColor(img,img,COLOR_RGB2GRAY);//进行,灰度处理
    //阈值分割
    threshold( img,                 //输入图像,原始数组 (单通道 , 8-bit of 32-bit 浮点数).
               dst,                          //输出图像,输出数组,必须与 src 的类型一致,或者为 8-bit.
               200,                           //分割值
               255,                         // 使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值.
               THRESH_BINARY_INV ); //阈值类型,opencv认为白色部分为被分割出来的部分
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(dst,contours,hierarchy,RETR_CCOMP, CHAIN_APPROX_SIMPLE,Point());//所有轮廓CV_CHAIN_APPROX_SIMPLE
    //    findContours返回为vector<vector<Point> >的轮廓向量
    vector<vector<Point> >hull( contours.size() );
    for( size_t i = 0; i < contours.size(); i++ )
    {   
        convexHull( Mat(contours[i]), hull[i], false ); 
    }    
    //    void cv::convexHull (   InputArray  points,
    //                            OutputArray     hull,
    //                            bool    clockwise = false,
    //                            bool    returnPoints = true  )
    //          points:输入的二维点集,Mat类型数据即可 
    //          hull:输出参数,用于输出函数调用后找到的凸包 
    //          clockwise:操作方向,当标识符为真时,输出凸包为顺时针方向,否则为逆时针方向。 
    //           returnPoints:操作标识符,默认值为true,此时返回各凸包的各个点,否则返回凸包
    //    各点的指数,当输出数组时std::vector时,此标识被忽略。
    
    Mat drawing = Mat::zeros( img.size(), CV_8UC3 );
    for( size_t i = 0; i< contours.size(); i++ )
    {
        Scalar color( (rand()&255), (rand()&255), (rand()&255) );//随机产生颜色 rand()产生随机数
        drawContours( drawing, contours, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );
        drawContours( drawing, hull, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );
    }
    imshow("srcImg", img);
    imshow("convex",drawing);
    waitKey(0);
}
运行结果如下:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值