- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
计算轮廓的面积。
该函数计算轮廓的面积。与 moments 类似,面积是使用格林公式计算的。因此,返回的面积与你使用 drawContours 或 fillPoly 绘制轮廓时的非零像素数量可能会不同。此外,对于自相交的轮廓,该函数很可能会给出错误的结果。
例子:
cpp
vector<Point> contour;
contour.push_back(Point2f(0, 0));
contour.push_back(Point2f(10, 0));
contour.push_back(Point2f(10, 10));
contour.push_back(Point2f(5, 4));
double area0 = contourArea(contour);
vector<Point> approx;
approxPolyDP(contour, approx, 5, true);
double area1 = contourArea(approx);
cout << "area0 =" << area0 << endl <<
"area1 =" << area1 << endl <<
"approx poly vertices" << approx.size() << endl;
函数原型
cpp
double cv::contourArea
(
InputArray contour,
bool oriented = false
)
参数
- 参数contour 输入的二维点向量(轮廓顶点),存储在 std::vector 或 Mat 中
- 参数oriented 有向面积标志。如果该值为真,则函数会返回一个根据轮廓方向(顺时针或逆时针)而定的带符号的面积值。利用此功能,可以通过获取面积的符号来确定轮廓的方向。默认情况下,该参数为假,这意味着返回的是绝对值。
代码示例
cpp
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
// 创建一个简单的二值图像
cv::Mat img = cv::Mat::zeros( 300, 300, CV_8UC1 );
// 添加一个矩形轮廓
cv::rectangle( img, cv::Rect( 50, 50, 100, 100 ), cv::Scalar( 255 ), cv::FILLED );
// 显示原始二值图像
cv::imshow( "Binary Image", img );
// 查找图像中的轮廓
std::vector< std::vector< cv::Point > > contours;
std::vector< cv::Vec4i > hierarchy;
cv::findContours( img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE );
// 计算每个轮廓的面积
for ( const auto& contour : contours )
{
double area = cv::contourArea( contour );
std::cout << "Contour area (absolute): " << area << std::endl;
// 计算带符号的面积
double oriented_area = cv::contourArea( contour, true );
std::cout << "Contour oriented area: " << oriented_area << std::endl;
}
// 绘制轮廓
cv::drawContours( img, contours, -1, cv::Scalar( 128 ), 2 );
// 显示带有轮廓的图像
cv::imshow( "Image with Contour", img );
cv::waitKey( 0 );
cv::destroyAllWindows();
return 0;
}
运行结果
终端输出:
bash
Contour area (absolute): 9801
Contour oriented area: -9801
图像输出: