opencv_c++学习(二十三)

news2024/12/23 5:56:21

一、点拟合操作

在这里插入图片描述
拟合含义如上图,即为通过已知点去拟合一条直线或者一个多边形。

直线拟合函数:

fitLine(lnputArray points, OutputArray line, int distType, double param, double reps, double aeps)

points:输入待拟合直线的2D或者3D点集。
line:输出描述直线的参数,2D点集描述参数为Vec4f类型,3D点集描述参数为Vec6f类型。
distType: M-estimator算法使用的距离类型标志。
param:某些类型距离的数值参数©。如果数值为0,则自动选择最佳值。
reps:坐标原点与直线之间的距离精度,数值0表示选择自适应参数,一般常选择0.01。
acps:直线角度精度,数值0表示选择自适应参数,一般常选择0.01。
在这里插入图片描述

圆形拟合操作:

minEnclosingCircle(InputArray points, Point2f & center,float & radius)

points:待寻找包围圆形的2D点集。
center:圆形的圆心。
radius:圆形的半径。
三角形拟合操作:

minEnclosingTriangle(lnputArray points, OutputArray triangle)

points:待寻找包围三角形的2D点集。
triangle:拟合出的三角形三个顶点坐标。
本节应用案例如下:

int main() {

	//定义一个随机点图像
	Mat img(500, 500, CV_8UC3, Scalar::all(0));

	//生成随机点
	RNG& rng = theRNG();

	while (true)
	{
		int i, count = rng.uniform(1, 101);
		vector<Point>points;
		//生成随机点
		for ( i = 0; i < count; i++)
		{
			Point pt;
			pt.x = rng.uniform(img.cols / 4, img.cols * 3 / 4);
			pt.y = rng.uniform(img.rows / 4, img.rows * 3 / 4);
			points.push_back(pt);
		}

		//寻找包围点集的三角形
		vector<Point2f> triangle;
		minEnclosingTriangle(points, triangle);

		//寻找包围点集的圆形
		Point2f center;
		float radius = 0;
		minEnclosingCircle(points, center, radius);


		//输出图片
		img = Scalar::all(0);
		Mat img2;
		img.copyTo(img2);

		//在图像中绘制坐标点
		for ( i = 0; i < count; i++)
		{
			circle(img, points[i], 3, Scalar(255, 255, 255), FILLED, LINE_AA);
			circle(img2, points[i], 3, Scalar(255, 255, 255), FILLED, LINE_AA);
		}

		//绘制三角形
		for ( i = 0; i < 3; i++)
		{
			if (i == 2)
			{
				line(img, triangle[i], triangle[0], Scalar(255, 255, 255), 1, 16);
				break;
			}
			line(img, triangle[i], triangle[i + 1], Scalar(255, 255, 255), 1, 16);
		}

		//绘制圆形
		circle(img2, center, cvRound(radius), Scalar(255, 255, 255), 1, LINE_AA);

		//输出结果
		imshow("q", img);
		imshow("w", img2);

		//按ESC键退出程序
		char key = (char)waitKey();
		if (key == 27||key == 'q'||key=='Q')
		{
			break;
		}
	}
	return 0;
}

二、二维码的识别

在这里插入图片描述
二维码的定位函数:

detect (InputArray img, OutputArray points) const

img:待检测是否含有QR二维码的灰度图像或者彩色图像。
points:包含QR二维码的最小区域四边形的四个顶点坐标,即二维码的四个顶点坐标。
二维码识别函数:

QRCodeDetectore:decode(lnputArray img, lnputArraypoints, outputArray straight_qrcode = noArray())

img:含有QR二维码的图像。
points:包含QR二维码的最小区域四边形的四个顶点坐标。straight_qrcode:经过校正和二值化的QR二维码。
二维码定位与识别函数:

detectAndDecode(InputArray limg, OutputArray points = noArray(), OutputArray straight_qrcode = noArray())

img:含有QR二维码的图像。
points:包含QR二维码的最小区域四边形的四个顶点坐标。straight_qrcode:经过校正和二值化的QR二维码。

本节应用案例如下:

