OpenCV计算轮廓长度/周长和面积

 更新时间:2021年06月23日 09:46:58   作者:我有一個夢想  
这篇文章主要为大家详细介绍了OpenCV计算轮廓长度/周长和面积,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了OpenCV计算轮廓长度/周长和面积的具体代码,供大家参考,具体内容如下

轮廓面积

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

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

函数的返回值是统计轮廓面积的结果,数据类型为double。函数第一个参数表示轮廓的像素点,数据类型为vector或者Mat,相邻的两个像素点之间逐一相连构成的多边形区域即为轮廓面积的统计区域。连续的三个像素点之间的连线有可能在同一条直线上,因此为了减少输入轮廓像素点的数目,可以只输入轮廓的顶点像素点,例如一个三角形的轮廓,轮廓中可能具有每一条边上的所有像素点,但是在统计面积时可以只输入三角形的三个顶点。函数第二个参数是区域面积是否具有方向的标志,参数为true时表示统计的面积具有方向性,轮廓顶点顺时针给出和逆时针给出时统计的面积互为相反数;参数为false时表示统计的面积不具有方向性,输出轮廓面积的绝对值。 

轮廓长度 /周长

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

该函数能够统计轮廓或者曲线的长度,函数返回值为统计长度,单位为像素,数据类型为double。函数的第一个参数是轮廓或者曲线的2D像素点,数据类型为vector或者Mat。函数的第二个参数是轮廓或者曲线是否闭合的标志,true表示闭合。

函数统计的长度是轮廓或者曲线相邻两个像素点之间连线的距离,例如计算三角形三个顶点A、B和C构成的轮廓长度时,并且函数第二个参数为true时,统计的长度是三角形三个边AB、BC和CA的长度之和;当参数为false时,统计的长度是由A到C三个点之间依次连线的距离长度之和,即AB和BC的长度之和。

简单示例

//
// Created by smallflyfly on 2021/6/22.
//
 
#include "opencv2/opencv.hpp"
#include <iostream>
 
using namespace std;
using namespace cv;
 
int main() {
    Mat im = imread("rice.jfif");
    resize(im, im, Size(0, 0), 0.5, 0.5);
    Mat gray;
    cvtColor(im, gray, CV_BGR2GRAY);
 
    Mat imBin;
    threshold(gray, imBin, 125, 255, THRESH_BINARY);
 
    vector<vector<Point>> contours;
    findContours(imBin, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    drawContours(im, contours, -1, Scalar(255, 0, 255));
 
    for (int i = 0; i < contours.size(); ++i) {
        double area = contourArea(contours[i]);
        double length = arcLength(contours[i], true);
        cout << "area: " << area << " " << "length: " << length << endl;
    }
    
    imshow("im", im);
 
    waitKey(0);
    destroyAllWindows();
 
    return 0;
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

    可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数。如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现
    2013-10-10
  • C++ 回调接口设计和二进制兼容详细

    C++ 回调接口设计和二进制兼容详细

    再开发视频编辑 SDK,SDK的回调接口设计成 C 风格,结构中放着一些函数指针,既然对外接口是 C++,为什么不直接使用 C++ 的虚函数?这篇文章便对这一问题做个详细介绍,需要的朋友可以参考一下
    2021-09-09
  • C++实现五子棋游戏(注释版)

    C++实现五子棋游戏(注释版)

    这篇文章主要为大家详细介绍了C++实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++标准C函数在各平台编译结果都相同

    C++标准C函数在各平台编译结果都相同

    今天小编就为大家分享一篇关于C++标准C函数在各平台编译结果都相同,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 详解C++设计模式编程中对状态模式的运用

    详解C++设计模式编程中对状态模式的运用

    这篇文章主要介绍了C++设计模式编程中对状态模式的运用,状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,需要的朋友可以参考下
    2016-03-03
  • C语言指针超详细讲解下篇

    C语言指针超详细讲解下篇

    指针提供了对地址操作的一种方法,因此,使用指针可使得 C 语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。在一定意义上可以说,指针是 C 语言的精髓
    2022-04-04
  • c++迭代器失效的情况汇总

    c++迭代器失效的情况汇总

    这篇文章主要介绍了C++迭代器失效的几种情况总结,文中代码非常详细,帮助大家更好的了解学习,感兴趣的朋友可以参考下
    2020-06-06
  • C语言实现扫雷游戏源代码

    C语言实现扫雷游戏源代码

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C语言超细致讲解循环语句

    C语言超细致讲解循环语句

    我们说到当满足特定条件时,就会执行if语句或者switch语句后面的语句,否则不执行,但是这只能执行一次,在日常生活中,有些事情是需要重复去做的,C语句就为此引入了循环语句。所以今天继续为大家分享C语言循环家族
    2022-05-05
  • C语言使用openSSL库AES模块实现加密功能详解

    C语言使用openSSL库AES模块实现加密功能详解

    这篇文章主要介绍了C语言使用openSSL库AES模块实现加密功能,详细分析了C语言加密的相关概念、原理及AES模块加密具体实现技巧,需要的朋友可以参考下
    2017-05-05

最新评论