这个函数用来计算 轮廓的周长 或者 曲线的长度。
- double cv::arcLength
- (
- InputArray curve,
- bool closed
- )
| curve | 计算对象(轮廓 或者 图形的顶点) |
| closed | 标识符(曲线是否闭合,一般为true) |
- #include "widget.h"
- #include "ui_widget.h"
-
- #include <opencv2/core/core.hpp>
- #include <opencv2/highgui/highgui.hpp>
- #include <opencv2/imgproc/imgproc.hpp>
-
- #include <vector>
- #include <QDebug>
-
-
- using namespace cv;
- using namespace std;
-
-
-
- Widget::Widget(QWidget *parent)
- : QWidget(parent)
- , ui(new Ui::Widget)
- {
- ui->setupUi(this);
-
- //生成画板
- Mat mat = Mat::zeros(500,500,CV_8UC1);
-
- //构造点
- Point2f a(100,100);
- Point2f b(400,100);
- Point2f c(400,400);
- Point2f d(100,400);
- //生成轮廓
- vector<Point> contour_rec;
- contour_rec.push_back(a);
- contour_rec.push_back(b);
- contour_rec.push_back(c);
- contour_rec.push_back(d);
- //计算矩形的周长
- double len_rec = cv::arcLength(contour_rec,true);
- //打印
- qDebug()<<"矩形的周长:"<<len_rec;
-
- //绘制圆
- Point center(mat.size().width/2,mat.size().height/2);
- circle(mat,center,150,255,-1);
- //获取轮廓
- vector<vector<Point>> contours_cir;
- findContours(mat,contours_cir,RETR_EXTERNAL,CHAIN_APPROX_TC89_KCOS );
- //计算圆的周长
- double len_cir = cv::arcLength(contours_cir[0],true);
- //打印
- qDebug()<<"圆的周长:"<<len_cir;
- qDebug()<<"数量:"<<contours_cir.size();
-
- //显示
- imshow("mat",mat);
-
- }
-
- Widget::~Widget()
- {
- delete ui;
- }

测试过程中发现,用函数 findContours() 生成 contours ,周长的计算结果,与理论计算值相比较,存在偏差。
通过修改参数 method 的值,反复测试和比较,发现值为 CHAIN_APPROX_TC89_KCOS 时,偏差最小。