OpenCV图像处理——获取穿过圆的直线与圆相交的两个点

news2024/11/15 7:13:36

在OpenCV中,没有直接的函数来计算直线与圆的交点,但可以通过数学方法来实现这一功能。以下是计算直线与圆交点的步骤,以及相应的C++代码示例:

  1. 确定直线方程:使用直线上的两个点 P 1 ( x 1 , y 1 ) P1(x1, y1) P1(x1,y1) P 2 ( x 2 , y 2 ) P2(x2, y2) P2(x2,y2)来确定直线的斜率 m m m和截距 b b b。直线方程可以表示为 y = m x + b y = mx + b y=mx+b

  2. 代入圆的方程:将直线方程 y = m x + b y = mx + b y=mx+b代入圆的方程 ( x − c x ) 2 + ( y − c y ) 2 = r 2 (x - cx)^2 + (y - cy)^2 = r^2 (xcx)2+(ycy)2=r2

  3. 解二次方程:将上述方程转换为关于 x x x的二次方程,然后使用求根公式求解。

  4. 计算交点:对于二次方程的每个根,计算相应的 y y y值,得到交点的坐标。

  5. 验证交点:确保每个计算出的点都在圆的边界内,并且位于直线上。

C++ 代码示例

#include <opencv2/opencv.hpp>
#include <iostream>
#include <cmath>

using namespace cv;
using namespace std;

bool findLineCircleIntersections(cv::Point2f center, float redius,
	Point2f P1, Point2f P2, Point2f& c1, Point2f& c2)
{
	// 圆心和半径
	float x1 = P1.x;
	float y1 = P1.y;
	float x2 = P2.x;
	float y2 = P2.y;

	// 直线的斜率和截距
	float k, b;
	if (x1 == x2) {
		k = std::numeric_limits<float>::infinity();  // 垂直线
		b = x1;  // x = b
	}
	else {
		k = (y2 - y1) / (x2 - x1);  // 斜率
		b = y1 - k * x1;  // 截距
	}

	// 方程: (x - cx)^2 + (kx + b - cy)^2 = r^2
	// 展开并合并同类项得到二次方程 ax^2 + bx + c = 0
	float A = 1 + k * k;
	float B = 2 * (k * (b - center.y) - center.x);
	float C = center.x * center.x + (b - center.y) * (b - center.y) - redius * redius;

	// 计算判别式
	float delta = B * B - 4 * A * C;
	if (delta < 0) {
		// 没有交点
		return false;
	}

	// 解二次方程
	float sqrtDelta = sqrt(delta);
	float x1_intersect = (-B + sqrtDelta) / (2 * A);
	float x2_intersect = (-B - sqrtDelta) / (2 * A);
	float y1_intersect = k * x1_intersect + b;
	float y2_intersect = k * x2_intersect + b;

	c1 = Point2f(x1_intersect, y1_intersect);
	c2 = Point2f(x2_intersect, y2_intersect);
	return true;
}

int main()
{
	cv::Mat cv_src(cv::Size(640, 640), CV_8UC3, cv::Scalar(255,255,255));
	float cx = 100.0, cy = 100.0, r = 50.0;  // 圆心和半径
	Point2f P1(10, 120.0);  // 直线上的点1
	Point2f P2(120.0, 50.0);  // 直线上的点2
	Point2f c1, c2;

	cv::circle(cv_src, cv::Point2f(100.0, 100.0), 50, cv::Scalar(0,0,0), 1, cv::LINE_AA);
	cv::line(cv_src, P1, P2, cv::Scalar(0,255,0), 1, cv::LINE_AA);

	cv::imshow("src", cv_src);

	cv::Mat cv_dst = cv_src.clone();

	if (findLineCircleIntersections(cv::Point2f(cx, cy), r, P1, P2, c1, c2))
	{
		cv::circle(cv_dst, c1, 10, cv::Scalar(0,0,255),1, cv::LINE_AA);
		cv::circle(cv_dst, c2, 10, cv::Scalar(0,0,255),1,cv::LINE_AA);
		cout << "Intersection points: (" << c1.x << ", " << c1.y << ") and ("
			<< c2.x << ", " << c2.y << ")" << endl;
	}
	else
	{
		cout << "No intersection points found." << endl;
	}

	cv::imshow("dst", cv_dst);
	cv::waitKey(0);

	return 0;
}

