double cvContourArea( const CvArr* contour, CvSlice slice=CV_WHOLE_SEQ );
contour:轮廓(顶点的序列或数组)。
slice:感兴趣区轮廓部分的起点和终点,默认计算整个轮廓的面积。
函数cvContourArea计算整个或部分轮廓的面积。在计算部分轮廓的情况时,由轮廓弧线和连接两端点的弦
围成的区域总面积被计算,如下图所示:
注意:轮廓的位置将影响区域面积的符号,因此函数范围的有可能是负值。可以使用C运行时函数fabs()来
得到面积的绝对值。
1、contourArea函数
函数作用
主要用于计算图像轮廓的面积
2、contourArea函数调用形式
C++: double contourArea(InputArray contour, bool oriented=false )
参数详解:
InputArray contour:输入的点,一般是图像的轮廓点
bool oriented=false:表示某一个方向上轮廓的的面积值,顺时针或者逆时针,一般选择默认false
3、OpenCV代码:
- #include "opencv2/highgui/highgui.hpp"
- #include "opencv2/imgproc/imgproc.hpp"
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
-
- using namespace cv;
- using namespace std;
-
- Mat src; Mat src_gray;
- int thresh = 100;
- int max_thresh = 255;
- RNG rng(12345);
-
-
- void thresh_callback(int, void*);
-
-
- int main(int argc, char** argv)
- {
-
- src = imread("D:6.jpg", 1);
-
-
- cvtColor(src, src_gray, CV_BGR2GRAY);
- blur(src_gray, src_gray, Size(3, 3));
-
-
- char* source_window = "Source";
- namedWindow(source_window, CV_WINDOW_AUTOSIZE);
- imshow(source_window, src);
-
- createTrackbar(" Canny thresh:", "Source", &thresh, max_thresh, thresh_callback);
- thresh_callback(0, 0);
-
- waitKey(0);
- return(0);
- }
-
-
- void thresh_callback(int, void*)
- {
- Mat canny_output;
- vector<vector<Point> > contours;
- vector<Vec4i> hierarchy;
-
-
- Canny(src_gray, canny_output, thresh, thresh * 2, 3);
-
- findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
-
-
- vector<Moments> mu(contours.size());
- for (int i = 0; i < contours.size(); i++)
- {
- mu[i] = moments(contours[i], false);
- }
-
-
- vector<Point2f> mc(contours.size());
- for (int i = 0; i < contours.size(); i++)
- {
- mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
- }
-
-
- Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
- for (int i = 0; i< contours.size(); i++)
- {
- Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
- drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
- circle(drawing, mc[i], 4, color, -1, 8, 0);
- }
-
-
- namedWindow("Contours", CV_WINDOW_AUTOSIZE);
- imshow("Contours", drawing);
-
-
- printf("\t Info: Area and Contour Length \n");
- for (int i = 0; i< contours.size(); i++)
- {
- printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength(contours[i], true));
- Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
- drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
- circle(drawing, mc[i], 4, color, -1, 8, 0);
- }
- }