首页 > 其他分享 >智能车摄像头开源—5 逆透视处理

智能车摄像头开源—5 逆透视处理

时间:2024-10-20 21:51:39浏览次数:3  
标签:Inverse 透视 Image float uint8 开源 图像 摄像头

目录

一、前言

二、逆透视

1.逆透视讲解 (个人理解)

2、逆透视数组获取

3、样图

三、灰度图像获得

四、逆透视数组使用

1、实现逆透视

2、逆透视求实际角度

3、逆透视图像处理元素

4、边线逆透视变换

五、对于逆透视的观点


一、前言

        本文主要讲解智能车赛中逆透视应用和实现。

        注:本文逆透视文件即源码接来自于b站开源博主“__苏格拉没有底___”,此处仅是讲解其用法

二、逆透视

1.逆透视讲解 (个人理解)

        逆透视具体原理不需理解很透彻,因摄像头斜视(─━ _ ─━✧),导致所获得的图像并非是实际的图像,当我们需要实际的真实图像时,可对原图像进行逆透视变换,即将原斜视图像变换为上帝视角,可以在一定程度上精确元素判断。

        同时可获得变换3 * 3矩阵,可以直接对拐点进行逆透视,然后求出实际角度,对锐角,直角,钝角判定有很好的效果。

示例:

2、逆透视数组获取

       1. 首先要确定自己要处理的图像大小,之后尽量不做更改。

       2. 先下载MATLAB,内存有点大,至于收费问题,懂的都懂(可以去b站找)整套操作不需要MATLAB基础。
       3. 按照路径:求逆透视相关—>透视处理—>图像透视处理2,打开文件中图像透视处理法2(文件可由文章附带文件下载,若平台收费,可在b站找“__苏格拉没有底___”下载文件)

        4.在安装好MATLAB的前提下,jiaozhen文件会变为MATLAB可读文件,双击它打开:

    

        5.之后打开  “图像透视处理法1”  文件,同时点开step1,step2,即和jiaozhen一同在MATLAB页面内, 如下所示(注意图像路径更改)

         6.左侧会有   图像透视处理法1  中的所有照片,其中huandao1,shizi1,wandao1是作者本人导入的实际图片,可将这三个图片替换为自己的照片,在后面有介绍图片获得方式

        7.然后在文件“jiaozhen.m”和“Step2.m”中更改你的测试图片路径(以下为“jiaozhen.m”文件的路径,另一文件与此相同) 注意照片格式要和文件中一致

        

        8.然后先调数组大小,要将文件内所有的60,80改为自己图像的Image_Y,Image_X。快速更改方法:双击60,按“Ctrl + F”调出查找替换框,选中“全字匹配”,将替换框内搞好自己的数值后,点击“全部替换”。另一数值重复此操作。

        

        9.之后就是调参(参数全部在“jiaozhen.m”文件中),首先是   桶形畸变 因为使用总钻风130无畸变摄像头,故不存在桶形畸变,根据注释将k1,k2设为0即可

        10.接着是梯形畸变矫正 虽然是无畸变摄像头,但是有梯形畸变,具体可以查阅资料,然后这里有三个参数:

① h: 单位是米,将自己车放到平地上,拿尺子测摄像头高度,不需那么准确,但越准确越好,将得到的值替换h,我这里是30.5cm

②alpha:注释里的东西不用管,这个参数可以自己调出来,先大致调,再细调,自己试一下,随着数加一减一变化都很明显,可以    很快得到最适合的值,那么什么时候合适呢,就是你看着图像的高最顺眼的时候(黑色无效区域较少,原图像内东西大多存在),这个没有难度,每调一次,按F5运行一次,看输出的图像

补充一下:正确运行代码会得到三张输出结果,其中Figure1为桶形畸变矫正结果,因为值为0,所以和原图像无异;Figure3为逆透视图像,是重点关注图像;Figure4为反逆透视图像(将逆透视后图像再次运算,反向求出原图像),可以和原图像比对

③beta:注释里东西也不用管,和alpha方法相同,几下就能调出来,也是看着最顺眼的时候就可以

        11.接下来调整拉展与平移,也是自己调,调一次运行一次看看效果,很快就能调出来,也是自己看着最顺眼的时候就可以了

