0035-OpenCV环境下绘制轮廓的外接多边形、最小立式矩形、最小外接圆

本文介绍了OpenCV中用于图像处理的三个关键函数:approxPolyDP用于计算点集的外接多边形,boundRect用于获取最小立式矩形,而minEnclosingCircle则用于找到点集的最小外接圆。每个函数的C++原型和参数含义进行了详细解释,包括曲线近似参数epsilon、封闭性标志以及矩形和圆的几何属性。通过示例代码,读者可以了解如何应用这些函数进行实际操作。

OpenCV提供了函数approxPolyDP()、boundRect()、minEnclosingCircle()分别计算给定点集的外接多边形,最小立式矩形和最小外接圆,下面分别给出这三个函数的原型和参数意义

approxPolyDP函数(计算外接多边形):
C++: void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)
参数意义:
curve:待求解的点集。
approxCurve:求解得到的外接多边形点集。
epsilon:近似程度的参数。这个参数表示曲线与估计之间的最大距离。
closed:曲线是否封闭,如果值为true,表示曲线是封闭的;如果值为false,表示曲线不是封闭的。

boundRect函数(计算最小立式矩形):
C++: Rect boundingRect(InputArray points)

只有一个参数,参数 points的意义是一组点集,这个函数求这组点集的最小立式矩形

minEnclosingCircle函数(计算最小外接圆):
C++: void minEnclosingCircle(InputArray points, Point2f& center, float& radius)
参数意义
points:待求解的点集。
center:外接圆的圆点。
radius:外接圆的半径。 使用示例代码如下
代码中用到的图像下载链接:https://pan.baidu.com/s/1i5EgljZ 密码:dv2i

图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!

//opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>    
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>

#include <iostream>

using namespace cv;
using namespace std;

int main()
{

        Mat image = imread("38.jpg");

        namedWindow("原图");
        imshow("原图", image);

        cvtColor(image, image, CV_BGR2GRAY);

        vector<vector<Point>> contours;
        vector<Vec4i> hierarchy;
        // 轮廓检测 
        findContours(image, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

        // 绘制轮廓
        Mat result(image.size(), CV_8UC3, Scalar(0));
        drawContours(result, contours, -1, Scalar(255,255,255), 1);

        Mat result_PolyDP = result.clone();
        Mat result_boundingRect = result.clone();
        Mat result_Circle = result.clone();


        //conPoint存储计算得到的外接多边形
        vector<vector<Point> > conPoint(contours.size());

        //boundRect存储计算得到的最小立式矩形
        vector<Rect> boundRect(contours.size());

        //center和radius存储计算得到的最小外接圆
        vector<Point2f>center(contours.size());
        vector<float>radius(contours.size());

        for (int i = 0; i < contours.size(); i++)
        {
                // 计算外接多边形
                approxPolyDP(Mat(contours[i]), conPoint[i], 3, true);
                // 计算最小外接立式矩形
                boundRect[i] = boundingRect(Mat(conPoint[i]));
                //计算最小外接圆
                minEnclosingCircle(conPoint[i], center[i], radius[i]);
        }

        for (int i = 0; i< contours.size(); i++)
        {
                Scalar color = Scalar(0, 0, 255);
                //绘制外接多边形
                drawContours(result_PolyDP, conPoint, i, color, 2, 8, vector<Vec4i>(), 0, Point());
                // 绘制最小外接立式矩形
                rectangle(result_boundingRect, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0);
                // 绘制最小外接圆
                circle(result_Circle, center[i], (int)radius[i], color, 2, 8, 0);
        }

        namedWindow("轮廓图");
        imshow("轮廓图", result);

        namedWindow("PolyDP");
        imshow("PolyDP", result_PolyDP);

        namedWindow("boundingRect");
        imshow("boundingRect", result_boundingRect);

        namedWindow("Circle");
        imshow("Circle", result_Circle);

        waitKey();
        return 0;
}


运行截图如下


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值