智能车图像处理逆透视教程

这篇具有很好参考价值的文章主要介绍了智能车图像处理逆透视教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

去畸变请参考:图像处理去畸变教程_LoseHu的博客-CSDN博客

去畸变+逆透视请参考:​​​​​​​​​​​​​​​​​​​​​智能车去畸变+逆透视教程_LoseHu的博客-CSDN博客

逆透视:如下

1.简介

对于初做车的同学,看见摄像头图像神奇的侧视角难免会有些烦躁,我刚开始也是如此,所以在此,想详细的分享一下我们的透视变换方案。(实战教学)

先上各种效果图。

智能车图像处理逆透视教程

智能车图像处理逆透视教程

智能车图像处理逆透视教程智能车图像处理逆透视教程智能车图像处理逆透视教程

优点:

        使用指针映射透视变换数组,只需要初始化映射一次,后续不需要时间​​​​​​​

        通用性强,可移植性高

       还可以已知原图坐标情况下求透视后坐标

2.摄像头环境

        硬件:总钻风摄像头(由于多车组使用沁恒芯片,修改过硬件适应dvp)

        镜头:140度镜头,畸变小于5%

        摄像头分辨率:120*188(长*宽)

        透视图分辨率:100*114(长*宽)

        摄像头高度:30cm左右

总钻风是很常见的智能车摄像头,之所以选用140度镜头,是因为其角度大,且畸变率非常小,完全不影响图像处理,可以省去去畸变的烦恼,摄像头120*188是因为其比例可以使视野最大。

3.逆透视简单原理

        众所周知,对于十字这个元素,标准赛道(不算路肩、黑胶带),它是一个宽度为45cm的标准正方形。但是因为摄像头角度问题,十字的正方形在图片中是一个梯形。

智能车图像处理逆透视教程

那嚒我们所要做的,就是根据图片中的这一块梯形(实则是正方形),这一个信息,将图片进行拉伸变换,使之成为标准的俯视图。

智能车图像处理逆透视教程

 公式:

智能车图像处理逆透视教程

 w与w’在二维图中为1

智能车图像处理逆透视教程

 已知结果图中坐标,通过上述公式就能在原图中找到对应的坐标。

智能车图像处理逆透视教程

 那么这个3*3矩阵就是我们需要使用上位机求取的。

4.通过上位机求取矩阵

环境准备:

          拍摄的十字图像(或正方形图像),灰度与二值化图均可,要能完全展示出正方形部分,如:

智能车图像处理逆透视教程智能车图像处理逆透视教程

 图像中可以显示出车头,因为在后续的透视过程中可以通过图像修改参数平移去除。

那么,根据图中的假正方形,就可以进行后续操作。

上位机操作:

智能车图像处理逆透视教程

 结果图宽高:得到的透视图像的宽高。

方形中心距顶部像素:在结果图中,正方形的中心,距离图像最上端多少个像素行(值越大,图像越向下平移)。

方形像素边长:在结果图中,正方形的边长相当于多少个像素(值越大,图片就会被放大更多,如果是45,就是一像素对应1cm距离)。

四个XY值:图中方形四个顶点的坐标,通过鼠标右键在图中点击就可以自动输入(点击顺序:左下---右下---左上---右上)。

逆透视上位机操作

     最终矩阵会复制到您的剪切板中,如:

{{-10.603578,4.261626,-292.576700},
{0.665623,6.708527,-1508.674551},
{0.000570,0.016935,-2.741442}};

注意事项:

        1.图片经过逆透视操作后得到的结果图,因为对图片进行了拉伸,底边两个角落可能会出现无内容部分(如下图),使用时应当避免.可通过修改结果图大小,或者增大方形中心距顶部像素来对图形进行平移去除。

智能车图像处理逆透视教程

         2.鼠标点击顺序要符合左下---右下---左上---右上。

         有些图片打开失败,请检查图片后缀,有的是jpg格式,后缀却是bmp。

