轮廓面积

轮廓面积是轮廓的重要统计特性之一

通过轮廓面积可以进一步分析每个轮廓隐含的信息,例如通过轮廓面积区分物体大小、识别不同的物体等

轮廓面积是指每个轮廓中所有的像素点围成区域的面积,单位为像素

OpenCV提供了检测轮廓面积的contourArea()函数

contourArea()函数原型:

double contourArea(InputArray contour,
                   bool oriented = false
                   )
  • contour:轮廓的像素点
  • oriented:区域面积是否具有方向的标志,true表示面积具有方向性,false表示面积不具有方向性

    默认值为面积不具有方向性的false

该函数用于统计轮廓像素点围成区域的面积,返回值是统计轮廓面积的结果,数据类型为double

第一个参数表示轮廓的像素点,数据类型为vector< Point >或者Mat,相邻的两个像素点之间逐一相连构成的多边形区域

即为轮廓面积的统计区域,连续的3个像素连线可能在同一条直线上,因此,为了减少输入轮廓像素点的数目,可以只输入轮廓的顶点

像素点,例如一个三角形的轮廓,轮廓中可能具有每一条边上的所有像素点,但是,在统计面积时,可以只输入三角形的3个顶点

第二个参数是区域面积是否具有方向的标志,轮廓顺时针给出和逆时针给出时统计的面积互为相反数

示例:

#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(13,13),4,4);    //平滑滤波
    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 area1 = contourArea(contours[i]);
        cout << "第" << i << "轮廓面积" << area1 << endl;
    }
    drawContours(img,contours,6,Scalar(0,0,255),2,8);
    imshow("draw",img);
    waitKey(0);
    return 0;
}

\

results matching ""

    No results matching ""