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;
}
运行截图如下:

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

被折叠的 条评论
为什么被折叠?



