本文共 1620 字,大约阅读时间需要 5 分钟。
在图像处理领域,轮廓的凸包提取是一个常见但重要的操作。凸包能够有效地简化复杂的轮廓形状,使其更易于分析和处理。OpenCV 提供了强大的工具来实现这一点,通过 convexHull 函数可以快速找到任意轮廓的凸包。
凸包是指能够包围一个凸多边形的最小面积壳层。对于一个给定的轮廓,其凸包是所有可能的外壳中表面积最小的那个。通过凸包,我们可以简化轮廓形状,去除非必要的拐角和细节,得到一个最小的包围形状。
OpenCV 提供了 convexHull 函数来实现凸包提取。该函数接收以下参数:
points:输入点集,可以是 vector<Point> 或 Mat 类型。hull:输出凸包点集。clockwise:指定凸包的方向,默认为 false。returnPoints:忽略该参数,因为我们只需要点集。函数的大致流程如下:
hull。contours,对每个轮廓调用 convexHull 函数。hull 中。以下是一个使用 convexHull 函数的完整示例:
// 克隆源图像Mat src_copy = src.clone();Mat threshold_output;vectorcontours;vector hierarchy;// 阈值检测threshold(src_gray, threshold_output, thresh, 255, THRESH_BINARY);// 检测轮廓findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));// 初始化凸包点集vector > hull(contours.size());// 遍历每个轮廓for (int i = 0; i < contours.size(); i++) { convexHull(Mat(contours[i]), hull[i], false);}// 绘制轮廓和凸包Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);for (int i = 0; i < contours.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(drawing, contours, i, color, 1, 8, vector (), 0, Point()); drawContours(drawing, hull, i, color, 1, 8, vector (), 0, Point());}namedWindow("Hull demo", CV_WINDOW_AUTOSIZE);imshow("Hull demo", drawing);
在绘制轮廓和凸包时,使用 drawContours 函数可以清晰地显示两者之间的差异。通过给每个轮廓分配不同的颜色,可以更直观地比较原轮廓和其凸包的形状。
通过 OpenCV 的 convexHull 函数,可以轻松地从任意轮廓中提取其凸包。该函数强大且灵活,适用于多种实际场景。通过合理使用该函数,可以显著简化轮廓分析过程,提高图像处理效率。
转载地址:http://bwpfk.baihongyu.com/