1、概述
案例:使用OpenCV实现卫星云图的周长面积计算
实现步骤:
1.输入图像
2.对图像进行高斯模糊,主要是为了降噪
3.图像灰度化
4.图像二值分割
5.执行形态学操作去除小点并使对象黏连
6.轮廓发现,并过滤目标轮廓
7.计算轮廓周长及面积
8.输出目标图像,并在目标图像上显示周长及面积
2、代码示例
//【1】载入图像
Mat src = imread(filePath);
if(src.empty()){
qDebug()<<"图片为空";
return;
}
imshow("src",src);
//【2】高斯模糊去除噪声
GaussianBlur(src,src,Size(15,15),0,0);
//【3】图像灰度化
Mat gray;
cvtColor(src,gray,COLOR_BGR2GRAY);
//【4】二值分割
threshold(gray,gray,0,255,THRESH_BINARY|THRESH_TRIANGLE);
imshow("threshold",gray);
//【5】执行形态学开操作
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
morphologyEx(gray,gray,MORPH_OPEN,kernel,Point(-1,-1),2);
imshow("morphologyEX",gray);
//【6】发现轮廓
vector<vector<Point>> contours;
vector<Vec4i> hier;
findContours(gray,contours,hier,RETR_TREE,CHAIN_APPROX_SIMPLE);
RNG rng(123456);
Mat resultImage = Mat::zeros(src.size(),CV_8UC3);
for(size_t i = 0;i<contours.size();i++){
Rect rect = boundingRect(contours[i]);
if(rect.width>src.cols/2&&rect.height>src.rows/3){
Scalar scalar = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
drawContours(resultImage,contours,i,scalar,-1,LINE_8);
//【7】计算面积,周长
double area = contourArea(contours[i],false);
double length = arcLength(contours[i],false);
QString str;
str = QString("area:%1,length:%2").arg(area).arg(length);
putText(resultImage,str.toStdString(),Point(src.cols/3,src.rows/2),FONT_HERSHEY_PLAIN,1,Scalar(255,255,255));
qDebug()<<"面积:"<<area;
qDebug()<<"周长:"<<length;
}
}
//【输出目标图像】
imshow("resultImage",resultImage);
3、示例图片
本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