本章内容:
3.计算弧长
4.计算面积
5.计算中心点
输出结果:
代码
#include <ostream>
#include <opencv.hpp>
#include <math.h>int main(int argc, char *argv[])
{
/*
本章内容:
1. 轮廓查找
2. 绘制轮廓
3.计算弧长
4.计算面积
5.计算中心点
*/
cv::String fileName = "/home/wang/dev/Image/QT.jpg";
cv::String fileName1 = "/home/wang/dev/Image/hei.png";
cv::Mat src = cv::imread(fileName);
cv::Mat src1 = cv::imread(fileName1);
if(src.data == NULL){
printf("图像读入失败\n");
return -1;
}
cv::imshow("src",src);
cv::Mat dstCany;
cv::Mat gray;
cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
cv::Canny(gray,dstCany,50,150);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(dstCany,contours,hierarchy,cv::RETR_TREE,cv::CHAIN_APPROX_SIMPLE,cv::Point(0,0));
cv::RNG rng(1234);
cv::Mat dst(src.size(),src.type());std::cout << "轮廓数量" << contours.size() << std::endl;
for(int i=0; i <contours.size();i++){
cv::Scalar color = cv::Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
cv::drawContours(dst,contours,i,color,4);
// 计算弧长,CV_EXPORTS_W double arcLength( InputArray curve, bool closed );
double arcLen = cv::arcLength(contours[i],false);
printf("arcLen[%d]=%f",i,arcLen);
// 计算面积
double area = cv::contourArea(contours[i],true);
printf(" contourArea[%d]=%f\t",i,area);
//计算矩 CV_EXPORTS_W Moments moments( InputArray array, bool binaryImage = false );
cv::Moments Mom;
Mom = cv::moments(contours[i]);
// 计算中心
double cx = Mom.m10/Mom.m00;
double cy = Mom.m01/Mom.m00;
printf(" cy=%f,cy=%f",cy,cy);
std::cout<< std::endl;if(i > 10) break;
}
cv::imshow("dst",dst);
cv::waitKey(0);
return 1;
}