8.3 使用多边形将轮廓包围
8.3.1 将轮廓包围的多边形函数
1.返回外部边界:boundingRect()函数
(1)作用:返回指定点集最外面的边界矩形(四个顶点)
(2)函数原型:Rect boundingRect(InputArray points)
2.寻找最小包围矩形:minAreaRect()函数
(1)作用:返回指定点集可旋转的最小面积的包围矩形(四个顶点)
(2)函数原型:RotatedRect minAreaRect(InputArray points)
3.寻找最小包围圆形:minEnclosingCircle()函数
(1)作用:利用一种迭代算法,返回指定点集的最小面积的包围圆形(圆心,半径)
(2)函数原型:void minEnclosingCircle(InputArray points, Point2f& center, float& radius)
(3)参数说明:输入二维点集,输出圆心,输出半径
4.用椭圆拟合二维点集:fitEllipse()函数
(1)作用:椭圆拟合二维点集
(2)函数原型:RotatedRect fitEllipse(InputArray points)
5.逼近多边形曲线:approxPolyDP()函数
(1)作用:用指定精度逼近多边形曲线
(2)函数原型:void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
(3)参数说明:
1)输入的二维点集
2)多边形逼近的结果
3)逼近的精度,为原始曲线和近似曲线间的最大值
4)取真时,近似的曲线为封闭曲线,取假时不封闭
8.3.2 综合示例
1.随机生成彩色点,调用多边形包围函数
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
//初始化变量和随机值
Mat image(600, 600, CV_8UC3);
Mat dstImage1, dstImage2, dstImage3, dstImage4;
RNG& rng = theRNG();
//循环,按下ESC键程序退出,否则一直更新
while (1)
{
//参数初始化
int count = rng.uniform(3, 103);//随机生成点的数量
vector<Point> points;//点值
//随机生成点坐标
for (int i = 0; i < count; i++)
{
Point point;
point.x = rng.uniform(image.rows / 4, image.rows * 3 / 4);
point.y = rng.uniform(image.cols / 4, image.cols * 3 / 4);
points.push_back(point);
}
//绘制出随机颜色的点
image = Scalar::all(0);
for (int i = 0; i < count; i++)
{
circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(