常规情况与opencv图像中,计算直线与矩形框的交点

文章目录

  • 1、普通方式
    • 1.1、普通计算过程
    • 1.2、优化方式
  • 2、图像中的情况
    • 2.1、常规处理
    • 2.2、opencv中的处理
      • 2.2.1、cv::clipLine函数
      • 2.2.2、测试代码
      • 2.2.3、测试结果

1、普通方式

已知矩形框左上(x1,y1)、右下(x2,y2)点,直线方程 y = kx+b,求交点。

这个问题转换为:计算直线与矩形框的四条线段的交点,因此最多执行4次。
首先计算直线与线段所在直线交点,若交点的在线段坐标的范围内,那么认为是有交点。

1.1、普通计算过程

这里不考虑直线平行的常规情况,如下
{ a 1 x + b 1 y + c 1 = 0 a 2 x + b 2 y + c 2 = 0 \left\{\begin{matrix} a_1x + b_1y+c_1 = 0 \\ a_2x + b_2y+c_2 = 0 \end{matrix}\right. {a1x+b1y+c1=0a2x+b2y+c2=0
计算得到横坐标
x = b 2 c 1 − b 1 c 2 b 2 a 1 − b 1 a 2 x=\frac{b_2c_1 - b_1c_2}{b_2a_1-b_1a_2} x=b2a1b1a2b2c1b1c2

当其位于某一条线段的横坐标坐标取值范围 x ∈ [ x 1 , x 2 ] x \in [x_1, x_2] x[x1,x2] 时,认为存在交点
{ x = b 2 c 1 − b 1 c 2 b 2 a 1 − b 1 a 2 y = − a 2 x − c 2 b 2 \left\{\begin{matrix} x=\frac{b_2c_1 - b_1c_2}{b_2a_1-b_1a_2} \\ y = \frac{-a_2x-c_2}{b_2} \end{matrix}\right. {x=b2a1b1a2b2c1b1c2y=b2a2xc2

1.2、优化方式

我们分两种情况。直线垂直和水平,以及普通情况。

  • (1)垂直和水平情况
    在这里插入图片描述
    这种方式简单,当垂直时直线 x = m x = m x=m,若 m ∈ [ x 1 , x 2 ] m \in [x_1, x_2] m[x1,x2],那么交点为 ( m , y 1 ) (m,y_1) (m,y1) ( m , y 2 ) (m,y_2) (m,y2);同理,当水平式直线 y = n y = n y=n,若 n ∈ [ y 1 , y 2 ] n \in [y_1, y_2] n[y1,y2],那么交点为 ( x 1 , n ) (x_1,n) (x1,n) ( x 2 , n ) (x_2,n) (x2,n)

  • (2)不相交时
    在下图中我们绘制斜率分别为正、负的情况,且与矩形不相交的示意图,大概有8种情况下,矩形框的4个顶点均在某条直线的一侧。
    在这里插入图片描述
    因此,我们判断直线是否与矩形相交,可以直接判定矩形框四个顶点 ( x 1 , y 1 ) , ( x 2 , y 1 ) , ( x 2 , y 2 ) , ( x 1 , y 2 ) (x_1,y_1),(x_2,y_1),(x_2,y_2),(x_1,y_2) (x1,y1),(x2,y1),(x2,y2),(x1,y2) 以顺时针带入直线方程函数 f ( x , y ) = a x + b y + c f(x,y) = ax+by+c f(x,y)=ax+by+c 的结果是否都同号即可

  • (3)相交时
    在下图中绘制了所有相交的情况,可以看到 在(2)基础上,直线与矩形框线段有交点时,矩形框2个顶点一定在直线的两侧,或者某个端点在直线上
    在这里插入图片描述
    我们顺时针将矩形框框四个顶点 ( x 1 , y 1 ) , ( x 2 , y 1 ) , ( x 2 , y 2 ) , ( x 1 , y 2 ) (x_1,y_1),(x_2,y_1),(x_2,y_2),(x_1,y_2) (x1,y1),(x2,y1),(x2,y2),(x1,y2) 带入直线方程函数 f ( x , y ) = a x + b y + c f(x,y) = ax+by+c f(x,y)=ax+by+c ,若相邻两个点符号不同(不同为正,不同为负;或 +、-、0的组合),认为是有交点的。

图像中矩形看过顶点已知,且边界线为水平线和垂直线,因此计算简单。
直线方程为 y = k x + b y = kx + b y=kx+b,矩形框边界的线按顺时针排列:水平线 y = y 1 y = y_1 y=y1, 垂直线 x = x 2 x = x_2 x=x2,水平线 y = y 2 y=y_2 y=y2, 垂直线 x = x 1 x = x_1 x=x1。 后面计算过程,不做赘述。

2、图像中的情况

这里直线与矩形框的交点,我们考虑并非线段(若直线延长后与矩形框有交点,如果用两个点描述直线必须要求延长后与矩形框有交点),而是延长后的线段作为实际直线。

通常矩形框在画面中,例如下图中黑框灰色区域(宽度w)为画面区域,蓝色矩形框位于其中。绿色为线段,延长后与矩形框相交为棕色点。
在这里插入图片描述

2.1、常规处理

通常我们计算的逻辑,会考虑直线在画面中的多种情况,例如 垂直、水平,以及实际与画面无交集的无效直线等。
可以参考前述计算方式,这里不在赘叙。

2.2、opencv中的处理

我们直接以图像x方向左、右边界作为线段的延长线,得到两点(0, y0)(w, y1),之后使用cv::clipLine()计算交点。

2.2.1、cv::clipLine函数

先给出函数定义

bool clipLine(  // true if any part of line in imgRect
	cv::Rect imgRect,  // rectangle to clip to
	cv::Point& pt1,  // first endpoint of line overwritten
	cv::Point& pt2  // second endpoint of line, overwritten
);
bool clipLine(  // true if any part of line in image size
	cv::Size imgSize,  // size of image,implies rectangle at 0,0
	cv::Point& pt1,  // first endpoint of line,overwritten
	cv::Point& pt2  // second endpoint of line,overwritten
);

第一种函数的形式使用了cv::Rect,直线和这个矩形比较;第二个函数只有cv::Size,该形式表示矩形的范围是从(0,0)开始的。

只有当喜爱那段完全在指定的矩形范围之外时,函数cv::clipLine()才会返回false

注意,端点是引用,当线段与矩形框相交时,函数返回true,并改写pt1pt2.

2.2.2、测试代码

首先Mat创建一个800x800的画面区域, 之后创建一个 cv::Rect(100, 100, 400, 400) 区域。
我们流程如下:

  1. 直线方程:通过2个点,使用cv::fitLine 拟合出直线的方程
  2. 线段端点:之后以图像左、右边界,确定直线的两个端点
  3. 求解交点: 使用 cv::clipLine 计算矩形区域与线段的交点

完整测试代码如下

   {
        cv::Mat img(800, 800, CV_8UC3, {255,255,255});

        cv::Rect rect(100, 100, 400, 400);

        cv::rectangle(img, rect, {0,0,0}, 3);

        // ---- 直线拟合 
        cv::Point temp[2] = {{100, 100}, {50,-100}};

        cv::Vec4f line_para;
        cv::fitLine(std::vector<cv::Point>{ temp[0], temp[1]/*{-40,-20},{810,830}*/}, line_para, cv::DIST_L2, 0, 1e-2, 1e-2);
        
        // ---- 直线端点
        cv::Point point0(line_para[2], line_para[3]);

        //计算直线的端点(y = k(x - x0) + y0)
        cv::Point point1, point2; 
        if(line_para[1] == 1 || line_para[1] == -1 ) {
            point1 = cv::Point(line_para[2],0);
            point2 = cv::Point(line_para[2], img.rows);
        }
        else {
            float k = line_para[1] / line_para[0];
            point1.x = 0;
            point1.y = k * (0 - point0.x) + point0.y;
            point2.x = img.cols;
            point2.y = k * (point2.x - point0.x) + point0.y;
        }

        cv::Point line1[] = {point1,point2};   
        cv::line(img, line1[0], line1[1], {255,0,0},2);

        // ----- 直线与矩形框交点
        if(cv::clipLine(rect, line1[0], line1[1])) {
            cv::circle(img, line1[0], 3, {0,0,255}, -1);
            cv::circle(img, line1[1], 3, {0,0,255}, -1);
        }


        // -- 绘制
        cv::circle(img, temp[0], 4, {0,255,0}, 2);
        cv::circle(img, temp[1], 4, {0,255,0}, 2);

        cv::imshow("1",img);
        cv::waitKey(0);

        return 0;
    }

2.2.3、测试结果

测试结果如下图。实测任何对与任何直线,以上代码都能适用。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

桌面保存的Word文件删除怎么找回?超实用的三个方法?

在日常工作和学习中&#xff0c;我们经常会使用Word文档进行文字编辑和文件保存。但是&#xff0c;有时由于操作失误或系统故障&#xff0c;我们会不小心将存放在电脑桌面重要的Word文件删除了。导致无法挽回的损失&#xff0c;但幸运的是&#xff0c;有一些方法可以帮助我们找…

基于SpringBoot的乐校园二手书交易管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架 工具 Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册界面 二手图书界面 个人中心界面 摘要 乐校园…

新港海岸NCS8822 低功耗DP转VGA 分辨率支持1920*1200*60HZ

NCS8822描述&#xff1a; NCS8822是一个低功耗显示端口到vga转换器。NCS8822集成了一个与DP1.2兼容的接收器和一个高速三通道视频DAC。对于DP1.2输入&#xff0c;NCS8822支持1车道/2车道&#xff0c;也支持车道交换功能。对于VGA输出NCS8822&#xff0c;在60Hz帧率下对WUXGA&a…

【HICE】搭建不同的主机名访问web服务

1.首先进入1.conf.d编辑内容&#xff0c;再重启服务&#xff0c;关闭防火墙 2.部署网页haha.html和xixi.html 3.在vim /etc/hosts增加域名 3.在window中进行本地解析的编辑 4.浏览器的验证

自闭症孩子的语言之旅:最晚几岁会说话的探索与思考

作为在自闭症学校工作的教育者&#xff0c;我深知自闭症这一神经发展性障碍给孩子们带来的挑战&#xff0c;尤其是他们在语言发展方面的困难。自闭症孩子的语言发展轨迹各不相同&#xff0c;有的孩子可能早早地展现出语言天赋&#xff0c;而有的孩子则可能迟迟不开口。那么&…

AI文字图片人脸生成原创视频文生图生肖生小程序开发

AI文字图片人脸生成原创视频文生图生肖生小程序开发 无限开 0.12生成 图生视频 AI技术在生成文字、图片、人脸以及视频方面已经取得了显著的进步。以下是一些可能包含在AI文字图片人脸生成原创视频小程序中的功能列表&#xff1a; 文字转视频&#xff1a; 输入文字或文章&…

如何选择TikTok菲律宾直播网络?

为了满足用户对于实时互动的需求&#xff0c;TikTok推出了直播功能&#xff0c;让用户能够与粉丝即时交流。本文将探讨如何选择适合的TikTok菲律宾直播网络&#xff0c;并分析OgLive是否是值得信赖的选择。 TikTok菲律宾直播网络面临的挑战 作为全球领先的短视频平台&#xff…

数据分析和人工智能平台帮助企业创造更好、更安全、更可持续的产品

——Sam Mahalingam | Altair 首席技术官 | 2024.6.24 Altair的数据分析和人工智能&#xff08;AI&#xff09;平台AltairRapidMiner最近被Gartner 魔力象限™评为数据科学和机器学习平台领导者。有些人可能不太熟悉&#xff0c;实际上Gartner 魔力象限™ 报告是严格的、基于事…

【扩散模型(三)】IP-Adapter 源码详解1-输入篇

系列文章目录 【扩散模型&#xff08;一&#xff09;】中介绍了 Stable Diffusion 可以被理解为重建分支&#xff08;reconstruction branch&#xff09;和条件分支&#xff08;condition branch&#xff09;【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视…

生产力工具|viso常用常见科学素材包

一、科学插图素材网站 一图胜千言&#xff0c;想要使自己的论文或重要汇报更加引人入胜&#xff1f;不妨考虑利用各类示意图和科学插图来辅助研究工作。特别是对于新手或者繁忙的科研人员而言&#xff0c;利用免费的在线科学插图素材库&#xff0c;能够极大地节省时间和精力。 …

20.5.【C语言】求长度的两种方式

1.sizeof 用于测数据类型的长度的函数&#xff08;详细见第3篇&#xff09; 2.strlen 其计算长度时只有遇到\0才会停止&#xff0c;并且\0不会计算在内 如char arr[]{a,1,b}; printf("%d\n",strlen(arr)); 结果是个随机数&#xff01;strlen读内存中的数据&…

3D生成模型TripoSR完美搭建流程,包含所有问题解决方案!

最近需要使用3D生成模型,无意中看到了TripoSR,觉得效果还行,于是打算在Linux系统上部署一下,结果遇到很多坑,在这里写一下详细的部署流程和部署过程中遇到的问题。 下面是TripoSR的源码地址。 GitHub - VAST-AI-Research/TripoSRContribute to VAST-AI-Research/TripoSR…

已经安装deveco-studio-4.1.3.500的基础上安装deveco-studio-3.1.0.501

目录标题 1、执行exe文件后安装即可2、双击devecostudio64_3.1.0.501.exe2.1、安装Note (注意和4.1的Note放不同目录)2.2、安装ohpm (注意和4.1版本的ohpm放不同目录)2.3、安装SDK (注意和4.1版本的SDK放不同目录) 1、执行exe文件后安装即可 2、双击devecostudio64_3.1.0.501.e…

linux主机(A)通过私钥登录linux主机(B)

1.登录B主机&#xff0c;先在B主机执行 ssh-keygen 2.设置id_rsa的权限 chmod 600 id_rsa 3.将生成的id_rsa.pub导入到authorized_keys ssh-copy-id -i ./id_rsa.pub root127.0.0.1 4.将id_rsa复制到A主机 scp id_rsa_123 root1.1.1.A:/home/ 5.登录到A主机使用私钥登录 因…

C++左值/右值/左值引用/右值引用

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 左值和右值的概念&#xff1a; 早期的c语言中关于左值和右值的定义&a…

使用中国大陆镜像源安装最新版的 docker Deamon

在一个智算项目交付过程中&#xff0c;出现了新建集群中的全部 docker server V19 进程消失、仅剩 docker server 的 unix-socket 存活的现象。 为了验证是否是BD产品研发提供的产品deploy语句缺陷&#xff0c;需要在本地环境上部署一个简单的 docker Deamon 环境。尴尬的是&a…

强化学习后的数学原理:随机近似与梯度下降

概述 这节课的作用&#xff1a; 本节课大纲如下&#xff1a; Motivating examples 先回顾一下 mean estimation &#xff1a; 为什么总数反复提到这个 mean estimation&#xff0c;就是因为 RL 当中有非常多的 expectation&#xff0c;后面就会知道除了 state value 这些定义…

传统视觉Transformer的替代者:交叉注意力Transformer(CAT)

传统视觉Transformer的替代者&#xff1a;交叉注意力Transformer&#xff08;CAT&#xff09; 在深度学习的世界里&#xff0c;Transformer架构以其在自然语言处理&#xff08;NLP&#xff09;领域的卓越表现而闻名。然而&#xff0c;当它进入计算机视觉&#xff08;CV&#x…

Hilbert编码 思路和scala 代码

需求&#xff1a; 使用Hilbert 曲线对遥感影像瓦片数据进行编码&#xff0c;获取某个区域的编码值即可 Hilbert 曲线编码方式 思路 大致可以对四个方向的数据进行归类 左下左上右上右下 这个也对应着编码的顺序 思考在不同Hilbert深度&#xff08;阶&#xff09;情况下的…

AutoX.js某音自动评论(一个函数,5秒完成)

背景 某音自动化评论&#xff0c;步骤简单&#xff0c;对版本兼容性要高&#xff08;不用节点id定位&#xff09; 思路 通过Intent直接跳转到视频*利用文字&#xff0c;描述&#xff08;正则&#xff09;等匹配输入框&#xff0c;发表评论 效果 某音自动化评论 已经封装成一…