opencv_c++学习(二十一)

news2024/9/20 10:44:20

一、图像的轮廓检测

在这里插入图片描述
轮廓检测函数:

findContours(lnputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode, int method, Point offset = Point())

image:输入图像,数据类型为CV_8U的单通道灰度图像或者二值化图像。contours:检测到的轮廓,每个轮廓中存放着像素的坐标。
mode:轮廓检测模式标志。
method:轮廓逼近方法标志。
offset:每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出的轮廓并基于整个图像分析轮廓的场景中。
轮廓绘制函数:

drawContours(InputoutputArray image, lnputArrayOfArrays contours,int contourldx, const Scalar & color, int thickness = 1, int lineType = LINE_8,hierarchy =, lnputArray noArray (), int maxLevel = INT_PAX, Point offset = Point())

image:绘制轮廓的目标图像。
contours:所有将要绘制的轮廓。
contourldx:要绘制的轮廓的参数,如果是负数,则绘制所有的轮廓。
color:绘制轮廓的颜色。
应用案例代码如下:

int main() {

	//更改输出界面的颜色
	system("color F0");

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat gray, binary;
	//转化为灰度图
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//高斯平滑滤波
	GaussianBlur(gray, gray, Size(13, 13), 4, 4);
	//自适应二值化
	threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//绘制轮廓
	for (int i = 0; i < hierarchy.size(); i++)
	{
		cout << hierarchy[i] << endl;
	}

	for (int t = 0; t < contours.size(); t++)
	{
		drawContours(src, contours, -1, Scalar(0, 0, 255), 2, 6);
		imshow("q", src);
		waitKey(0);
	}

	//输出轮廓结构描述

	return 0;
}

二、轮廓信息统计

轮廓面积计算函数:

contourArea(lnputArray contour, bool oriented = false)

contour:轮廓的像素点。
oriented:区域面积是否具有方向的标志,true表示面积具有方向性,false表示不具有方向性,默认值为不具有方向性的false。
轮廓长度计算函数:

arcLength(InputArray curve, bool closed)

curve:轮廓或者曲线的2D像素点。
closed:轮廓或者曲线是否闭合标志,true表示闭合。
应用案例如下:

int main() {

	//更改输出界面的颜色
	system("color F0");

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	Mat gray, binary;
	//转化为灰度图
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//高斯平滑滤波
	GaussianBlur(gray, gray, Size(13, 13), 4, 4);
	//自适应二值化
	threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//输出轮廓面积
	for (int i = 0; i < contours.size(); i++)
	{
		double area1 = contourArea(contours[i]);
		cout << area1 << endl;
	}

	//输出轮廓长度
	for (int i = 0; i < contours.size(); i++)
	{
		double length1 = arcLength(contours[i], true);
		cout << length1 << endl;
	}

	return 0;
}

三、轮廓外接多边形拟合

轮廓外接矩形函数:

boundingRect(lnputArray array)

轮廓最小面积外界矩形:

minAreaRect(lnputArray points)

array:输入的灰度图像或者2D点集,数据类型为vector或者Mat。

轮廓多边形拟合:

approxPolyDP(InputArray curve, OutputArray approxCurve,double epsilon, bool closed)

curve:输入轮廓像素点。
approxCurve:多边形逼近结果,以多边形顶点坐标的形式给出。
epsilon:逼近的精度,即原始曲线和逼近曲线之间的最大距离。
closed:逼近曲线是否为封闭曲线的标志,true表示曲线封闭,即最后一个顶点与第一个顶点相连。
轮廓外接矩形函数、轮廓最小面积外界矩形应用案例:

