OpenCV計(jì)算輪廓長度/周長和面積
本文實(shí)例為大家分享了OpenCV計(jì)算輪廓長度/周長和面積的具體代碼,供大家參考,具體內(nèi)容如下
輪廓面積
輪廓面積是指每個(gè)輪廓中所有的像素點(diǎn)圍成區(qū)域的面積,單位為像素。
double contourArea( InputArray contour, bool oriented = false );
- contour:輪廓的像素點(diǎn)
- oriented:區(qū)域面積是否具有方向的標(biāo)志,true表示面積具有方向性,false表示不具有方向性,默認(rèn)值為不具有方向性的false。
函數(shù)的返回值是統(tǒng)計(jì)輪廓面積的結(jié)果,數(shù)據(jù)類型為double。函數(shù)第一個(gè)參數(shù)表示輪廓的像素點(diǎn),數(shù)據(jù)類型為vector或者M(jìn)at,相鄰的兩個(gè)像素點(diǎn)之間逐一相連構(gòu)成的多邊形區(qū)域即為輪廓面積的統(tǒng)計(jì)區(qū)域。連續(xù)的三個(gè)像素點(diǎn)之間的連線有可能在同一條直線上,因此為了減少輸入輪廓像素點(diǎn)的數(shù)目,可以只輸入輪廓的頂點(diǎn)像素點(diǎn),例如一個(gè)三角形的輪廓,輪廓中可能具有每一條邊上的所有像素點(diǎn),但是在統(tǒng)計(jì)面積時(shí)可以只輸入三角形的三個(gè)頂點(diǎn)。函數(shù)第二個(gè)參數(shù)是區(qū)域面積是否具有方向的標(biāo)志,參數(shù)為true時(shí)表示統(tǒng)計(jì)的面積具有方向性,輪廓頂點(diǎn)順時(shí)針給出和逆時(shí)針給出時(shí)統(tǒng)計(jì)的面積互為相反數(shù);參數(shù)為false時(shí)表示統(tǒng)計(jì)的面積不具有方向性,輸出輪廓面積的絕對(duì)值。
輪廓長度 /周長
double arcLength( InputArray curve, bool closed );
- curve:輪廓或者曲線的2D像素點(diǎn)。
- closed:輪廓或者曲線是否閉合標(biāo)志,true表示閉合。
該函數(shù)能夠統(tǒng)計(jì)輪廓或者曲線的長度,函數(shù)返回值為統(tǒng)計(jì)長度,單位為像素,數(shù)據(jù)類型為double。函數(shù)的第一個(gè)參數(shù)是輪廓或者曲線的2D像素點(diǎn),數(shù)據(jù)類型為vector或者M(jìn)at。函數(shù)的第二個(gè)參數(shù)是輪廓或者曲線是否閉合的標(biāo)志,true表示閉合。
函數(shù)統(tǒng)計(jì)的長度是輪廓或者曲線相鄰兩個(gè)像素點(diǎn)之間連線的距離,例如計(jì)算三角形三個(gè)頂點(diǎn)A、B和C構(gòu)成的輪廓長度時(shí),并且函數(shù)第二個(gè)參數(shù)為true時(shí),統(tǒng)計(jì)的長度是三角形三個(gè)邊AB、BC和CA的長度之和;當(dāng)參數(shù)為false時(shí),統(tǒng)計(jì)的長度是由A到C三個(gè)點(diǎn)之間依次連線的距離長度之和,即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;
}

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于C/C++中可變參數(shù)的詳細(xì)介紹(va_list,va_start,va_arg,va_end)
可變參數(shù)的函數(shù)原理其實(shí)很簡單,而va系列是以宏定義來定義的,實(shí)現(xiàn)跟堆棧相關(guān).我們寫一個(gè)可變函數(shù)的C函數(shù)時(shí),有利也有弊,所以在不必要的場合,我們無需用到可變參數(shù)。如果在C++里,我們應(yīng)該利用C++的多態(tài)性來實(shí)現(xiàn)可變參數(shù)的功能,盡量避免用C語言的方式來實(shí)現(xiàn)2013-10-10
C++ 回調(diào)接口設(shè)計(jì)和二進(jìn)制兼容詳細(xì)
再開發(fā)視頻編輯 SDK,SDK的回調(diào)接口設(shè)計(jì)成 C 風(fēng)格,結(jié)構(gòu)中放著一些函數(shù)指針,既然對(duì)外接口是 C++,為什么不直接使用 C++ 的虛函數(shù)?這篇文章便對(duì)這一問題做個(gè)詳細(xì)介紹,需要的朋友可以參考一下2021-09-09
C++標(biāo)準(zhǔn)C函數(shù)在各平臺(tái)編譯結(jié)果都相同
今天小編就為大家分享一篇關(guān)于C++標(biāo)準(zhǔn)C函數(shù)在各平臺(tái)編譯結(jié)果都相同,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
詳解C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用
這篇文章主要介紹了C++設(shè)計(jì)模式編程中對(duì)狀態(tài)模式的運(yùn)用,狀態(tài)模式允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為,對(duì)象看起來似乎修改了它的類,需要的朋友可以參考下2016-03-03
C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能詳解
這篇文章主要介紹了C語言使用openSSL庫AES模塊實(shí)現(xiàn)加密功能,詳細(xì)分析了C語言加密的相關(guān)概念、原理及AES模塊加密具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-05-05

