// 包含opencv2的图像处理和图形用户界面库
//include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
// 使用opencv和标准命名空间中的对象和函数
using namespace cv;
using namespace std;
// 定义一个帮助函数,解释程序如何被调用
static void help(char** argv)
{
cout << "\nThis sample program demonstrates the use of the convexHull() function\n"
<< "Call:\n"
<< argv[0] << endl;
}
// 程序的主入口点
int main( int argc, char** argv )
{
// 解析命令行参数
CommandLineParser parser(argc, argv, "{help h||}");
// 如果请求帮助,则调用help函数并退出程序
if (parser.has("help"))
{
help(argv);
return 0;
}
// 创建一个空白图像
Mat img(500, 500, CV_8UC3);
// 获取随机数生成器的引用
RNG& rng = theRNG();
// 无限循环直到用户终止
for(;;)
{
// 随机确定点的数量
int i, count = (unsigned)rng%100 + 1;
// 创建一个点的向量
vector<Point> points;
// 在图像内随机生成点,并将其添加到向量中
for( i = 0; i < count; i++ )
{
Point pt;
pt.x = rng.uniform(img.cols/4, img.cols*3/4);
pt.y = rng.uniform(img.rows/4, img.rows*3/4);
points.push_back(pt);
}
// 创建一个用于存储凸包的点的向量
vector<Point> hull;
// 计算点集的凸包
convexHull(points, hull, true);
// 将图像背景设置为黑色
img = Scalar::all(0);
// 在图像中用红色绘制所有点
for( i = 0; i < count; i++ )
circle(img, points[i], 3, Scalar(0, 0, 255), FILLED, LINE_AA);
// 使用绿色线条在图像中画出凸包
polylines(img, hull, true, Scalar(0, 255, 0), 1, LINE_AA);
// 显示窗口
imshow("hull", img);
// 等待用户按键,如果是‘ESC’、‘q’或‘Q’则退出循环
char key = (char)waitKey();
if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
break;
}
// 程序结束返回0
return 0;
}
这段代码是一个用C++编写的opencv应用程序。其功能是随机生成一些点,然后计算这些点的凸包并显示出来。用户可以不断生成新的点集和凸包,直到按下'ESC'、‘q’或‘Q’键退出程序。程序主体部分包括了创建一系列随机点,计算这些点的凸包并且绘制这些点和凸包。这样能够帮助用户可视化了解凸包在几何图形处理过程中的作用。
The End