approxPolyDP()函数介绍
OpenCV中的approxPolyDP()
函数用于对形状进行逼近,以减少多边形的顶点数,可以用于对图像轮廓点进行多边形拟合。
函数原型如下:
void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed );
其中,
curve
是输入的点集,类型为InputArray,
可以是Mat
、vector<Point>
等;
approxCurve是输出的点集,类型为OutputArray,
也是Mat
类型;
epsilon
是精度,类型为double;
closed
是一个布尔值,表示是否闭合多边形。
使用场景
在计算机视觉和图像处理中,approxPolyDP()
函数用于对图像轮廓点可以进行多边形拟合,用于检测和识别形状。
使用案例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 读取灰度图像
Mat src = imread("./simple_chart.png");
if (src.empty())
{
cout << "无法读取图像" << endl;
return -1;
}
imshow("原图", src);
waitKey(0);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("灰度图", gray);
waitKey(0);
// 二值化图像
Mat binary;
threshold(gray, binary, 50, 255, THRESH_BINARY);
imshow("二值化图", binary);
waitKey(0);
// 查找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
cout << "发现轮廓的数量:" << contours.size() << endl;
// 绘制轮廓
for (size_t i = 0; i < contours.size(); ++i)
{
auto contour = contours[i];
vector<Point> approx;
approxPolyDP(contour, approx, arcLength(contour, true) * 0.02, true);
// 根据顶点数量判断形状
// 如果为4,则为矩形或者正方形
if (approx.size() == 4)
{
Rect rect = boundingRect(approx);
rectangle(src, rect, Scalar(255, 255, 255), 2);
// 判断是不是正方形
if (((rect.width-rect.height)/(double) rect.height) <=0.02){
cout << "这是正方形" << endl;
}
}
// 如果为3,则为三角形
else if(approx.size()== 3){
drawContours(src, contours, i, Scalar(255, 255, 0), 2);
}
// 如果其他形状,比如圆,复杂多边形等
else{
drawContours(src, contours, i, Scalar(255, 0, 255), 2);
}
}
// 显示结果
imshow("轮廓绘制", src);
waitKey(0);
return 0;
}
原图:
灰度图:
二值化图:
轮廓图:
文章来源:https://www.toymoban.com/news/detail-839680.html
结论
在计算机视觉和图像处理中,approxPolyDP()
函数用于对图像轮廓点可以进行多边形拟合,用于检测和识别形状。另外在图像分割、目标跟踪和机器人导航等领域,通过减少多边形的顶点数,可以提高算法的效率和准确性。文章来源地址https://www.toymoban.com/news/detail-839680.html
到了这里,关于[C++] opencv - approxPolyDP(多边形拟合)函数介绍和使用场景的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!