OpenCv-C++-小案例实战-对象提取与测量(面积、周长)-程序员宅基地

技术标签: 形态学操作  局部二值化  轮廓提取  OpenCv-C++学习记录  OpenCv面积计算  OPenCv周长计算  

有这么一幅图:
在这里插入图片描述
我想提取并且测量中间陨石的面积与周长。

解决方法:
1、模糊;
2、二值化;
3、形态学操作;
4、轮廓发现+面积周长计算。

1)高斯模糊
因为陨石周围有许多小块的陨石,我们可以把它们当做噪点,可使用高斯模糊来去除。

Mat GaussImg;
	GaussianBlur(src, GaussImg, Size(7, 7), 0, 0);
	imshow("Gauss Image", GaussImg);

结果:
在这里插入图片描述

2)二值化
这里因为图像的色调比较接近,所以这张图像是一张单峰图。所以,进行自动化阈值操作时,这里选取THRESH_BINARY | THRESH_TRIANGLE来进行二值化。

Mat binary;
	threshold(GaussImg, binary, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);
	imshow("binary Image", binary);

结果:
在这里插入图片描述

3)形态学操作
这里使用闭操作,先膨胀后腐蚀,填充中间的小洞。

Mat morphImg;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
	morphologyEx(binary, morphImg, MORPH_CLOSE, kernel, Point(-1, -1), 1);
	imshow("morph Image", morphImg);

结果:
在这里插入图片描述

4)轮廓发现

Mat contoursImg=Mat::zeros(src.size(),CV_8UC3);
	vector<vector<Point>>contours;
	vector<Vec4i>hireachy;
	findContours(morphImg, contours,RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(-1, -1));
	
	for (size_t i = 0; i < contours.size(); i++)
	{
		Rect rect = boundingRect(contours[i]);
		if (rect.width < src.cols / 2)
			continue;

		drawContours(contoursImg, contours, static_cast<int>(i),
			Scalar(0, 0, 255 ), 2, 8, hireachy, 0, Point(0, 0));
		//计算面积与周长
		float area = contourArea(contours[i]);
		float length = arcLength(contours[i], true);
		printf("对象图像面积为:%f\n", area);
		printf("对象图像周长为:%f\n", length);

	}
	imshow("contours Image", contoursImg);

这里采用RETR_EXTERNAL函数二部用RETR_TREE,因为RETR_TREE是树形结构,它会显示所有有轮廓的形状,比如:
在这里插入图片描述
而采用了RETR_EXTERNAL之后,就是这样的:
在这里插入图片描述
它里面包含的形状就不会显示。
这一段操作的结果是:
在这里插入图片描述

周长与面积的结果为:
在这里插入图片描述

附上源码:

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace cv;
using namespace std;

Mat src;
int main(int argc, char** argv)
{
	src = imread("D:/test/space.png");
	if (src.empty())
	{
		printf("图片未找到!!!");
		return -1;
	}
	imshow("inut image", src);
	//高斯模糊
	Mat GaussImg;
	GaussianBlur(src, GaussImg, Size(7, 7), 0, 0);
	imshow("Gauss Image", GaussImg);
	cvtColor(GaussImg, GaussImg, CV_BGR2GRAY);

	//二值化操作
	Mat binary;
	threshold(GaussImg, binary, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);
	imshow("binary Image", binary);
	
	//形态学操作
	Mat morphImg;
	Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));
	morphologyEx(binary, morphImg, MORPH_CLOSE, kernel, Point(-1, -1), 1);
	imshow("morph Image", morphImg);

	//轮廓发现
	Mat contoursImg=Mat::zeros(src.size(),CV_8UC3);
	vector<vector<Point>>contours;
	vector<Vec4i>hireachy;
	findContours(morphImg, contours,RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(-1, -1));
	
	for (size_t i = 0; i < contours.size(); i++)
	{
		Rect rect = boundingRect(contours[i]);
		if (rect.width < src.cols / 2)
			continue;

		drawContours(contoursImg, contours, static_cast<int>(i),
			Scalar(0, 0, 255 ), 2, 8, hireachy, 0, Point(0, 0));
		//计算面积与周长
		float area = contourArea(contours[i]);
		float length = arcLength(contours[i], true);
		printf("对象图像面积为:%f\n", area);
		printf("对象图像周长为:%f\n", length);

	}
	imshow("contours Image", contoursImg);

	waitKey(0);
	return 0;

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Daker_Huang/article/details/85414240

智能推荐

PWN 栈溢出-程序员宅基地

