轮廓面积
轮廓面积是轮廓的重要统计特性之一
通过轮廓面积可以进一步分析每个轮廓隐含的信息,例如通过轮廓面积区分物体大小、识别不同的物体等
轮廓面积是指每个轮廓中所有的像素点围成区域的面积,单位为像素
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;
}
\