在这里插入图片描述
实现的效果:
在这里插入图片描述

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

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

相关文章

旷野之间17 - 适合所有人的 Transformer

最初出现在著名论文《Attention is all your need》中&#xff0c;基于Transformer的架构已成为大多数成功的人工智能模型中必不可少的。 然而&#xff0c;许多用户甚至基于人工智能的产品的创造者可能不了解Transformer是什么或它是如何工作的。 嗯&#xff0c;阅读研究论文…

MVC之 IHttpModule管道模型《二》

》》》注意&#xff1a;在http请求的处理过程中&#xff0c;只能调用一个HttpHandler&#xff0c;但可以调用多个HttpModule。 HTTP Modules ASP.NET请求处理过程是基于管道模型的&#xff0c;这个管道模型是由多个HttpModule和HttpHandler组成&#xff0c;当请求到达HttpMod…

Linux 扩展硬盘容量

根分区的硬盘容量不够了需要添加容量 扩展硬盘容量前提是需要虚拟机关机才能进行以下操作 在虚拟中找到虚拟机设置 >> 点击硬盘 >> 选择扩展 >> 输入自已要扩展的大小 >> 确定 这些设置好之后&#xff0c;启动虚拟机 fdisk /dev/sda n p 三个回车…

Nginx入门到精通七(Nginx原理)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

基于matlab的SVR回归模型

1 原理 SVR&#xff08;Support Vector Regression&#xff09;回归预测原理&#xff0c;基于支持向量机&#xff08;SVM&#xff09;的回归分支&#xff0c;其核心思想是通过寻找一个最优的超平面来进行回归预测&#xff0c;并处理非线性回归问题。以下是SVR回归预测原理的系统…

猴子吃桃(迭代算法)

猴子与桃纠缠 传说很久很久以前&#xff0c;一只小猴子听妈妈的话&#xff0c;不远万里&#xff0c;爬山涉水专门跑到王母娘娘的蟠桃园里偷桃子吃&#xff0c;小猴子趁王母娘娘闭关修炼&#xff0c;偷了许多桃子&#xff0c;直到被蟠桃园的守卫发现&#xff0c;才恋恋不舍的逃走…

AWS-S3实现Minio分片上传、断点续传、秒传、分片下载、暂停下载

文章目录 前言一、功能展示上传功能点下载功能点效果展示 二、思路流程上传流程下载流程 三、代码示例四、疑问 前言 Amazon Simple Storage Service&#xff08;S3&#xff09;&#xff0c;简单存储服务&#xff0c;是一个公开的云存储服务。Web应用程序开发人员可以使用它存…

oracle数据库的plsql免安装版安装

这个是连接oracle数据库的&#xff0c;注意安装不能有中文路径。以下只是示例。 1、打开D:\ruanjian\plsql\plsql\plsql&#xff0c;发送plsqldev.exe快捷方式到桌面。 2、新弹出的页面填写cancel,什么也不写。 3、将instanceclient解压&#xff0c;并复制文件路径。 修改tool…

mysql5.7版本字符集编码

默认character_set_databaselatin1 当你字段插入中文值的时候&#xff0c;会报错。 所以修改为了character_set_databaseutf8既可以。 character_set_server他的范围更大&#xff0c;属于服务器级别。

非常好的新版网盘系统,是一款PHP网盘与外链分享程序,支持文件预览

这是一款PHP网盘与外链分享程序&#xff0c;支持所有格式文件的上传&#xff0c; 可以生成文件外链、图片外链、音乐视频外链&#xff0c;生成外链同时自动生成相应的UBB代码和HTML代码&#xff0c; 还可支持文本、图片、音乐、视频在线预览&#xff0c;这不仅仅是一个网盘&a…