文章浏览阅读937次。Beginning如果想用栈溢出来执行攻击指令,就要在溢出数据内包含攻击指令的内容或地址,并且要将程序控制权交给该指令。攻击指令可以是自定义的指令片段,也可以利用系统内已有的函数及指令0x01函数调用栈是指程序运行时内存一段连续的区域,用来保存函数运行时的状态信息,包括函数参数与局部变量等。称之为“栈”是因为发生函数调用时,调用函数(caller)的状态被保存在栈内,被调用函数(ca..._pwn 栈溢出

文件下载时文件后缀与contentType对应表_application/x-msdownload对应的文件类型-程序员宅基地

文章浏览阅读6.4k次,点赞2次,收藏9次。文件类型如下:".*"="application/octet-stream"".001"="application/x-001"".301"="application/x-301"".323"="text/h323"".906"="application/x-906"".907"="drawing/907"".a11"="application/x-a11""._application/x-msdownload对应的文件类型

系统更新及疑难处理-程序员宅基地

文章浏览阅读345次。系统更新及疑难处理利用WSUS部署更新程序微软公司的主要补丁类型nHotfix是针对某一个具体的系统漏洞或安全问题而发布的专门解决该漏洞或安全问题的小程序,通常称为修补程序n微软公司会及时地将软件产品中发现的重大问题以安全公告的形式公布于众,这些公告都有一个惟一的编号,即“MS”,如MS04-011n还有一种形式为KB(2003年4月份后用此编号)的编号,这个编..._允许来自internetmicrosoft更新服务位置的签名更新

【论文】ROS系统的无人小车自动跟随方案研究-程序员宅基地

文章浏览阅读3.7k次,点赞3次,收藏45次。本文基于ROS操作系统介绍了一种运动与跟随系统的设计及实现,该跟随系统包括以激光雷达进行全方位角度的距离测量,使用Python语言编写脚本,通过编写激光雷达话题的订阅以及运动话题的发布,完成对目标的运动控制以及对被跟随目标的感知和产生跟随相应的动作。本系统中无论被跟随目标位于跟随机器人的任何方位,均能实现机器人的跟随,无需额外的基站、标签等定位设施,可以减少整个跟随系统成本。基于ROS系统使开发简单快速,适用范围广,具有良好的可移植性和通用性。_ros系统的无人小车自动跟随方案研究

几十款游戏的简单分析_游戏分析-程序员宅基地

文章浏览阅读1.3k次。笔者曾在多个游戏平台上玩过众多游戏,包括fc红白游戏机游戏、网页游戏、单机游戏、客户端游戏、手游等。在游戏过程中,笔者常常从多个角度对游戏进行分析,包括游戏的优缺点、改进方法、数值设计、音效、画面等方面。本篇文章简要但关键地记录了笔者在游戏体验和策略分析方面的一些心得体会。综合以上所述,一款成功的游戏需要满足一些基本要素。首先,它必须是新颖的、有趣的、易于上手的,同时游戏数值、画面、音效等方面也要在合理区间。_游戏分析

circular waveguide_wr137 circular waveguide datasheet-程序员宅基地

文章浏览阅读1.3k次。 Figure 1 Bessel function of first kindFigure 2 Derivative of Bessel function of first kindFigure 3 E field of TE11 modeFigure 4 H field of TE11 modeFigure 5 E field w.r.t. time_wr137 circular waveguide datasheet

随便推点

UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xb0 in position 5: invalid start byte_ebpf bcc unicodedecodeerror: 'utf-8' codec can't d-程序员宅基地

文章浏览阅读947次。UnicodeDecodeError: 'gbk' codec can't decode byte 0xfa in position 4669: illegal multibyte sequenceUnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 5: invalid start bytewith open('进线汇总20201211.csv',encoding='utf8') as f: t = f._ebpf bcc unicodedecodeerror: 'utf-8' codec can't decode byte 0xb0 in positio

使用条件序列GAN改进NMT_improving neural machine translation with conditio-程序员宅基地

文章浏览阅读1.3k次。使用条件序列GAN改进NMT原文《Improving Neural Machine Translation with Conditional Sequence Generative Adversarial Nets》课程作业,因为要导出pdf所以粘贴到CSDN了,34章是笔者翻译的部分。当一篇post吧,求别喷,有问题请留言我一定改,一定改。摘要本文提出了一种将GANs应用于NMT领域的方..._improving neural machine translation with conditional sequence generative ad

产品周报第33期|完善铁粉规则,优化原创保护策略,升级创作中心的数据展示,开放业界专家自定义域名权益……_创作者中心铁粉数0-程序员宅基地

文章浏览阅读5k次。目录一、博客产品功能完善1、完善铁粉说明规则2、创作中心专栏数据升级3、发文助手新增「添加模版」指引4、免费开放业界专家自定义域名权益5、其他优化二、问答产品体验优化1、回答链接和链接详情页调整2、PC端提问页优化3、创作中心页面的问答列表优化三、首页热榜及优质内容推进方面的改进四、吐槽提建议直通车,直达CSDN各产品与运营人员查看往期改进hello,大家好,这里是「CSDN产品周报」第33期。本次更新主要涉及博客、问答及首页,欢迎大家详细了解和使_创作者中心铁粉数0

自建网盘之 NextCloud 终极记录-程序员宅基地

文章浏览阅读1.7k次。自建过许多网盘,试过 可道云、Seafile、FileRun、Nextcloud,但Nextcloud的如下特性吸引了我:完整、好用的客户端,包括 windows、mac、android、ios ...强大的插件扩展,如 Talk, Contacts, notes, Maps ...完整的第三方扩展,支持 Amazie S3, OneDrive, ..._可道云 nextcloud seafile

C语言最重要的知识点(复习、期末考)-程序员宅基地

文章浏览阅读1k次,点赞26次,收藏20次。C语言最重要的知识点(复习、期末考)

Windows11系统开机跳过联网全过程(详解)_跳过联网进入win11 需要设置密码-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏7次。Windows11系统开机跳过联网全过程(详解)_跳过联网进入win11 需要设置密码