3、样图

这里放入我最终输出的几张样图:

        逆透视不可避免的会丢失部分信息,同时会出现三角黑边 。此时我已经调好参数,得到观感较好的逆透视图像,调试上述三个参数时可以参考我的效果。

三、灰度图像获得

        方法有很多,但都必须有上位机,将自己摄像头的图像发送到上位机上,截屏,修改尺寸(尺寸与循迹时处理的图像长宽一致 。如本人代码中就是Find_Line_Image,长为80,宽为60),WIFI图传我在另一文档有介绍,本人使用逐飞WiFi图传模块搭配逐飞助手获取图像。

        然后从上位机获得如下图像(自己推着车去实地取图),注意截屏时一定要细致,不可多不可少,就描着传过来的图像截屏,不要截到多余外部,然后进行压缩。

样例:

还是再补充下压缩图像吧:

①找到你的截图,双击打开

②右键,选择“改尺寸”

③选择“等比缩放”,配置好相关参数,然后点保存,就获得了一个摄像头原图像,将此图像导入MATLAB(即放入”图像透视处理法2“文件)

四、逆透视数组使用

1、实现逆透视

        根据上述流程调试好参数,运行代码后,会在文件“图像透视处理1”中得到四个数组文件:

        四个数组为:逆透视X坐标变换矩阵、逆透视Y坐标变换矩阵、返逆透视X坐标变换矩阵、返逆透视Y坐标变换矩阵。

        打开车赛开发软件,新建文件,并定义两个数组存放得到的逆透视坐标变换矩阵:

        之后写函数进行逆透视变换即可:

/**
* 函数功能:      求逆透视图像
* 特殊说明:      使用MATLAB中得到的逆透视矩阵实现
* 形  参:        uint8(*source_image)[Image_X]        要进行逆透视变换的矩阵
*                uint8 (*target_image)[Image_X]        逆透视变换后的图像
*
* 示例:          Get_Inverse_Perspective_Image(Find_Line_Image, I_Perspective_Image);
* 返回值:        无
*/
void Get_Inverse_Perspective_Image(uint8(*source_image)[Image_X], uint8 (*target_image)[Image_X])          //835us
{
    uint8 i = 0, j = 0;
    for(j = 0; j < Image_Y; j ++)
    {
        for(i = 0; i < Image_X; i ++)
        {
              target_image[j][i] = source_image[Inverse_Matrix_Col[j * Image_X + i]][Inverse_Matrix_Row[j * Image_X + i]];
        }
    }
}

        反逆透视变换:

//求逆透视的反逆透视图像
/**
* 函数功能:      求逆透视的反逆透视图像
* 特殊说明:      使用MATLAB中得到的反逆透视矩阵实现
* 形  参:        uint8(*Source_Image)[Image_X]        要进行反逆透视的逆透视图像
*                uint8(*target_image)[Image_X]         存储反逆透视变换后的图像
*
* 示例:          Get_Back_Inverse_Perspective_Image(I_Perspective_Image, Back_I_Perspective_Image);
* 返回值:        无
*/
void Get_Back_Inverse_Perspective_Image(uint8(*Source_Image)[Image_X], uint8(*target_image)[Image_X])
{
    uint8 i = 0, j = 0;
    for(j = 0; j < Image_Y; j ++)
    {
        for(i = 0; i < Image_X; i ++)
        {
            target_image[j][i] = Source_Image[Back_Inverse_Matrix_Col[j * Image_X + i]][Back_Inverse_Matrix_Row[j * Image_X + i]];
        }
    }
}

        这里要注意逆透视矩阵在数组内的定位。

2、逆透视求实际角度

求原图像拐角的实际角度(将角三点逆透视过来求角度)

