8.2 寻找物体的凸包
8.2.1 概念
1.给定二维平面上的点集,将最外层点连接起来构成的凸多边形。
2.理解物体形状或轮廓的一种比较有用的方法是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)例如,图中A-H区域是凸包的各个”缺陷”:
3.函数:convexHull()函数
4.函数原型:
void convexHull(InputArray points,OutputArray hull,bool clockwise=false, bool returnPoints=true)
5.参数说明:
(1)输入的二维点集,Mat类型或std::vector
(2)输出参数,找到的凸包,返回的hull是points中点的索引
(3)操作方向标识符,为真时输出凸包为顺时针方向,否则逆时针
(4)操作标识符,默认true,标志为真时函数返回各凸包的各个点,否则返回凸包各点的指数,输出数组是std:vector时此标志忽略
8.2.2 示例程序
1. 凸包检测基础
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
//初始化变量和随机值
Mat image(600, 600, CV_8UC3);
RNG& rng = theRNG();
//循环,按下ESC退出程序,否则有键按下便一直更新
while (1)
{
//参数初始化
char key;
int count = (unsigned)rng % 100 + 3;//随机生成点的数量
vector<Point>points;//点值
//随机生成点坐标
for (int i = 0; i < count; i++)
{
Point point;
point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);
point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);
points.push_back(point);
}
//检测凸包
vector<int>hull;
convexHull(Mat