《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包

【计算机视觉】图像轮廓与图像分割修复(凸包、图像的矩、分水岭算法、图像修补) 来源:《OpenCV3编程入门》,怀念毛星云大佬🕯️。 阅读详情

8.2 寻找物体的凸包

8.2.1 概念

1.给定二维平面上的点集,将最外层点连接起来构成的凸多边形。
2.理解物体形状或轮廓的一种比较有用的方法是计算一个物体的凸包,然后计算其凸缺陷(convexity defects)例如,图中A-H区域是凸包的各个”缺陷”:
                在这里插入图片描述
3.函数:convexHull()函数
4.函数原型:

void convexHull(InputArray points,OutputArray hull,bool clockwise=false, bool returnPoints=true)

5.参数说明:
(1)输入的二维点集,Mat类型或std::vector
(2)输出参数,找到的凸包,返回的hull是points中点的索引
(3)操作方向标识符,为真时输出凸包为顺时针方向,否则逆时针
(4)操作标识符,默认true,标志为真时函数返回各凸包的各个点,否则返回凸包各点的指数,输出数组是std:vector时此标志忽略

8.2.2 示例程序

1. 凸包检测基础

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{
	//初始化变量和随机值
	Mat image(600, 600, CV_8UC3);
	RNG& rng = theRNG();
	//循环,按下ESC退出程序,否则有键按下便一直更新
	while (1)
	{
		//参数初始化
		char key;
		int count = (unsigned)rng % 100 + 3;//随机生成点的数量
		vector<Point>points;//点值
		//随机生成点坐标
		for (int i = 0; i < count; i++)
		{
			Point point;
			point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);
			point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);
			points.push_back(point);
		}
		//检测凸包
		vector<int>hull;
		convexHull(Mat(points), hull, true);//返回的hull是points中点的索引
		//绘制出随机颜色的点
		image = Scalar::all(0);
		for (int i = 0; i < count; i++)
		{
			circle(image, points[i], 3, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), FILLED, LINE_AA);
		}
		//准备参数
		int hullcount = (int)hull.size();//凸包边数
		Point point0 = points[hull[hullcount - 1]];//连接凸包边的坐标点
		//绘制凸包的边
		for (int i = 0; i < hullcount; i++)
		{
			Point point = points[hull[i]];
			line(image, point0, point, Scalar(255,255,255), 2, LINE_AA);
			point0 = point;
		}
		//显示效果图
		imshow("凸包检测示例", image);
		//按下ESC,程序退出
		key = (char)waitKey();
		if (key == 27) break;
	}
	return 0;
}

运行效果:
在这里插入图片描述
2.综合示例