int main() {

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//深拷贝两张图像,用来做不同的外接图形操作
	Mat img1, img2;
	src.copyTo(img1);
	src.copyTo(img2);
	
	//canny的边缘检测
	Mat canny;
	Canny(src, canny, 80, 160, 3, false);

	//膨胀运算,去除细小缝隙
	Mat kernel = getStructuringElement(0, Size(3, 3));
	dilate(canny, canny, kernel);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(canny, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//寻找轮廓的外接矩形
	for (int n = 0; n < contours.size(); n++)
	{
		//最大外接矩形
		Rect rect = boundingRect(contours[n]);
		rectangle(img1, rect, Scalar(0, 0, 255), 2, 8, 0);

		//最小外接矩形
		RotatedRect rrect = minAreaRect(contours[n]);
		Point2f points[4];
		
		//读取最小外接矩形的四个顶点
		rrect.points(points);

		//最小外接矩形中心
		Point2f cpt = rrect.center;

		//绘制转转矩形与中心位置
		for (int i = 0; i < 4; i++)
		{
			if (i == 3)
			{
				line(img2, points[i], points[0], Scalar(0, 255, 0), 2, 8, 0);
				break;
			}
			line(img2, points[i], points[i+1], Scalar(0, 255, 0), 2, 8, 0);
		}
		//绘制矩形中心
		circle(img2, cpt, 4, Scalar(255, 0, 0), -1, 8, 0);

		imshow("q", img1);
		imshow("w", img2);
		waitKey(0);
		return 0;
	}
}

轮廓多边形拟合应用案例:

void drawapp(Mat result, Mat img2)
{
	for (int n = 0; n < result.rows; n++)
	{
		//将第一个点与最后一个点相连
		if (n == result.rows - 1)
		{
			Vec2i point1 = result.at<Vec2i>(n);
			Vec2i point2 = result.at<Vec2i>(0);
			line(img2, point1, point2, Scalar(0, 255, 0), 2, 8, 0);
			break;
		}

		Vec2i point1 = result.at<Vec2i>(n);
		Vec2i point2 = result.at<Vec2i>(n + 1);
		line(img2, point1, point2, Scalar(0, 255, 0), 2, 8, 0);

	}
}

int main() {

	//读取图片
	Mat src = imread("图片1.png");
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	
	//canny的边缘检测
	Mat canny;
	Canny(src, canny, 80, 160, 3, false);

	//膨胀运算,去除细小缝隙
	Mat kernel = getStructuringElement(0, Size(3, 3));
	dilate(canny, canny, kernel);

	//轮廓检测
	vector<vector<Point>>contours;
	//存放轮廓结构变量
	vector<Vec4i>hierarchy;

	findContours(canny, contours, hierarchy, 0, 2, Point());

	//绘制多边形
	for (int i = 0; i < contours.size(); i++)
	{
		//用最小外接矩形求取轮廓中心
		RotatedRect rrect = minAreaRect(contours[i]);

		//最小外接矩形中心
		Point2f cpt = rrect.center;

		circle(src, cpt, 2, Scalar(255, 0, 0), 2, 8, 0);

		Mat result;
		//进行多边形拟合
		approxPolyDP(contours[i], result, 4, true);

		//绘制多边形
		drawapp(result, src);

	}

	imshow("q", src);
	waitKey(0);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/565304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mPython软件使用指南

①软件界面 一、软件界面的介绍 1.模式切换 硬件编程 Python3.6 Jupyter python3.6模式细节补充&#xff08;一般不使用该模式&#xff0c;此处可跳过&#xff09; Python3.6模式的界面 左侧指令分类栏 Python3.6模式的图形化指令分类分为&#xff1a; Python语法基础相关指令&…

Ajax 获取 JSON数据

文章目录 Ajax获取JSON数据 Ajax获取JSON数据 Ajax 全称“Asynchronous JavaScript and XML”&#xff0c;译为“异步 JavaScript 和 XML”&#xff0c;程序员们习惯称之为“阿贾克斯”&#xff0c;通过 Ajax 我们可以异步在服务器与客户端之间传递数据。在 Ajax 中&#xff0…

机器学习期末复习 贝叶斯分类器

先验概率与后验概率 先验概率&#xff1a;对于某一个概率事件&#xff0c;我们都会有基于自己已有的知识&#xff0c;对于这个概率事件会分别以什么概率出现各种结果会有一个预先的估计&#xff0c;而这个估计并未考虑到任何相关因素。 对于分类数据来说&#xff0c;先验概率就…

【lager】日志系统1:允许多个日志源向多个最终用户进行日志记录 windows cmake构建

【xerces】xerces-c-3.2.4 版本的cmake windows vs2022 构建 lager Light-weight Accumulator Gathering Efficiently in Real-time lagerLAGER(实时高效收集的轻量级累加器)是一个可靠的日志系统,旨在允许多个日志源向多个最终用户进行日志记录。该设计文档概述了整个系统的…

Android---APK 瘦身

在 APP 开发过程中&#xff0c;随着业务迭代&#xff0c;apk 体积逐渐变大。项目中累积的无用资源&#xff0c;未压缩的图片资源等&#xff0c;都为 apk 带来了不必要的体积增加。而 APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。 APK 结构 APK 文件由一个 Zip…

浅析Koa2中控制器

控制器 什么是控制器 拿到路由分配的任务&#xff0c;并执行 路由的功能是根据不同的 url, 来分配不同的任务。 控制器是拿到路由分配的任务并执行&#xff0c;是注册在路由中的中间件。 所以在 koa 中, 控制器也是一个中间件。 为什么要使用控制器 获取HTTP请求参数处理…

article-码垛机器人admas仿真

按照运动学仿真的类似步骤为机器人添加材料、运动副和关节驱动&#xff0c;给机器人手腕末端施加50N最大负载&#xff0c;仿真模型如图5-17。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXYQVZPq-1684936426972)(data:image/svgxml;utf8, )] 图…

OpenGL之纹理

文章目录 什么是纹理加载与创建纹理stb_image.h加载并生成纹理 纹理环绕方式纹理过滤多级渐远纹理 纹理单元 什么是纹理 我们已经了解到&#xff0c;我们可以为每个顶点添加颜色来增加图形的细节&#xff0c;从而创建出有趣的图像。但是&#xff0c;如果想让图形看起来更真实&a…

unity制作一款塔防游戏

文章目录 介绍寻路系统怪物生成器制作3种初级炮台、3种升级炮台设置炮台属性选择炮台&#xff0c;添加监听事件炮弹追踪攻击敌人拖动鼠标实现相机视角转换鼠标光标放在cube上变色文字动画 介绍 关键技术&#xff1a; 寻路系统 生成怪物算法 粒子系统 line renderer制作追踪射线…

python基本操作1(速通版)

目录 一、input输入函数 二、格式化字符输出 三、函数的基本操作 1.return返回值的问题 2.参数传递 四、运算符 1.关系比较符 2.逻辑运算符 五、if语句 六、随机数 七、循环 1.while语句的基本应用 2.break语句 2.continue语句 3.猜拳游戏 4.三目运算符 6.for…

让input框只输入英文

解决扫码枪在中文输入法时扫码冲突 扫码枪在扫完码时会自动回车&#xff0c;这时如果是中文输入法就会触发输入法联想&#xff0c;再加一个回车&#xff0c;那么input框输入的就成中文了。如果可以控制input框只能输入英文那就好了。css有一个属性&#xff08;ime-mode&#xf…

ChatGpt论文指令,很全!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 ChatGPT的能力大家肯定都听说过&#xff0c;很多学生应该都亲身体验过。它在自然语言处理方面的出色 除了写代码 写论文也是超…

【计算思维题】少儿编程 蓝桥杯青少组计算思维真题及详细解析第4套

少儿编程 蓝桥杯青少组计算思维真题及详细解析第4套 1、下面哪个图形与其它图形不同 A、 B、 C、 D、 答案:D 考点分析:主要考查小朋友们的观察能力,从给定的图中可以看到前三个选项都是90度直角,最后一个是锐角,所以答案D 2、下列哪个选项是由下图旋转得到的

位运算【算法基础】

目录 知识点&#xff1a; 题目&#xff1a; 模板 关于为什么负数要用补码 知识点&#xff1a; 如果想看整数n的二进制表示中的第k位&#xff08;从0开始&#xff09;是几&#xff1f; &#xff08;1&#xff09;把第k位右移到个位n>>k &#xff08;2&#xff09;看x…

大模型时代,「重识」云知声

在山海大模型发布会现场&#xff0c;黄伟有一句话令人印象深刻&#xff0c;“云知声的过去十年&#xff0c;就是为山海而生。 作者| 皮爷 出品|产业家 “谁能做成中国最好的大模型&#xff1f;”在今年3月一个北京投资人的内部分享会上&#xff0c;有人满怀期待地提出这样…

Java SPI 一 之SPI(Service Provider Interface)进阶 AutoService

​ 一、SPI&#xff08;Service Provider Interface&#xff09; 1.1 介绍 SPI&#xff08;Service Provider Interface&#xff09;&#xff0c;是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制)&#xff0c;可以用来启用框架扩展和替换组件&#xff0c;其…

Admin.NET管理系统(c#+vue3)前后端学习笔记

我的学习笔记 - 9iAdmin.NET 欢迎学习交流&#xff08;一&#xff09;前端笔记1.1 关于.env的设置1.2 关于路由模式问题1.3 关于 vue.config.ts1.4 关于 打包&#xff08;pnpm run build&#xff09;溢出问题1.5 关于 打包&#xff08;pnpm run build&#xff09;后部署到IIS重…

article-六轴码垛机器人admas正逆运动学仿真

基座自由度、大臂摆动自由度、小臂摆动自由度、腕部Y轴摆动自由度、腕部Z轴摆动自由度及其腕部末端X轴旋转自由度 其导入过程为&#xff1a; 机器人三维模型总体有6个部分。打开机器人的SolidWork三维模型&#xff0c;依次另存为6个“Parasolid(x_t)”类型的文件。打开ADAMS/…

【MATLAB第36期】基于MATLAB的QOWOA-LSTM鲸鱼优化算法准反向策略的WOA优化LSTM时间序列预测模型 优势明显,注释详细,绘图丰富

【MATLAB第36期】基于MATLAB的QOWOA-LSTM鲸鱼优化算法准反向策略的QOWOA优化LSTM时间序列预测模型&#xff0c;优势明显&#xff0c;注释详细&#xff0c;绘图丰富 一、代码优势 1.使用优化后的QOWOA算法优化LSTM超参数&#xff08;学习率&#xff0c;隐藏层节点&#xff0c;…

2020下半年上午题

2020下半年 d a b 小阶向大阶对齐 b b 平均cpi: MIPS: d c 公加验&#xff0c;私解签 加密防止被动攻击&#xff0c;认证防止主动攻击 a 访问控制包括&#xff1a;授权&#xff0c;确定存取权限&#xff0c;实施存取权限 c a c a 先申请先得 b b 著作权包括&…