opencv_c++学习(二十二)

news2024/11/19 20:36:53

一、凸包检测

在这里插入图片描述
图中左侧为边缘检测的效果,中间为图像经过二值化的效果,右图为凸包检测效果。

convexHull(lnputArraypoints, OutputArray hull,bool clockwise = false, bool returnPoints = true)

points:输入的2D点集。
hull:输出凸包的顶点。
clockwise:方向标志,当参数为true时,凸包顺序为顺时针方向,否则为逆时针方向。
returnPoints:输出数据的类型标志,当参数为true时第二个参数输出的结果是凸包顶点的坐标,否则第二个参数输出的结果是凸包顶点的索引。
这里的计算实例如下:

int main() {

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

	Mat gray, binary;
	//转化为灰度图
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//二值化
	threshold(gray, binary, 105, 255, THRESH_BINARY);

	//开运算去除细小区域
	Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(binary, binary, MORPH_RECT, k);

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

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

	for (int i = 0; i < contours.size(); i++)
	{
		//计算凸包
		vector<Point>hull;
		convexHull(contours[i], hull);

		//绘制凸包
		for (int j = 0; j < hull.size(); j++)
		{
			//绘制凸包顶点
			circle(src, hull[j], 4, Scalar(255, 0, 0), 2, 8, 0);
			//连接凸包
			//将起始点与终点相连
			if (j == hull.size()-1)
			{
				line(src, hull[j], hull[0], Scalar(0, 0, 255), 2, 8, 0);
				break;
			}
			line(src, hull[j], hull[j+1], Scalar(0, 0, 255), 2, 8, 0);
		}
	}

	imshow("q", src);

	waitKey(0);
	return 0;
}

二、直线检测

检测直线的霍夫变换原理:
在这里插入图片描述
先看左上角的图像,图中我们可以看出三条直线都经过了一个点。这里我们可以将y=kx+b一个函数描述这三条直线。由于都经过一个点,所以(x,y)的参数是固定的,右上角的图像为k、b的参数空间。也就是说参数空间中的每一个点都可以描述原空间的每一条直线。
在这里插入图片描述
上图中左上方图片可以看出,这三个点绘制成的直线没有斜率k,因此不能在参数空间上表示该直线。这时我们可以采用上图中的下部分的方法:可以用直线到坐标原点的距离,以及垂线与x轴的夹角来表示这一直线。
检测直线过程:
在这里插入图片描述
标准霍夫变换函数:

HoughLines(IlnputArray image, OutputArray lines,double rho, double theta, int threshold, double srn = 0, double stn = 0, double min_theta = 0, double max_theta = cv_PI)

image:目标图像。
lines: 检测直线的输出量。
rho:离散化后的单位长度。
theta:离散化后的单位角度。
threshold:步骤三中的阈值。
srn、stn:当两参数为0时,则为标准的霍夫变换,不为零则为多尺度霍夫变换。
min_theta、max_theta:角度最大最小值。
渐进概率式霍夫变换:

