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++实现平衡二叉树

    平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉树,根据科学家的英文名也称为AVL树。本文介绍了它的原理和如何用C++代码来实现
    2021-06-06
  • C++中“#”号的使用技巧

    C++中“#”号的使用技巧

    本篇文章是对C++中“#”号的使用技巧进行了分析介绍,需要的朋友参考下
    2013-05-05
  • C语言实现单链表的基本功能详解

    C语言实现单链表的基本功能详解

    链表是一个结构体实现的一种线性表,它只能从前往后,不可以从后往前,在实现单链表的操作时,需要用指针来操作。本文主要介绍了实现单链表的基本功能的代码示例,具有一定价值,感兴趣的同学可以学习一下
    2021-11-11
  • C++ 中滚动条的滚动问题

    C++ 中滚动条的滚动问题

    本文主要通过一个示例,给大家介绍了C++中滚动条的滚动问题,以及相关参数的解释,非常的详细,有需要的小伙伴可以参考下。
    2015-06-06
  • 详解C语言内核字符串转换方法

    详解C语言内核字符串转换方法

    在内核开发模式下,初始化字符串也需要调用专用的初始化函数,如下分别初始化ANSI和UNCODE字符串,本文我们就来看看代码是如何实现的
    2022-09-09
  • C++中Covariant返回值类型详解

    C++中Covariant返回值类型详解

    这篇文章主要介绍了C++中Covariant返回值类型详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以可以参考一下
    2022-09-09
  • C++中的三大函数和操作符重载(Boolan)

    C++中的三大函数和操作符重载(Boolan)

    本文主要介绍了C++中的三大函数和操作符重载(Boolan)的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • c++实现的常见缓存算法和LRU

    c++实现的常见缓存算法和LRU

    LRU缓存算法也叫LRU页面置换算法,是一种经典常用的页面置换算法,下面这篇文章主要介绍了c++实现的常见缓存算法和LRU,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01
  • 关于在MFC中将窗口最小化到托盘实现原理及操作步骤

    关于在MFC中将窗口最小化到托盘实现原理及操作步骤

    最小化的原理:首先要将窗口隐藏,然后在右下角绘制图标;恢复的原理:将窗口显示,再将托盘中的图片删除,接下来介绍实现方法,感兴趣的朋友可以了解下啊,希望本文对你有所帮助
    2013-01-01
  • C++ pimpl机制详细讲解

    C++ pimpl机制详细讲解

    PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问
    2022-08-08

最新评论