int main() {

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

	//转化为灰度图
	Mat gray, qrcode_bin;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	QRCodeDetector qrcodeDetector;

	//存储坐标
	vector<Point> points;
	string information;
	bool isQRcode;

	//识别二维码
	isQRcode = qrcodeDetector.detect(gray, points);

	//对二维码进行解码操作
	if (isQRcode)
	{
		information = qrcodeDetector.decode(gray, points, qrcode_bin);

		//输出二维码四个顶点的坐标
		cout << points << endl;
	}

	else
	{
		return -1;
	}

	//绘制二维码边框
	for (int i = 0; i < points.size(); i++)
	{
		if (i == points.size()-1)
		{
			line(src, points[i], points[0], Scalar(0, 0, 255), 2, 8);
			break;
		}
		line(src, points[i], points[i+1], Scalar(0, 0, 255), 2, 8);
	}

	//将解码内容输出到图片上
	putText(src, information.c_str(), Point(20, 30), 0, 1.0, Scalar(0, 0, 255), 2, 8);

	//使用函数直接定位二维码并解码
	string information2;
	vector<Point> points2;
	information2 = qrcodeDetector.detectAndDecode(gray, points2);
	//输出二维码四个顶点的坐标
	cout << points << endl;
	//将解码内容输出到图片上
	putText(src, information2.c_str(), Point(20, 30), 0, 1.0, Scalar(0, 0, 255), 2, 8);

	imshow("q", src);
	imshow("w", WINDOW_NORMAL);
	imshow("e", qrcode_bin);

	waitKey(0);
	return 0;
}

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

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

相关文章

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第二章——MindSpore调试调优

1.生态迁移 生态迁移工具使用示例 生态迁移工具技术方案 不同框架间模型定义前端表达差别巨大(相同算子的API技术难点 、 算子功能、模型构建方式差别较大)&#xff1b; 对于同一框架&#xff0c;不管前端表达差异如何&#xff0c;最终对应的计算 图是相似的。因此提出&#x…

node.js+vue房屋租赁管理系统z0g8w

本系统主要包括以下功能模块&#xff1a;租户、出租人、房源信息、预约看房、合同信息等模块。 其中设计的主要功能如下&#xff1a; &#xff08;1&#xff09;用户的注册和登录本系统&#xff0c;登录到系统的首页。 &#xff08;2&#xff09;用户可以发布自己的房源信息…

快速了解iptables

初识 iptables是什么&#xff1f; iptables是一个在Linux操作系统上使用的防火墙工具&#xff0c;它可以用于配置和管理网络数据包的过滤、转发和修改等操作。 过滤数据包&#xff1a;iptables可以根据不同的规则过滤网络数据包&#xff0c;例如根据源IP地址、目标IP地址、端…

如何在华为OD机试中获得满分?Java实现【不含101的数】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

开源开放 生态共建 | openKylin社区单位会员突破200家!

当前&#xff0c;开放、协作、共享的开源模式已成为全球软件技术和产业创新的主导&#xff0c;也为信息技术国产自主化提供了强大助力。openKylin作为中国桌面操作系统开源社区&#xff0c;以聚焦桌面操作系统根技术为核心、以孵化相关领域关键项目为目标、以布道开源文化为抓手…

堪称「史上最详细」的整车信息安全强标将发布!释放了哪些信号?

确保汽车整车信息安全&#xff0c;或成为车企们继智能化竞争的下一个竞争焦点。 可以说&#xff0c;在智能化、网联化的驱动下&#xff0c;智能汽车成为了数据收集、数据传输、数据处理的关键节点&#xff0c;消费者在享受汽车智能化带来便利的同时&#xff0c;也逐渐重视智能…

【操作系统复习】第8章 文件管理

数据项、记录和文件 数据项 ➢ 基本数据项&#xff1a;描述一个对象的某种属性&#xff0c;又称字段 ➢ 组合数据项&#xff1a;由若干个基本数据项组成记录 ➢ 记录是一组相关数据项的集合&#xff0c;用于描述一个对象在某方面的属性。 ➢ 关键字&#xff1a;唯一能…

04_GC垃圾回收

面试题&#xff1a; JVM内存模型以及分区&#xff0c;需要详细到每个区放什么 堆里面的分区&#xff1a;Eden&#xff0c;survival from to&#xff0c;老年代&#xff0c;各自的特点。 GC的三种收集方法&#xff1a;标记清除、标记整理、复制算法的原理与特点&#xff0c;分…

python+vue高校网上跳蚤二手市场的设计与实现