//-------------------------------------------------------------------------------------------------------------------
//  @brief      逆透视知三点求形成的角度
//  @param      Ax,Ay      下边点
//  @param      Bx,By      要求角度的一点
//  @param      Cx,Cy      上边点
//  @return
//  @since      v1.0
//  Sample usage:
//  注:使用时传入原图像的三个点,不可传入逆透视图像的三个点
//-------------------------------------------------------------------------------------------------------------------
float Get_Turn_Point_Angle(uint8 Ax, uint8 Ay, uint8 Bx, uint8 By, uint8 Cx, uint8 Cy)
{

    float BA = 0.00;//向量BA的模
    float BC = 0.00;
    float SBA_BC = 0.00;//向量点乘的值
    float Angle = 0.00;

    uint8 AX = Back_Inverse_Matrix_Row[Ay * Image_X + Ax];
    uint8 AY = Back_Inverse_Matrix_Col[Ay * Image_X + Ax];
    uint8 BX = Back_Inverse_Matrix_Row[By * Image_X + Bx];
    uint8 BY = Back_Inverse_Matrix_Col[By * Image_X + Bx];
    uint8 CX = Back_Inverse_Matrix_Row[Cy * Image_X + Cx];
    uint8 CY = Back_Inverse_Matrix_Col[Cy * Image_X + Cx];

    BA = sqrt((float)((AX-BX)*(AX-BX)+(AY-BY)*(AY-BY)));
    BC = sqrt((float)((CX-BX)*(CX-BX)+(CY-BY)*(CY-BY)));

    SBA_BC = (float)((AX-BX)*(CX-BX)+(AY-BY)*(CY-BY));

    Angle =  acos(SBA_BC * 1.00/ (BA * BC));

    return Angle * 57.3f;
}

逆透视图相关拐点求角度:

//逆透视后的图像拐点求角度
float I_Get_Turn_Point_Angle(uint8 Ax, uint8 Ay, uint8 Bx, uint8 By, uint8 Cx, uint8 Cy)
{
    float BA = 0.00;//向量BA的模
    float BC = 0.00;
    float SBA_BC = 0.00;//向量点乘的值
    float Angle = 0.00;

    BA = sqrt((float)((Ax-Bx)*(Ax-Bx)+(Ay-By)*(Ay-By)));
    BC = sqrt((float)((Cx-Bx)*(Cx-Bx)+(Cy-By)*(Cy-By)));

    SBA_BC = (float)((Ax-Bx)*(Cx-Bx)+(Ay-By)*(Cy-By));

    Angle =  acos(SBA_BC * 1.00/ (BA * BC));

    return Angle * 57.3f;
}

        以上方法求出来的角度并非百分百准确,而是要有一定误差范围,比如找九十度直角,那么80° ~ 110°都可认为是直角。

3、逆透视图像处理元素

        逆透视不论是对于拐点找寻还是元素判断等,其实与原图像的判断、找寻、处理方法类似,属于触类旁通了。对于原图像的元素判断和处理等,会在后续文章讲解。

4、边线逆透视变换

        也是使用得到的逆透视变换矩阵进行处理,可将原图像得到的边线进行逆透视变换得到实际的赛道边线。处理方式与图像逆透视极其相似,只是将每个图像点的遍历更改为每个边线点的遍历,所以就不过多讲述,理解上述代码后相必很快自己就能敲出来这部分代码。

        这样变换会存在噪点和断点,至于怎么处理,就需读者自行发挥了。

五、对于逆透视的观点

        对于车赛来说,其实逆透视并不是必须的,特别是对于逆透视后的图像来说,赛道边线会存在非常多噪点,使用爬线算法提取会遇到非常多的问题。同时这些噪点的干扰并非简单的处理就可以解决的。使用高斯模糊等又会消耗非常多的算力。之前本人有尝试将高斯模糊与自适应迷宫算法相结合,即只将需要使用的点进行高斯模糊处理,效果也不甚理想。

        对于逆透视图像,更适合最长白直列向左右扫线求取边线的算法。

        但本人并没有过多尝试逆透视的应用和处理,至于怎样达到更好的效果,需要读者花费更多时间精力去探索,对于车赛来说,处理原图像绝对是够用的。

标签:Inverse,透视,Image,float,uint8,开源,图像,摄像头
From: https://blog.csdn.net/lh66969696/article/details/143098606

