这段代码的作用是实现一个多边形扩展(膨胀)算法,并使用 OpenCV 库将原始多边形及其扩展结果可视化。下面对代码进行详细解释:
主要功能
- 输入一个已排序的多边形:程序首先定义了一个有序的点集(多边形的顶点),这些点按逆时针顺序排列。
- 计算每条边的法向量:通过对每条边进行操作,计算出单位法向量,用于之后的扩展计算。
- 根据设定的安全线距离(SAFELINE)进行扩展:在每个顶点处,根据相邻边的法向量方向生成新的顶点,形成一个扩展后的多边形。
- 显示结果:通过 OpenCV 可视化原始和扩展后的多边形。
详细解释
头文件包含
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <eigen3/Eigen/Eigen>
- 包含 OpenCV 的核心功能、图像处理和高层界面模块,用于图像显示和绘制图形。
expand_polygon
函数
void expand_polygon(vector<Point> &pList, vector<Point> &out)
- 接收一个顶点列表
pList
和一个输出列表out
,用于存储扩展后的顶点。
步骤解析:
计算单位法向量:
- 遍历多边形的所有顶点,计算每条边(从当前顶点到下一个顶点)的方向,并归一化得到单位方向向量。这个步骤帮助理解后续操作中的朝向。
创建新顶点以实现膨胀:
- 使用给定的
SAFELINE
(例如20个像素)决定如何沿法线方向移动现有顶点位置,从而生成新顶点。这里涉及到三角函数和矢量运算,通过交叉乘积来判断旋转方向。
- 使用给定的
反转输出顺序:
- 最后,将生成的新顶点列表反转,使得它们仍然保持逆时针顺序,这样可以更好地适应 OpenCV 绘制方法。
TEST_expand_polygon
函数
int TEST_expand_polygon() {
- 用于测试
expand_polygon
函数,其步骤包括构建源多边形、调用膨胀函数以及最终显示结果。
测试步骤:
定义源多边形:
- 创建了几个固定坐标组成的二次元整数 Point 集合,用于表示多边形。例如:
points_src.push_back(Point(550,300)); //1 points_src.push_back(Point(500,500)); //2
- 创建了几个固定坐标组成的二次元整数 Point 集合,用于表示多边形。例如:
调用膨胀函数并初始化 Mat 对象用于绘制结果:
- 创建一个 1000x1000 的黑色画布(Mat 类型)。
绘制源多边形与扩展后的多个变化过程
- 使用 OpenCV 的
line()
和circle()
方法绘制原始和新的多边形式,加上文本标注便于识别。同时使用不同颜色区分原始与扩展后的图形。
- 使用 OpenCV 的
显示图像并等待用户输入关闭窗口
- 使用
imshow()
显示处理过后的图像,最后用waitKey()
等待用户按键,然后结束程序。
- 使用
主函数
int main(int argc, char **argv) {
TEST_expand_polygon();
return 0;
}
- 调用测试函数,启动整个程序流程。这是标准 C++ 程序入口,在这里会执行我们定义好的测试过程。
总结
整体上,该代码实现了对简单多边形的外部膨胀,并利用 OpenCV 将这个过程可视化。在此过程中,它展示了基本几何处理技巧,如向量运算、循环遍历等,也为初学者提供了关于如何操作二维几何体数据结构的一些实用示例。
内容由零声教学AI助手提供,问题来源于学员提问