您的位置:首页 > 运维架构

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

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



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

贴一下简单用于的代码:

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);
}运行结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: