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多倍速度

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

相关推荐
fai厅的秃头姐!1 小时前
OpenCV实战篇
人工智能·opencv·计算机视觉
TMT星球2 小时前
虎鲸文娱春苗编剧计划全面升级,已孵化20个剧本进入前期开发
大数据·人工智能
奔跑中的小象8 小时前
统信UOS + 天数AI卡部署SGLang服务手册
人工智能·uos·sglang·天数智芯
DevSecOps选型指南8 小时前
中国版Mythos,为何是悬镜安全灵脉CodeAI?
人工智能·安全
Shockang8 小时前
LangGraph 状态机实战
人工智能
刹那芳华19929 小时前
循环神经网络的从零开始实现(RNN)
人工智能·rnn·深度学习
阿童木写作9 小时前
跨境图片翻译工具多合一,批量图片视频字幕翻译加智能抠图
人工智能·python·音视频·语音识别
科技之门9 小时前
AI3D从建模到贴图、绑骨和动画的完整流程怎么做?V2Fun完整工作流指南
人工智能·3d·贴图
宇宙第一小趴菜9 小时前
二、机器学习的应用领域和发展史
人工智能·机器学习
前端开发江鸟9 小时前
我写过 MCP Server,却一直以为 MCP 只有 Tool
人工智能