轮廓周长

轮廓的周长也是轮廓的重要统计特性之一,虽然轮廓的周长无法直接反映轮廓区域的大小和形状

但是可以与轮廓面积结合得到关于轮廓区域的更多信息

例如,当某个区域的面积与周长的平方数的比值为1:16时,该区域为正方形

OpenCV4提供了用于轮廓周长或者曲线长度的arcLength()函数

arcLength()函数原型:

double arcLength(InputArray curve,
                 bool closed
                 )
  • curve:轮廓或者曲线的二维像素点
  • closed:轮廓或者曲线是否闭合的标志,true表示闭合

该函数能够统计轮廓周长或者曲线的长度,返回值为统计长度,单位为像素,数据类型为double

第一个参数是轮廓或者曲线的二维像素点,数据类型为vector< Point >或者Mat

第二个参数是轮廓或者曲线是否闭合的标志,true表示闭合

该函数统计的长度是轮廓或者曲线相邻两个像素点之间连线的距离,例如,在计算三角形3个顶点A、B和C构成的轮廓长度时

若该函数的第二个参数为true,那么统计的长度是三角形3边之和,即AB+BC+CA

若参数为false,那么统计的长度是由A到C这3个点之间依次连线的距离之和,即AB和BC的长度之和

示例:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
    Mat img = imread("E:\\CLion\\opencv_xin\\SG\\SG_connect.png");
    if (img.empty())
    {
        cout << "error" << endl;
        return -1;
    }
    imshow("原图",img);
    Mat gray,binary;
    cvtColor(img,gray,COLOR_BGR2GRAY);  //转化成灰度图
    GaussianBlur(gray,gray,Size(9,9),2,2);    //平滑滤波
    threshold(gray,binary,170,255,THRESH_BINARY | THRESH_OTSU); //自适应二值化
    //轮廓检测
    vector<vector<Point>> contours; //轮廓
    vector<Vec4i> hierarchy;    //存放轮廓结构变量
    findContours(binary,contours,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE,Point());
    //输出轮廓面积
    for (int i = 0; i < contours.size(); i++)
    {
        double length = arcLength(contours[i], true);
        cout << "第" << i << "轮廓面积" << length << endl;
    }
    drawContours(img,contours,6,Scalar(0,0,255),2,8);
    imshow("draw",img);
    waitKey(0);
    return 0;
}

\

results matching ""

    No results matching ""