【Java】 条件与选择

文章目录 1.关系操作符2.逻辑操作符3.if语句3.1常见的问题3.2 两个浮点数值的相等测试3.3 简化布尔赋值 4.switch语句5.三元操作符 1.关系操作符 Java 提供六种关系操作符(relational operator)(也称为比较操作符(comparison operator)) 操作符名称<小于<小于等于>大…

张雪峰高考志愿填报

描述 张雪峰&#xff0c;一个富有才华的老师&#xff01; 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以自愿填报为主&#xff0c;对于学习自愿填报有比较大的帮助&#xff01; 但是网络上面错综复杂&#xff0c;很多老旧的版本影响学习&#xff01; 而这里我整…

现在有哪些微服务解决方案?

Dubbo&#xff1a;是一个轻量级的Java微服务框架&#xff0c;最初由阿里巴巴在2011年开源。它提供了服务注册与发现、负载均衡、容错、分布式调用等。Dubbo更多的被认为是一种高性能的RPC框架&#xff08;远程过程调用&#xff09;&#xff0c;一些服务治理功能依赖第三方组件完…

极速狂飙,激情重燃 ——《极品飞车:集结》删档公测,你准备好了吗?

亲爱的赛车迷们&#xff0c; 当引擎的轰鸣声再次响起&#xff0c;我的心脏仿佛被注入了肾上腺素&#xff0c;那一刻&#xff0c;我知道——属于我们的时刻到了&#xff01;《极品飞车&#xff1a;集结》删档公测的消息如同一道闪电&#xff0c;划破了平凡的日子&#xff0c;将…

爬虫管理:开启企业大数据时代的智能信息搜集

摘要 在数据驱动的时代&#xff0c;精准高效的信息搜集成为企业决策的黄金钥匙。本文深入探讨爬虫管理如何助力企业开启大数据智能搜集的新篇章&#xff0c;通过优化策略、技术实践与成功案例&#xff0c;揭示其对企业发展的重大意义。我们不仅会探讨其技术实现的奥秘&#xf…

【机器学习】精准农业新纪元:机器学习引领的作物管理革命

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 精准农业的背景与现状&#x1f341;精准农业的概念与发展历程&#x1f342;国内外精准农业实践案…

Milvus 核心设计 (3) ---- metric及index原理详解与示例(1)

目录 背景 Floating point embeddings 特点 适用场景 丈量方式 Euclidean distance (L2) Inner product (IP) Cosine similarity (COSINE) 代码写法 索引类型 In-Memory FLAT 索引 IVF_FLAT IVF_FLAT的工作流程 平衡准确性与速度 性能考虑 代码写法 IVF_SQ8 …

Linux下的C++编程(2)——动态库

为什么要使用动态库&#xff1f; 在实际工作工作&#xff0c;常常需要给予其他人自己的库文件&#xff0c;但是&#xff0c;我们只想让其他人使用我们的库文件&#xff0c;而不想让其他人知道我们具体代码&#xff0c;所以就引入了动态库的概念&#xff0c;使用动态库可以让使…

C++编程小游戏------斗罗大陆(1)魂力测评和武魂觉醒

#include <bits/stdc.h> #include <windows.h> using namespace std; string name,wh; int hl,wh1; int gj50,fy50,jy5000,hp60; int main() { // 共十个武魂["昊天锤","蓝电霸王龙","七杀剑","火凤凰","尖尾雨燕&qu…

Python爬虫:基础爬虫架构及爬取证券之星全站行情数据!

爬虫成长之路&#xff08;一&#xff09;里我们介绍了如何爬取证券之星网站上所有A股数据&#xff0c;主要涉及网页获取和页面解析的知识。爬虫成长之路&#xff08;二&#xff09;里我们介绍了如何获取代理IP并验证&#xff0c;涉及了多线程编程和数据存储的知识。此次我们将在…