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) { /// 读入原图像, 返回3通道图像数据 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); } /** @thresh_callback 函数 */ void thresh_callback(int, void*) { Mat canny_output; vector<vector<Point> > contours; vector<Vec4i> hierarchy; /// 使用Canndy检测边缘 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); /// 通过m00计算轮廓面积并且和OpenCV函数比较 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); } }