/*
效果:
	滑动条控制阈值g_nThresh,以改变g_thresholdImage_output,findContours以此参数为输入,查找不同轮廓图,从而得到不同凸包检测效果图
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始图】"
#define WINDOW_NAME2 "【效果图】"
//全局变量
Mat g_srcImage, g_grayImage, g_thresholdImage_output, g_dstImage;
int g_nThresh = 80;
int g_nThresh_max = 255;
RNG g_rng(12345);
Mat srcImage_copy = g_srcImage.clone();
vector<vector<Point>>g_vContours;
vector<Vec4i>g_vHierarchy;
//全局函数
static void ShowHelpText();
static void on_ThreshChange(int, void*);
int main()
{
	//改变console字体颜色
	system("color 1F");
	ShowHelpText();

	//载入原图
	g_srcImage = imread("girl.jpg", 1);
	if (!g_srcImage.data)
	{
		printf("图片载入失败~!\n");
		return false;
	}
	//创建窗口
	namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
	namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);
	imshow(WINDOW_NAME1, g_srcImage);

	//转成灰度图并模糊化降噪
	cvtColor(g_srcImage, g_grayImage, CV_BGR2GRAY);
	blur(g_grayImage, g_grayImage, Size(3, 3));

	//创建滚动条并初始化
	createTrackbar("阈值", WINDOW_NAME2, &g_nThresh, g_nThresh_max, on_ThreshChange);
	on_ThreshChange(0, 0);

	waitKey(0);
	return 0;
}
static void on_ThreshChange(int, void*)
{
	//对图像进行二值化,控制阈值
	threshold(g_grayImage, g_thresholdImage_output, g_nThresh, 255, THRESH_BINARY);
	//查找轮廓
	findContours(g_thresholdImage_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
	//遍历每个轮廓,寻找其凸包
	vector<vector<Point>>hull(g_vContours.size());
	for (int i = 0; i < g_vContours.size(); i++)
	{
		convexHull(Mat(g_vContours[i]), hull[i], false);
	}
	//绘制轮廓及其凸包
	Mat g_dstImage = Mat::zeros(g_thresholdImage_output.size(), CV_8UC3);
	//或 for (int index = 0; index >= 0; index = g_vHierarchy[index][0])
	for (int index = 0; index < g_vContours.size(); index++)
	{
		//或 Scalar color(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值
		Scalar color(rand() & 255, rand() & 255, rand() & 255);
		drawContours(g_dstImage, g_vContours, index, color, 1, 8, vector<Vec4i>(), 0, Point());
		drawContours(g_dstImage, hull, index, color, 1, 8, vector<Vec4i>(), 0, Point());
	}
	//显示效果图
	imshow(WINDOW_NAME2, g_dstImage);
}
static void ShowHelpText()
{
	printf("\n\n\t欢迎来到【在图形中寻找轮廓及其凸包】示例程序!\n\n");
	printf("\n\n\t操作说明:\n\n");
	printf("\t\t键盘任意键-退出程序\n\n");
	printf("\t\t滑动滚动条-改变阈值\n");
}

运行效果:
在这里插入图片描述在这里插入图片描述在这里插入图片描述 在这里插入图片描述
在这里插入图片描述 在这里插入图片描述

《Opencv3编程入门》学习笔记—第八章 《Opencv3编程入门》学习笔记 第八章 图像轮廓与图像分割修复 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 阅读详情

相关推荐

封闭opencv

basepic.dll是自己封装了几个opencv的识别方面的函数. 随带VB的使用例子

利用opencv-python 进行图像的不规则裁剪

利用opencv-python 进行图像的不规则裁剪 1利用凸包进行裁剪 2利用最小矩形裁剪

weixin_42228166的博客 9921

化学科学催化反应产率预测之Transformer建模SMILES(Datawhale AI 夏令营)

循环神经网络:由于所有的前文信息都蕴含在一个隐向量中,随着序列长度的增加,早期的上下文信息会逐渐被遗忘。卷积神经网络:受限的上下文窗口在建模长文本时存在天然不足。需要多层卷积操作才能处理长文本。在本篇文章中,我们学习了Transformer的基本架构及其在化学反应产率预测中的应用。通过利用Transformer的Encoder部分对SMILES进行建模,我们能够更有效地捕捉序列数据的特征,从而提高模型的预测性能。

不想宅的冷同学 1096

图像轮廓与图像分割修复(opencv3编程入门第八章)第二节 寻找物体的凸包

文章目录图像轮廓与图像分割修复(opencv3编程入门第八章)第二节 寻找物体的凸包凸包“寻找凸包”的库函数示例代码1示例代码2参考文献 图像轮廓与图像分割修复(opencv3编程入门第八章)第二节 寻找物体的凸包 凸包 借用百度百科的解释:凸包(Convex Hull)是一个计算几何(图形学)中的概念。在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。X的凸包可以...

qq7835144的博客 544

【python3.7】解决报错 error: Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++

解决pip安装py7zr遇到的报错问题。

水w的博客 3943

[Unity Demo]从零开始制作空洞骑士Hollow Knight第四集:制作更多的敌人

大家好久不见,终于放完中秋假期可以回自己家里打代码了,上一期我介绍了为什么和如何导入2D toolkit以及制作一个完整的敌人(就是那只蚊子包括了精灵,动画,状态机行为以及脚本)现在不妨趁热打铁制作更多的敌人。

dangoxiba的博客 1974

【OpenCV入门学习--python】凸包算法(convex hull)

凸包算法(convexhull)

qq_43536231的博客 3067

管道机器人手臂机械结构设计cad【8张】+三维图+设计说明书+绛重

履带式管道机器人适用于各种管道环境,包括直管道、弯曲管道、水平管道、垂直管道等,其灵活性和适应性使得它可以应对不同形状和尺寸的管道,完成全面的检测和维护工作。管道机器人研究具有重要的现实意义和深远的社会影响,通过提高工作效率、降低人员风险、提升服务质量、节约成本资源和促进科技创新等方面的作用,为现代工程技术领域的发展和进步做出了积极的贡献。管道机器人是一种能够在管道内部执行各种任务的智能机器人,而管道机器人的机械臂对于管道机器人在管道内执行任务的灵活性、稳定性和效率至关重要。

kejigongjiang的博客 943

Python+Opencv图像处理--基于OTSU+凸包检测的粘连大米分割

文章目录前言1.分割流程图2.读入数据总结 前言 转载请注明本文出处。 最近一段时间一直在看粘连分割,网上也有很多demo,找了一个大米的图像做测试。以下是本篇文章正文内容,下面案例可供参考。 1.分割流程图 分割总流程图如下图所示: 代码如下(示例): import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwa

m0_37968030的博客 8763

Benchmark系列——UnixBench测试项深度解析与性能优化指南

本文深度解析UnixBench基准测试套件的各项测试原理,包括Dhrystone、Whetstone、系统调用、进程管理、IPC及文件I/O等核心测试项。通过详细的测试项分析,指导用户解读测试报告,并提供针对性的内核参数调整、编译优化及系统配置实战指南,帮助用户精准定位并优化系统性能瓶颈。

weixin_29230901的博客 276

详解大端模式和小端模式

详解大端模式和小端模式 一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令

ce123的技术博客 19万+

python-opencv高级形态学处理—边缘—凸包

图像的形态学处理有很多种,其中凸包处理是一种比较常见的高级方法,其主要原理是:生成一个凸多边形,这个凸多边形将图片中所有的白色像素点都包含在内的运算。Python中有相应的实现方法。形态学处理,除了最基本的膨胀、腐蚀、开/闭运算、黑/白帽处理外,还有一些更高级的运用,如凸包,连通区域标记,删除小块区域等。形态学目的如下:图像预处理(去噪声,简化形状)增强物体结构(抽取骨骼,细化,粗化,凸包,物体标记)从背景中分隔物体物体量化描述(面积,周长,投影,Euler-Poincare特征)

实力派,无需多言! 1950

《四》:LBE,VR 大空间系列——Pico的空间扫描方式

(这里有个选项叫高精度扫描模式,这个功能在下方详细补充)系统会根据绘制的顶点,将区域分割成若干个4X4米的小方格,我们只需要根据提示,首先进入一个方格子空间内部,然后依次凝视每个区域上下左右前后六个面的小方格组,每一面4个,直至全部消失, 消失后地面会出现一个方形行走路径,我们沿着边缘正或反走一圈即可,完成后此块区域即自动消失。不过由于pico有一个高精度扫描圈,如图加粗的圆环,这个圆环的意思是在在内部的区域扫描精度较高,越远离原点的区域误差越大,所以为了更有效的利用,建议原点设置在场地中心区域。

unitygroup的博客 2887

OpenCV:第八章、图像轮廓与图像分割修复

输入图像且需为 8位单通道图像。图像的非零像素被视为 1, 0像素值被 保留为 0,所以图像为二进制。我们可以使用 compareO、 inrangeO、 thresholdO、 adaptivethresholdO、 cannyO等函数由灰度图或彩色图创建二进 制图像。此函数会在提取图像轮廓的同时修改图像的内容;2:检测到的轮廓、函数 调用后的运算结果存在这里。每个轮廓存储为一个点向量,即用 point类型 的 vector 表示;:可选的输出向量,包含图像的 拓扑信息。

qq_43267011的博客 1365

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 657

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【opencv】第8章 图像轮廓与图像分割修复

一个轮廓一般对应一系列的点,也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中,可以用findContours()函数从二值图 像中查找轮廓findContours) 函数用于在二值图像中寻找轮廓。 第一个参数,InputArray类型的image, 输入图像,即源图像,填Mat 类的 对象即可,且需为8位单通道图像。图像的非零像素被视为1,0像素值被 保留为0,所以图像为二进制。我们可以使用 compare() 、inrange()、 threshold() 、ad

Antonio915的博客 1692

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

《OpenCV3编程入门 》学习笔记 第8章 图像轮廓与图像分割修复

本章讲解如何查找轮廓并绘制轮廓,如何寻找物体的凸包,使用多边形来包围轮廓,以及计算一个图像的矩。此外还介绍了分水岭算法和图像修补操作的实现方法。

chenyijun的专栏 3085

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

掌握imgproc组件:opencv-图像轮廓与图像分割修复

opencv3编程入门

m0_50127633的博客 1287

【图像轮廓与图像分割修复】

文章目录前言1、查找并绘制轮廓C++代码示例一结果C++代码示例二结果2、寻找物体的凸包C++代码示例一结果C++代码示例二结果3、使用多边形将轮廓包围结果C++代码示例一结果C++代码示例二 前言 虽然Canny之类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体。 如何查找并绘制轮廓 如何寻找物体的凸包 如何使用多边形逼近物体 认识图像的矩 如何利用OpenCV进行图像修补 1、查找并绘制轮廓 一个轮廓一般对应一系列的点,也就是图像中的一条曲线,其表示方

weixin_43488529的博客 1213

opencv 6 图像轮廓与图像分割修复 1 查找并绘制轮廓 寻找物体的凸包

查找并绘制轮廓 寻找轮廓(findContours)函数 绘制轮廓(drawContours()函数) 基础实例程序:轮廓查找 #include <opencv2/opencv.hpp> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using name...

dipi4546的博客 254

OpenCV系列教程五:图像的分割与修复

前景和背景的可能性用GMM进行建模,基于这些模型将像素连接到两个超级终端(前景或背景),从而每条边都有一个属于前景或者背景的概率。通过距离变换得到前景的确定区域(sure_fg),通过膨胀得到背景的确定区域(sure_bg),再通过差集得到前景和背景之间的未知区域(unknown),这三部分的明确划分是成功应用分水岭算法的关键。分水岭算法的本质是基于标记的分割,为了让分水岭算法正确地找到物体的边界,需要明确的前景和背景标记以及未确定的区域(即前景和背景之间的模糊区域,需要算法来决定边界)。

qq_56591814的博客 2295

基于OpenCV的区域分割、轮廓检测和阈值处理

点击上方“小白学视觉”,选择加&#34;星标&#34;或“置顶”重磅干货,第一时间送达OpenCV是一个巨大的开源库,广泛用于计算机视觉,人工智能和图像处理领域。它在现实世界中的典型应用...

小白学视觉 6888

《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(六)图像修补

8.6 图像修补 基本思想:   利用已经被破坏区域的边缘,即边缘的颜色和结构,繁殖和混合到损坏的图像中,达到图像修补的目的。 8.6.1 实现图像修补:inpaint()函数 1.作用:   用来从扫描的照片中清除灰尘和划痕,从静态图像或视频中去除不需要的物体 2.函数原型: void inpaint(InputArray src, InputArray inpaintMask, Output...

ccchenxi的博客 682

OPENCV3编程入门--第八章(图像轮廓与图像分割,修复)学习笔记

1.查找并绘制轮廓 (1) 寻找轮廓:findContours() 函数 注: (2) 绘制轮廓:drawContours()函数 层次结构信息:https://blog.youkuaiyun.com/qq_36387683/article/details/80472043 ...

hh5233的博客 343

轮廓进阶:轮廓的矩特征计算与物体形状描述

本文深入讲解了计算机视觉中轮廓的矩特征计算与物体形状描述技术。首先介绍了核心概念,包括轮廓矩特征的定义、重要性及典型应用场景。随后详细解析了技术原理,提供了Python+OpenCV实现代码示例,涵盖图像处理、特征提取等关键技术点。文章还包含实践指导,从环境配置到基础应用示例,帮助读者掌握从图像读取、灰度转换到边缘检测的完整处理流程。该技术是计算机视觉工程师必备技能,可显著提升算法效率和模型精度,广泛应用于图像处理、目标检测等领域。

编程世界如山海,探索不止。 1万+

【OpenCV 轮廓检测与轮廓筛选】

在OpenCV中,轮廓检测和轮廓筛选是图像处理中常用的技术,用于识别和分析图像中物体的形状。通过灵活组合轮廓特征(面积、形状、凸性等),可以高效筛选出符合需求的轮廓,为后续处理提供基础。轮廓检测通常在二值图像上进行,因此需要将原图转换为灰度图并进行阈值处理或边缘检测。使用多边形近似判断轮廓是否为简单几何形状。通过外接矩形的长宽比筛选特定形状的轮廓。该函数返回轮廓的坐标点和层级关系。过滤掉面积过小或过大的轮廓。

一起学习进步! 944
上一篇: 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(一)查找并绘制轮廓
下一篇: 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(三)使用多边形将轮廓包围
ccchenxi
博客等级 码龄9年 99粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值