轮廓周长
轮廓的周长也是轮廓的重要统计特性之一,虽然轮廓的周长无法直接反映轮廓区域的大小和形状
但是可以与轮廓面积结合得到关于轮廓区域的更多信息
例如,当某个区域的面积与周长的平方数的比值为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;
}
\