HoughllLinesP(InputArrayimage, OutputArray lines, double rho, double theta, int threshold, minLineLength =, void cv=HoughllLinesP( InputArrayimage, OutputArray lines.double 0, double maxLineGap = 0)

image:待检测直线的原图像,必须是CV_8C的单通道二值图像。
lines:霍夫变换检测到的直线输出量,每一条直线都由4个参数进行描述,分别是直线两个端点的坐标rho:以像素为单位的距离分辨率。
theta:以弧度为单位的角度分辨率。
threshold:累加器的阈值。
minLineLength:直线的最小长度,当检测直线的长度小于该数值时将会被剔除。
maxLineGap:允许将同一行两个点连接起来的最大距离。
标准霍夫变换应用案例:

void drawLine(Mat &img,  //原图像
	vector<Vec2f> lines, //检测的直线数据
	double rows, //原图的行数
	double cols,//原图的列数
	Scalar scalar, //绘制直线的颜色
	int n //绘制直线的线宽
	)
{
	Point pt1, pt2;
	for (size_t i = 0; i < lines.size(); i++)
	{
		float rho = lines[i][0]; //直线距离坐标原点的距离
		float theta = lines[i][1]; //直线过坐标原点垂线与x轴的夹角
		double a = cos(theta); //夹角的余弦值
		double b = sin(theta);//夹角的正弦值
		double x0 = a * rho, y0 = b * rho;//直角与过坐标原点的垂线交点
		double length = max(rows, cols); //  图像高度的最大值、计算直线上的一点

		pt1.x = cvRound(x0 + length * (-b));
		pt1.y = cvRound(y0 + length * (a));

		//计算直线上另一点
		pt2.x = cvRound(x0 - length * (-b));
		pt2.y = cvRound(y0 - length * (a));
		//两点绘制一条直线
		line(img, pt1, pt2, scalar, n);
	}


}

int main() {

	//以灰度图形式读取图片
	Mat src = imread("2.jpg", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//检测边缘图像,并二值化
	Mat edge;
	Canny(src, edge, 80, 180, 3, false);
	//进行二值化操作
	threshold(edge, edge, 170, 255, THRESH_BINARY);

	//使用累加器检测直线
	vector<Vec2f> line1, line2;
	HoughLines(edge, line1, 1, CV_PI / 180, 50, 0, 0);
	HoughLines(edge, line2, 1, CV_PI / 180, 150, 0, 0);

	//在原图中绘制直线
	Mat img1, img2;
	//深拷贝出两个原图像,对比两个变换的结果
	src.copyTo(img1);
	src.copyTo(img2);

	//绘制图像
	drawLine(img1, line1, edge.rows, edge.cols, Scalar(255), 2);
	drawLine(img2, line2, edge.rows, edge.cols, Scalar(255), 2);

	imshow("a", img1);
	imshow("b", img2);
	imshow("c", edge);
	waitKey(0);
	return 0;
}

运行上述的代码可以显示出如下三个图片:
边缘检测效果:
在这里插入图片描述
阈值较大的显示效果:
在这里插入图片描述
阈值较小的显示效果:
在这里插入图片描述
渐进概率霍夫变换应用案例:

int main() {

	//以灰度图形式读取图片
	Mat src = imread("2.jpg", IMREAD_GRAYSCALE);
	if (src.empty())
	{
		printf("不能打开空图片");
		return -1;
	}

	//检测边缘图像,并二值化
	Mat edge;
	Canny(src, edge, 80, 180, 3, false);

	//使用渐进式霍夫变换提取直线
	vector<Vec4i> linesP1, linesP2;
	//两个点连接最大距离10
	HoughLinesP(edge, linesP1, 1, CV_PI / 180, 150, 30, 10);
	//两个点连接最大距离30
	HoughLinesP(edge, linesP2, 1, CV_PI / 180, 150, 30, 30);

	//分别绘制两个不同阈值的直线
	Mat img1;
	src.copyTo(img1);
	for (size_t i = 0; i < linesP1.size(); i++)
	{
		line(img1, Point(linesP1[i][0], linesP1[i][1]), Point(linesP1[i][2], linesP1[i][3]), Scalar(255), 3);
	}

	imshow("q", img1);

	Mat img2;
	src.copyTo(img2);
	for (size_t i = 0; i < linesP2.size(); i++)
	{
		line(img2, Point(linesP2[i][0], linesP2[i][1]), Point(linesP2[i][2], linesP2[i][3]), Scalar(255), 3);
	}

	imshow("q", img1);
	imshow("w", img2);

	waitKey(0);
	return 0;
}

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

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

相关文章

【大学物理实验】基本测量

50分度的游标卡尺&#xff0c;最小分度为&#xff1a; A. 0.1mm B. 0.2mm C. 0.5mm D. 0.02mm 正确答案&#xff1a; D 保存游标卡尺和螺旋测微器是&#xff0c;下面说法正确的是&#xff1a; A. 游标卡尺测量位置应闭合&#xff0c;螺旋测微器小砧和螺杆间隙也应闭合 B. 游标…

PyG的Planetoid无法直接下载Cora等数据集的解决方法

问题描述&#xff1a; 在使用PyG的时候&#xff0c;通常会涉及到一些公共数据集的下载&#xff0c;由于网络问题&#xff0c;导致无法下载出现以下问题&#xff1a; 尝试了很多的方法都没有成功&#xff08;主要是个人比较菜&#xff01;&#xff09;。但是皇天不负有心人&am…

基于Springboot的高校固定资产管理系统的设计与实现(源码完整)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据你想解决的问题&#xff0c;今天给…

1.标注自己的关键点检测数据集

1.标注自己的关键点检测数据集 1.1 labelme标注数据 labelme GitHub项目地址&#xff1a;https://github.com/wkentaro/labelme 1.1.1exe文件下载 https://github.com/wkentaro/labelme/releases 可直接下载打包好的exe文件 1.1.2python安装labelme cmd命令行中输入以下命…

极大似然估计法及其损失函数的优化方法

二分类-逻辑回归模型 1.模型函数 1&#xff09;多元线性回归函数&#xff1a; Z ^ 计算 X W T \hat{Z}_{计算} XW^T Z^计算​XWT 2&#xff09;softmax函数&#xff1a; Y ^ 模型 S i g m o i d ( Z ^ 计算 ) 1 1 e − Z ^ 计算 \hat{Y}_{模型} Sigmoid(\hat{Z}_{计算})…

继瑞吉外卖后的又一个项目——SpringBoot+Vued前后端的博客系统

文章目录 博客系统项目介绍前言项目演示前台演示后台演示 组织结构后端组织结构前端组织结构 技术选型前端技术后端技术架构图系统架构图业务架构图 模块介绍前端模块后端模块 环境搭建开发工具开发环境项目运行 未完待续结语 博客系统项目介绍 前言 本项目已开源在Gitee 后端…

【P32】JMeter While 控制器(While Controller)

文章目录 一、While 控制器&#xff08;While Controller&#xff09;参数说明二、测试计划设计2.1、变量2.2、函数2.2.1、groovy脚本2.2.2、jex13脚本2.2.3、js脚本 一、While 控制器&#xff08;While Controller&#xff09;参数说明 可以对部分逻辑按变量条件进行循环迭代…

【算法】—— 简单多状态 dp 问题

在上期&#xff0c;我给大家讲解了关于单个状态下的dp问题&#xff0c;本期我给大家讲述几道关于多状态下的dp问题。希望大家有所帮助&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;粉刷房⼦ &#xff08;二&#xff09;买卖股票的最佳时机含冷冻期 …

破解提升 LLMs 性能的黑匣子—— LlamaIndex

“可以将 LlamaIndex 视为外部数据和 LLM 连接在一起的黑匣子。”在 Zilliz 组织的网络研讨会中&#xff0c;LlamaIndex 的联合创始人兼首席执行官 Jerry Liu 曾这样说道。 对于 Jerry Liu 的这个比喻&#xff0c;熟悉 LLMs 的开发者会觉得颇为贴切&#xff0c;尤其是对于那些想…

Chinese-LLaMA-Alpaca代码实战

文章目录 微调chinese-alpaca部署llama.cpp将FP16模型量化为4-bit 项目地址&#xff1a; https://github.com/ymcui/Chinese-LLaMA-Alpaca 微调chinese-alpaca 本项目基于中文数据 开源了使用中文文本数据预训练的中文LLaMA大模型&#xff08;7B、13B&#xff09;开源了进一…

JavaFX【TableView使用详解】

目录 概述 组件 Student ObservableList TableView setCellValueFactory() TableColumn 1. Callback 2. PropertyValueFactory 增加到末行 1、tableView.getItems().add(Student s) 2、list.add(Student s) 删除指定行 1、tableView.getItems().remove(int i) 2、…

软件测试完后,运行后还有BUG,测试人员就应该背锅吗?

测试完成后还有bug&#xff0c;测试人员肯定是有责任的&#xff0c;第一时间要赶紧处理而不是着急甩锅。但是这口锅全部扣测试身上&#xff0c;明显也是不能接受的&#xff0c;关键在于测试人员需要找出足够的证据来保护自己。 或许很多人会说测试不可能发现所有的bug&#xf…

软件测试人的第一个实战项目:web端(视频教程+文档+用例库)

最近很多自学测试的小伙伴在问我&#xff0c;学完基础的知识后面临着项目问题&#xff0c;网上项目大都不全&#xff0c;而且也不知道该怎么做&#xff0c;不知道做哪些项目能帮助自己提升 今天给大家分享一个web软件测试实战项目&#xff0c;该项目对新手十分友好&#xff0c;…

STM32入门100步(第4步~第5步)

第4~5步 STM32内部核心功能 前两节中,我们了解了什么是ARM、什么是STM32系列,接下来就是了解具体的一款STM32单片机的内部功能。单片机就是一种微小型计算机,其核心原理就是计算机原理。对于其他非ARM构架的单片机来说学习过程也是相似的。 我们学习的是STM32F103C8T6这款单…

细说前端打包发布后,浏览器缓存如何清理?其实只需要简单的webpack配置就行

前言 有没有这么一种场景&#xff0c;项目上线后&#xff0c;客户使用过程中发现了bug&#xff0c;你急急忙忙改完&#xff0c;发布。但你发布后 测试人员或者客户会说&#xff1a;“你这改了没用啊”。 你&#xff1a;“清下缓存试试” 客户&#xff1a;“&#xff1f;&am…

c#——WCF和HTTP文件传输实验

&#xff08;1&#xff09;掌握HTTP协议下WCF服务应用程序构建方法。 &#xff08;2&#xff09;掌握WCF客户端和服务端的消息交换模式。 &#xff08;3&#xff09;掌握协定的设计及实现方法。 &#xff08;4&#xff09;熟悉WCF和HTTP的相关绑定设置。 &#xff08;5&#xf…

CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)

文章目录 1、CentOS安装OpenSSL1.1.1&#xff08;前置环境&#xff09;2、CentOS安装 Python 3.103、创建虚拟环境4、运行Django项目 1、CentOS安装OpenSSL1.1.1&#xff08;前置环境&#xff09; 编译安装Python3.10时需要openssl1.1.1 查看当前版本 & 删除openssl1.0 …

Java高并发核心编程—JUC显示锁原理

注&#xff1a;本笔记是阅读《Java高并发核心编程卷2》整理的笔记&#xff01; 显示锁 使用Java内置锁时&#xff0c;不需要通过Java代码显式地对同步对象的监视器进行抢占和释放&#xff0c;这些工作由JVM底层完成&#xff0c;而且任何一个Java对象都能作为一个内置锁使用&a…

Apache Kafka - ConsumerInterceptor 实战 (1)

文章目录 概述使用场景实战配置文件配置类自定义ConSumerInterceptor使用 概述 ConsumerInterceptor是Kafka中的一个重要组件&#xff0c;它允许开发人员在Kafka消费者端拦截和修改消息的处理过程。ConsumerInterceptor可以用于实现各种功能&#xff0c;从消息监控到数据转换和…

【Python开发】FastAPI 01:hello world

FastAPI 是一个轻量级的后端框架&#xff0c;对于定制化不高或者功能简单的业务完全可以拿他作为后台。 FastAPI 一个比较重要的特性就是异步&#xff0c;简单来说就是相比 django 和 flask 快&#xff0c;FastAPI 和 flask 的语法类似。本篇文章介绍 FastAPI 运用的简单实例&a…