相关文章

  • 【开源】给荣耀盒子MediaQ M321增加自动进应用界面功能及扩展USB口
    很多年前买过一个荣耀盒子,型号是MediaQM321。这个盒子很精致,是我看到过的安卓机顶盒里面最小巧、紧凑的。主芯片型号是Hi3798Mv100,支持4K,虽然有点过时,但依然能用。这个机器最大的缺点是虽然可以安装app,但启动后第1屏是节目推荐,而应用列表在第7屏,开机后要按好几次遥控器按钮才能打......
  • 惊!微商变革风暴来袭:开源 AI 智能名片 2+1 链动模式 S2B2C 商城小程序源码震撼登场!
    摘要:哇塞!你绝对不能错过!本文将带你深入探秘企业驱动下的两种超级微商模式——品牌微商与个人微商。深度剖析其独特魅力与发展路径,更有神秘武器开源AI智能名片2+1链动模式S2B2C商城小程序源码闪亮登场!为你揭示其在微商世界中的惊人应用价值与无限潜力,必将为微商行业带来一......
  • .NET数据挖掘与机器学习开源框架
     数据挖掘与机器学习开源框架1.1 框架概述1.1.1 AForge.NETAForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,模糊系统,机器人控制等领域。这个框架由一系列的类库组成。主要包括有:AForge.Imaging——......
  • 开源呼叫中心FreeIPCC:客服部门负责人、IT部门负责人在采购呼叫中心系统时需要考虑的常
    客服部门负责人和IT部门负责人在采购呼叫中心系统时,各自会遇到一系列常见问题,以下是对这些问题的详细列举:客服部门负责人常见问题客户体验问题:担心系统无法提供流畅的客户体验,如长时间排队、通话中断等。担心语音导航复杂,导致客户操作困难。需要系统支持多渠道接入(如电话......
  • 开源呼叫中心系统全攻略:功能、优劣与国内外市场对比
    开源呼叫中心系统全攻略:功能、优劣与国内外市场对比一、开源呼叫中心系统的核心功能开源呼叫中心系统,作为企业与外界沟通的重要桥梁,集成了多种先进功能,旨在提供高效、便捷、个性化的客户服务体验。其核心功能包括但不限于:来电与去电管理:来电管理:具备来电显示、来电转接......
  • 开源呼叫中心系统FreeIPCC:从源码——>自己公司产品
    获得呼叫中心源代码后,将其转化为一个功能完善、稳定可靠的产品是一个复杂但系统的过程。这涉及到技术实施、系统集成、测试验证、优化部署以及后续的运维支持等多个环节。以下是一些建议,帮助您顺利完成这一转化过程:1. 源码评估与熟悉技术评估:首先,对购买的源代码进行全面的技......
  • 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 开源数学库Math.NET,替代Matla
    Math.NEThttps://www.mathdotnet.comMath.NET是一个广泛使用的开源数学库,专为.NET语言(如C#和F#)设计,提供了各种高性能的数学和统计计算功能。它帮助开发者进行线性代数、统计分析、随机数生成、微积分、优化和信号处理等计算,尤其在科学计算、工程应用以及数据分析中被广泛使......
  • "开源"是什么?为啥这么火?一定免费吗?
    ​ 在科技快速发展的今天,“开源”一词频频出现在我们的视野中。究竟什么是开源?为何它能在技术圈引发如此热潮?开源软件到底有什么魅力?它是如何改变软件开发和使用的方式的?开源软件是否一定是免费的?开源软件是指其源代码公开,任何人都可以查看、修改和分发。其魅力在于促进了合作......
  • dify 大模型开源应用框架使用案例,api调用
    参看:https://github.com/langgenius/dify1、安装下载安装:https://docs.dify.ai/getting-started/install-self-hosted/docker-composegitclonehttps://github.com/langgenius/dify.gitcddify##docker安装cddockercp.env.example.envdockercomposeup-d......
  • Lag-Llama:第一个时间序列预测的开源基础模型
    Lag-Llamalagllama是为单变量概率预测而构建的。它使用不依赖于频率的通用方法来标记时间序列数据。这样模型可以很好地推广到不可见的频率。它利用Transformer体系结构和分布头来解析输入令牌,并将它们映射到具有置信区间的未来预测。一、具有滞后特征的标记laglllama的......