智能车图像处理逆透视教程

5.在智能车上使用矩阵:

原理说明:

求得矩阵后,就可根据矩阵,和结果图的坐标,计算出结果图中的某个点,在原图中的坐标。

但如果每获取到一帧图像,都进行一次映射,非常耗费时间。所以我们使用指针。

在初始化时只需要对指针地址进行一次映射,以后只需要调用指针数组,就可以获取到透视后的图。(需要注意的是,和图像一样的大的指针数组可能会导致您的内存溢出,所以建议将透视图尺寸缩小,即减小RESULT_ROW与RESULT_COL也可以避免黑边出现

change_un_Mat[3][3] 是你通过上位机求取的矩阵,在您的剪切板中。

ImageUsed[0][0]代表图像左上角的值

PER_IMG    为用来透视变换的图片,如果使用灰度图,那么ImageUsed就是灰度图的逆透视图,

如果使用二值化图,那么ImageUsed就是二值化的逆透视图

BlackColor的值为没有内容部分的灰度值。

只需要初始化时调用一次ImagePerspective_Init()函数,只需要初始化时调用一次!!!!一次就行!!!!!!!

//
// Created by RUPC on 2022/9/20.
//
#define RESULT_ROW 100//结果图行列
#define RESULT_COL 114
#define         USED_ROW                120  //用于透视图的行列
#define         USED_COL                188
#define PER_IMG     SimBinImage//SimBinImage:用于透视变换的图像
#define ImageUsed   *PerImg_ip//*PerImg_ip定义使用的图像,ImageUsed为用于巡线和识别的图像
typedef unsigned char       uint8_t;                                              // 无符号  8 bits
uint8_t *PerImg_ip[RESULT_ROW][RESULT_COL];

void ImagePerspective_Init(void) {

    static uint8_t BlackColor = 0;
    double change_un_Mat[3][3] = {          //114w*100h
            { -0.01609759704190238, 0.01932561893613478, -2.040617594981866 }, {
                    0.0004352209945470896, -0.000367865364438621,
                    -0.7035606436969671 }, { 1.115951268069474e-005,
                    0.0001970185393508392, -0.03104642853440032 }, };
    for (int i = 0; i < RESULT_COL ;i++) {
        for (int j = 0; j < RESULT_ROW ;j++) {
            int local_x = (int) ((change_un_Mat[0][0] * i
                    + change_un_Mat[0][1] * j + change_un_Mat[0][2])
                    / (change_un_Mat[2][0] * i + change_un_Mat[2][1] * j
                            + change_un_Mat[2][2]));
            int local_y = (int) ((change_un_Mat[1][0] * i
                    + change_un_Mat[1][1] * j + change_un_Mat[1][2])
                    / (change_un_Mat[2][0] * i + change_un_Mat[2][1] * j
                            + change_un_Mat[2][2]));
            if (local_x
                    >= 0&& local_y >= 0 && local_y < USED_ROW && local_x < USED_COL){
                PerImg_ip[j][i] = &PER_IMG[local_y][local_x];
            }
            else {
                PerImg_ip[j][i] = &BlackColor;          //&PER_IMG[0][0];
            }

        }
    }

}


/*完成摄像头初始化后,调用一次ImagePerspective_Init,此后,直接调用ImageUsed   即为透视结果*/

屏幕显示透视变换后的灰度图DEMO:

int main(void)
{

    All_Init();//屏幕、摄像头、以及其他外设初始化
    ImagePerspective_Init();
    while(1)
    {
        if (mt9v03x_finish_flag_dvp == 1) {
            uint8_t show[RESULT_ROW][RESULT_COL];
                for(int i=0;i<RESULT_ROW;i++)
                {
                    for(int j=0;j<RESULT_COL;j++)
                    {
                        show[i][j]=ImageUsed[i][j];
                    }
                }
            ips114_show_gray_image(0,0,show[0],RESULT_COL,RESULT_ROW,RESULT_COL,RESULT_ROW,0);
            mt9v03x_finish_flag_dvp = 0;

        }
    }
}

若想使用zf库函数显示需要针对指针略作更改,参考如下:

(看注释的sample,用不来就用上面)

/**
*@Name          :ips114_show_gray_image_vec
*@Description   :ips114_show_gray_image_vec 显示透视变换指针所指的图像
*@Param         :
*@Return        :
*@Sample        :ips114_show_gray_image_vec(0,0,PerImg_ip,TRFED_COL,TRFED_ROW,TRFED_COL,TRFED_ROW,0);
**/
void ips114_show_gray_image_vec (uint16_t x, uint16_t y, uint8_t *p[][TRFED_COL], uint16_t width, uint16_t height, uint16_t dis_width, uint16_t dis_height, uint8_t threshold)
{
    zf_assert(x < ips114_x_max);
    zf_assert(y < ips114_y_max);

    uint32_t i = 0, j = 0;
    uint16_t color = 0,temp = 0;
    uint32_t width_index = 0, height_index = 0;

    ips114_set_region(x, y, x+dis_width-1, y+dis_height-1);                     // 设置显示区域

    for(j=0;j<dis_height;j++)
    {
        height_index = j*height/dis_height;
        for(i=0;i<dis_width;i++)
        {
            width_index = i*width/dis_width;
            temp = *p[height_index][width_index];                         // 读取像素点
            if(threshold == 0)
            {
                color=(0x001f&((temp)>>3))<<11;
                color=color|(((0x003f)&((temp)>>2))<<5);
                color=color|(0x001f&((temp)>>3));
                ips114_write_16bit_data(color);
            }
            else if(temp < threshold)
                ips114_write_16bit_data(BLACK);
            else
                ips114_write_16bit_data(WHITE);
        }
    }
}

效果显示: 

智能车图像处理逆透视教程

 已知原图坐标情况下求透视后坐标

        如果只想对边线或是某些点进行逆透视,在使用同样矩阵下,可以参考17届智能车-多车编队寻光测距_Wyean的博客-CSDN博客

6.资源文件

        其中包含了测试图包

        CSDN:https://download.csdn.net/download/wu58430/86399773

        推荐github:https://github.com/wu58430/RUBO-IPM

        如果只使用用途,下载github中Release即可。

        现在已经完成了逆透视、去畸变、逆透视+去畸变的操作,除非程序有重大bug,后续不会考虑更新。此三种只是图片处理方法,如此软件只适用于简化和降低操作的门槛,以便大家共同进步,图像处理方法无好坏之分,但确实有精妙与粗糙之别。

版权声明:

        此软件仅用于竞赛、学习交流,禁止任何商业用途,包括有营利性的、商业的教学指导活动。

7.更新日志

        2022.8.23        修复了不同版本windows兼容问题

        2022.8.27        修复中文路径、视图大小异常问题,缩小程序体积

        2022.9.23        增加了彩色图像显示,输出格式改为数组

        2022.10.7        代码迁移至QT6.3.1环境,加入去畸变,加入保存图片功能
        2022.10.29        融合两种方法,修复保存图像色彩错误问题

        2023.1.12        修复去畸变+逆透视下位机代码中未考虑的可能文章来源地址https://www.toymoban.com/news/detail-456931.html

到了这里,关于智能车图像处理逆透视教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python图像处理篇】opencv中的仿射变换和透视变换

    仿射变换可以将矩形图片映射为平行四边形, 透视变换可以将矩形图片映射为任意四边形。 opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective, 使用这两个函数可以实现所有类型的变换。 cv2.warpAffine 接收的参数2x3的变换矩阵; 而 cv2.warpPerspective 接收的3x3的变换矩阵。

    2024年01月24日
    浏览(62)
  • 【第十七届智能车】智能车图像处理(1)-图像预处理

    本博客使用的硬件是逐飞总钻风130°无畸变摄像头,采用的图像分辨率为188*120,主控为CH32V307VCT6,使用DVI接口进行连接。 我们在本次比赛中采用的是头尾车总钻风摄像头+中间车线性CCD的方案。这两个感光部件各有优劣,使用方式和图像处理也大相径庭。这里讨论的是总钻风

    2024年02月08日
    浏览(47)
  • 智能文档图像处理技术:解决大数据时代文档图像处理难题

    智能文档图像处理技术是指利用计算机视觉和人工智能等技术对文档图像进行处理和分析,实现自动化识别、提取、分类和管理的技术。随着人工智能时代的到来和各行业信息化进程的加速,越来越多的个人和企业用户开始借助智能文档图像处理技术来提高工作效率,降低人

    2024年02月09日
    浏览(43)
  • 智能图像处理技术:开启未来视觉时代

    文档 是人们在日常生活、工作中产生的信息的重要载体,各领域从业者几乎每天都要与金融票据、商业规划、财务报表、会议记录、合同、简历、采购订单等文档或者图像“打交道”。所以让计算机具备阅读、理解和解释这些文档图像的能力,在智能金融、智能办公、电子商

    2024年02月05日
    浏览(32)
  • 人工智能在图像处理领域的应用

    随着科技的不断发展,人工智能(AI)逐渐成为当今社会的热点话题。人工智能正在逐渐渗透到人类生活的各个领域,改变着我们的生活方式和社会结构。在图像处理领域,人工智能的应用也越来越广泛,为图像处理带来了更高效、更准确的解决方案。本文将从图像分类、图

    2024年02月04日
    浏览(55)
  • 智能文档图像处理技术应用与实践

    VALSE 2023 无锡视觉与学习青年学者研讨会 近期在无锡国际博览中心举办,由江南大学和无锡新吴区联合承办。本次会议旨在为全球计算机视觉、模式识别、机器学习、多媒体技术等相关领域的华人青年学者提供学术交流和成长的平台。 作为一个以计算机视觉和机器学习为主题

    2024年02月10日
    浏览(48)
  • 探索文档图像大模型,提升智能文档处理性能

    自 ChatGPT 于 2022 年 11 月发布以来,大模型的相关研究在全世界的学术界和工业界都引起了广泛的关注,大模型技术也为智能文档处理领域带来了新的机遇。通过在智能文档处理领域训练和应用大规模深度学习模型,能够提供更准确、全面的文档理解与分析,改善文档图像识别

    2024年02月03日
    浏览(36)
  • 用于智能图像处理的计算机视觉和 NLP

    莫斯科,神秘之城...(这张照片由伊戈尔·沙巴林提供)         如今,每个拥有智能手机的人都可能成为摄影师。因此,每天都有大量新照片出现在社交媒体、网站、博客和个人照片库中。尽管拍照的过程可能非常令人兴奋,但将它们整理出来并在之后手动为每个进行描

    2024年02月12日
    浏览(43)
  • CCIG 2023 从视觉-语言模型到智能文档图像处理

    前言 一、视觉-语言模型是什么? 二、视觉-语言模型可以用来做什么? 三、视觉-语言 预训练模型 3.1、模型架构 3.2、训练目标 3.2.1、图像-文本匹配损失(ITM) 3.2.2、掩码语言建模损失(MLM) 3.2.3、掩码视觉建模损失(MVM) 3.3、SOTA模型 四、视觉到语言的数字化转型——智

    2024年02月05日
    浏览(53)
  • oneAPI人工智能分析工具包实现图像处理

    oneAPI是一个由英特尔(Intel)主导的、面向异构计算的开放标准和平台。它旨在简化和加速跨多种硬件架构的应用程序开发,包括CPU、GPU、FPGA和其他加速器。 以下是关于oneAPI发展的一些要点: 1.创立背景和目标: oneAPI的发展始于英特尔意识到在异构计算时代,开发者面临的

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包