OpenCV——计算轮廓长度/周长和面积_opencv计算轮廓面积-程序员宅基地

技术标签: 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;

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/B08370108/article/details/118106598

智能推荐

单片机实现模块化编程:思维+实例+系统教程(实用程度令人发指)_实现模块化工程举例子-程序员宅基地

文章浏览阅读1.1k次,点赞3次,收藏9次。单片机怎么实现模块化编程?思维+实例+系统教程(实用程度令人发指)\\\插播一条:文章末尾有惊喜哟~///在刚初始从事研发工作的那几年,我主要做单片机软件开发的工作,虽然功能吧都能实现,但是总觉得缺少了点什么。总是感觉自己写的程序不够完美,移植性不够好,功能也不好扩展,每次写完程序最怕的就是客户要改功能。假如程序架构写的不好,一改会影响到很多功能,哪怕原来是灯每秒闪1次,改成每秒闪3次这种看起来很简略的功能。对于程序提升这块,假如没有人一个厉害的人带你,真的很难提升。主要难在两个方面:1.你的认知有时候不是_实现模块化工程举例子

网络故障多种解决方案(1)_取消桥接 被拔出-程序员宅基地

文章浏览阅读479次。 ip与MAC绑定的难题   问:我的计算机原来采用公网固定IP地址。为了避免被他人盗用,使用“arp -s ip mac”命令对MAC地址和IP地址进行了绑定。后来,由于某种原因,又使用“arp -d ip mac”命令取消了绑定。然而,奇怪的是,取消绑定后,在其他计算机上仍然不能使用该IP地址,而只能在我自己的计算机上使用。需要说明的是,我的计算机并不是代理服务器。   答:虽然在TCP/IP_取消桥接 被拔出

git push代码的时候 出现 Push to origin/master was rejected 的错误提示_phpstorm上传git提示错误push to ciyuan/master was rejecte-程序员宅基地

文章浏览阅读255次。在git项目对应的目录位置打开Git Bash 然后在命令窗输入下面命令: git pull origin master --allow-unrelated-histories  最后出现完成信息,则操作成功!  再次Push代码,可以成功进行提交!..._phpstorm上传git提示错误push to ciyuan/master was rejected

6-4 递归求Fabonacci数列 (10 分)_r6-1 递归求fabonacci数列分数 10作者 c课程组单位 浙江大学本题要求实现求fa-程序员宅基地

文章浏览阅读6.2k次。本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:f(n)=f(n−2)+f(n−1)(n≥2),其中f(0)=0,f(1)=1。函数接口定义:int f( int n );函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。裁判测试程序样例:#include <stdio.h>int f( int n );int main(){ int n; scanf("%d", &a._r6-1 递归求fabonacci数列分数 10作者 c课程组单位 浙江大学本题要求实现求fa

centos7识别验证码字体_centos7 验证码字体-程序员宅基地

文章浏览阅读1.5k次。一段java写的纯字母和数字的登录验证码程序,在windows运行正常。部署到阿里云,起初也是正常的。但经过对这台阿里云主机(CentOS 7.4)进行一系列的环境配置(nginx,ffmpeg等)后,验证码变成了乱码,与后台打印的字母数字完全不同。考虑到代码没有变动,应当是环境的问题。可能是某个时候把centos的字体文件给删除或覆盖了。最后发现可以通过以下方式解决:1、检查代码使用的字体为Ti..._centos7 验证码字体

linux java访问mdb文件_在Linux中通过Python脚本访问mdb数据库的方法-程序员宅基地

文章浏览阅读274次。在 linux 系统中连接 mdb 数据库,直接连接的话,mdb 默认的驱动无法识别非 windows 的路径, 所以不能使用常规的连接方式DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\\dir\\file.mdb安装这里我们需要借助一些库来实现第三方的驱动我们需要安装这些包:mdbtools, unixODBC, libmdbodbc如果是支持 ..._linux java mdb库

随便推点

c++ vector“最大”容量_vector最大长度-程序员宅基地

文章浏览阅读3.3w次,点赞20次,收藏29次。明白c++ 中vector的size, capacity, max_size的意义及关系。_vector最大长度

鸿蒙2.0操作体验,鸿蒙2.0操作系统正式版-华为鸿蒙2.0操作系统正式版官方预约 v1.0.0-优盘手机站...-程序员宅基地

文章浏览阅读88次。鸿蒙2.0操作系统正式版是一款华为官方新推出的操作系统,用户们可以更好的体验带来的新功能,许多新的使用功能会让大家的操作体验更不错,针对之前的bug问题进行了修复,很多的用户可以顺利的使用这个全新的系统,能给许多的用户们带来不错的帮助哦。华为鸿蒙系统入口:点击进入鸿蒙2.0操作系统正式版特色:1、华为官方新推出的一个全新操作系统,给大家带来了许多新的使用体验;2、在大家进行更新这个系统的时候,需..._鸿蒙 rpm

(图解)设置封面中的下划线一样长_word封面下划线怎么设置一样长-程序员宅基地

文章浏览阅读3.5w次,点赞4次,收藏3次。如图所示,有时候我们会遇到封面下划线一直设计不齐。本节将介绍如何设置下划线一样长。设置步骤设置步骤将光标点击在要设置的行,拖动图中所圈出的小三角。拖动后,专业班级与学生班级下划线就一样长了按照上面的方法,全部修改后下划线就一样长了..._word封面下划线怎么设置一样长

盘点云原生的5大特征-程序员宅基地

文章浏览阅读587次。导读:随着公有云和私有云的广泛部署,云计算基础设施成为企业部署新业务的首选。可以说,云计算已进入下半场,各大云计算服务商的厮杀日益激烈,新的概念也层出不穷。近年来,云原生计算(Cloud ..._云原生技术的关键特征

用html5 拍照+多图片上传、删除图片、查看图片_h5 拍照删除上传 源码-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏14次。用html5中的 file 调用手机拍照以及多图片上传功能,可进行删除图片、放大查看图片,网页版多文件上传也可以用。代码如下:<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>Hello MUI</title> <meta na..._h5 拍照删除上传 源码

C语言检查一个字符串是否为另一个字符串的子字符串的算法(附完整源码)_c语言如何判断一个字符串是另一个字符串的子串-程序员宅基地

文章浏览阅读1.2k次。C语言检查一个字符串是否为另一个字符串的子字符串的算法C语言检查一个字符串是否为另一个字符串的子字符串的算法完整源码(定义,实现,main函数测试)C语言检查一个字符串是否为另一个字符串的子字符串的算法完整源码(定义,实现,main函数测试)#include <iostream>#include <string>bool isRotation( std::string s1, std::string s2 ) { size_t len1 = s1.length(); s_c语言如何判断一个字符串是另一个字符串的子串

推荐文章

热门文章

相关标签