如何让OpenCV生成特定路径的内部凸包(无参数、无形态学操作)
问题:生成包围凹区域的内部凸包(无参数、无形态学操作约束)
现有实现
我有如下代码,用于完成以下操作:
- 读取灰度掩码
- 计算轮廓
- 生成凸包并绘制到结果图像上
输入为任意形状的灰度掩码(如圆形、椭圆形、矩形等)。
cv::Mat mask = cv::imread("testdata//polar.png", cv::IMREAD_GRAYSCALE); cv::Mat result; cv::cvtColor(mask, result, cv::COLOR_GRAY2BGR); std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(mask, contours, hierarchy, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_NONE); std::vector<std::vector<cv::Point>> hull(contours.size()); for (auto i = 0; i < contours.size(); ++i) { cv::convexHull(contours[i], hull[i], false); cv::drawContours(result, hull, i, cv::Scalar(0, 0, 255), 2); } cv::imwrite("C:\\TEMP\\stackOverflowResult.png", result);
当前问题
现有代码会将内部和外部凸包都以红色绘制。从凸包的面积与原理来看,当前结果是正确的,但我需要内部凸包沿绿色路径生成——以此包围凹区域用于检测,外部凸包的结果符合预期即可。
请问在不使用形态学操作的约束下,如何让OpenCV的凸包算法生成这种绿色路径的内部凸包?需要一个无参数的解决方案。
我曾尝试过形态学操作和OpenCV的convexityDefects,这些方法在测试中能生效,但需要调参,不符合我的需求。
内容的提问来源于stack exchange,提问作者iwein
相关产品推荐
相关产品推荐

