opencv 轮廓内点集高速获取

一、理论

获取opencv中轮廓的内部所有点,opencv有现成的函数判断点是否在轮廓内,但轮廓比较大的时候,直接调用pointPolygonTest速度会很慢。

我们可以通过扫描线的方式逐行对轮廓点进行遍历,获取穿过某一行的两个x值,这两个x值之间的点就都在轮廓内。

二、代码逻辑

低速版

cpp 复制代码
static std::vector<cv::Point> getPointsInsideContour(const std::vector<cv::Point>& contour)
{
	try {

		std::vector<cv::Point> points;
		if (contour.empty()) return points;

		// 1. 获取包围盒
		cv::Rect rect = cv::boundingRect(contour);
		int yMin = rect.y;
		int yMax = rect.y + rect.height;
		//points.reserve(rect.width * rect.height);

		// 2. 逐行扫描
		for (int y = yMin; y < yMax; ++y)
		{
			for (int x = rect.tl().x; x < rect.br().x; x++)
			{
				Point p(x, y);
				if (pointPolygonTest(contour, p, false) >= 0)
				{
					points.push_back(p);
				}
			}
		}

		return points;
	}
	catch (std::exception& ex)
	{
		throw std::runtime_error(ex.what());
	}

}

高速版

1.同样获取轮廓的外接矩形

2.逐行对轮廓进行扫描

3.遍历轮廓点,判断轮廓的上一个点和下一个点是否存在穿过该行的行为

4.若存在,则保存起来对应的x值;对某行保存的x值进行排序,按照两两配对的方式获取这条填充线段

三、效果

debug版本下,轮廓点集1000W个点时,高速版是低速版的30多倍速度

获取源码请私信,可指导配置技术交流

相关推荐
大模型实验室Lab4AI几秒前
KNOWLEDGE IS NOT STATIC: ORDER-AWARE HYPERGRAPH RAG FOR LANGUAGE MODELS(论文解读)
人工智能·语言模型·自然语言处理
JEECG低代码平台1 分钟前
2026年AI编码CLI工具终极对比:Claude Code、Cursor、Gemini CLI、Codex CLI、Copilot CLI
人工智能·copilot
多年小白4 分钟前
DeepSeek V4 全面换装华为昇腾 950PR
网络·人工智能·科技·深度学习·ai
算.子5 分钟前
【Spring AI 实战】六、RAG文档 ETL 实战:PDF/Word/Markdown 解析与文本分割
人工智能·spring·etl
道可云5 分钟前
AI正在改变一切!园区举办AI智能体主题沙龙
人工智能
lulu12165440786 分钟前
Claude Opus 4.7有哪些重大升级?软件工程和视觉能力全面解析
java·人工智能·python·软件工程·ai编程
笃℃6 分钟前
【多模态大语言模型】Qwen-VL 系列解读,持续更新中。。。
人工智能·语言模型·自然语言处理
ar01239 分钟前
AR航空装配:赋能航空航天制造的智能化转型
人工智能·ar
七夜zippoe9 分钟前
OpenClaw 定时任务与 Cron 调度:自动化运维的智能引擎
运维·人工智能·自动化·cron·openclaw
动恰客流管家11 分钟前
动恰3DV3丨客流统计系统:工业农业文旅类景区智慧客流解决方案
大数据·人工智能·3d