商品信息是卖家供应用户必不可少的一个部分。在跳蚤市场发展的整个过程中&#xff0c;商品担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类管理系统程序也在不断改进。本课题所设计的普通高校网上跳蚤市场&#xff0c;使用Django框架&#xff0c;Python语言…

【2023年电工杯数学建模竞赛】选题分析+A题B题完整思路+代码分享

思路和代码会第一时间分享出来&#xff0c;可以先关注博主 1.竞赛介绍 2.本次大赛选题分析 首先大家要清楚获奖只和比例有关&#xff0c;和具体题目关系不大&#xff0c;不会出现选难题就比简单题获奖率高很多的情况出现&#xff0c;这是一个选拔性质的比赛是按照比例来的 2…

(5.19-5.25)【大数据新闻速递】

关 注gzh“大数据食铁兽”&#xff0c;了解更多大数据快讯 【第八届亚太银行数字化创新峰会圆满落幕】 第八届亚太银行数字化创新峰会在2023年5月18日举行&#xff0c;邀请了30名大咖和超过300位行业顶尖人士参加。金融数据港和中银协中西部培训机构提供特别支持。峰会围绕银行…

Kafka实时数据即席查询应用与实践

作者&#xff1a;vivo 互联网搜索团队- Deng Jie Kafka中的实时数据是以Topic的概念进行分类存储&#xff0c;而Topic的数据是有一定时效性的&#xff0c;比如保存24小时、36小时、48小时等。而在定位一些实时数据的Case时&#xff0c;如果没有对实时数据进行历史归档&#xff…

list的基本介绍

list的基本信息&#xff1a; list是一个带头双向链表的结构。constant&#xff0c;常数、常量&#xff0c;constant time 即O(1)时间复杂度。 先来简单认识一下list list支持尾插&#xff0c;尾删&#xff0c;头插&#xff0c;头删 都是一些已知的内容。 和vector的区别就是支…

Java货运物流园管理系统源码

技术架构&#xff1a;spring boot、mybatis、redis、vue、element-ui 开发语言&#xff1a;java、vue、uniapp 开发工具&#xff1a;idea、vscode、hbuilder 前端框架&#xff1a;vue 后端框架&#xff1a;spring boot 数 据 库&#xff1a;mysql 移 动 端&#xff1a; …

vue vant 登录增加图片验证码显示

<!-- 登录表单 --><van-form submit"onLogin" :show-error"false":show-error-message"false"ref"login-form"failed"onFailed"> <van-fieldv-model"user.account"icon-prefix"toutiao"…

如何借助spire.doc,在 Word 中插入 OLE 对象

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

AI的发展将会产生一个新的阶层

随着AI的发展将会产生一个新的阶层&#xff0c;那就是无用阶层&#xff0c;而且我们很多人都处在这个阶层。自今年以来&#xff0c;AI技术的发展所带来的应用&#xff0c;给我们的除了震撼还是震撼。Open AI的GPT4模型不但能够写出媲美专家发表的论文&#xff0c;还能通过各类专…

淘宝商品列表数据接口(支持价格、销量排序)

淘宝商品列表数据接口是淘宝提供的一种可以获取淘宝商品信息的接口。通过该接口&#xff0c;可以获取到具有一定规则的商品信息&#xff0c;例如按照价格排序、按照销量排序等。接口返回的数据格式为JSON格式&#xff0c;可以方便地处理数据。 我们可以通过调用淘宝提供的API&…

Flink SQL JOIN

双流JOIN(Regular Join) ​ Regular Join 就是大家熟知的双流 Join&#xff0c;语法上就是普通的 JOIN 语法。图中案例是通过广告曝光流关联广告点击流将广告数据打宽&#xff0c;打宽后可以进一步计算广告费用。从图中可以看出&#xff0c;曝光流和点击流都会存入 join 节点的…

优雅处理HTTP请求:过滤器、拦截器、ControllerAdvice和自定义AOP

我们在开发Spring Boot应用程序时&#xff0c;经常会遇到需要对HTTP请求进行一些处理的情况&#xff0c;例如鉴权、数据校验、请求日志记录等等。在处理HTTP请求时&#xff0c;我们可以使用四种不同的技术来实现这些功能&#xff1a;过滤器、拦截器、ControllerAdvice和自定义A…