当前位置: 首页 > news >正文

智能车逆透视、去畸变教程(含上位机、源码)

逆透视:智能车逆透视教程(含上位机、源码)_Wyean的博客-CSDN博客

去畸变:如下

1.简介

        对于镜头而言,畸变是一种十分常见的现象,如本是方形的棋盘,边界被扭曲成曲线 。还有同样受到扭曲的赛道。

        对于镜头而言,同等条件下一般度数越大,视野越广,所造成的畸变也越严重

优点:

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

        通用性强,可移植性高

        保证视野不变条件下优化图像质量。

2.去畸变所需工具、环境

        请确保过程中所有采集到的图片出自同一相机与镜头,且分辨率全部相同

        1.棋盘标定图

        (1)放置在同一个文件夹中(数量越多越好1,0张以上,推荐50张左右)

        (2)需要将整个棋盘标定图拍摄进去,越清晰越好

        2.拍摄的赛道图,用于观察去畸变效果

        仅用作观察效果,无特殊要求

        3.去畸变上位机

        在win7及以下系统无法打开

3.去畸变原理

        不同的摄像头搭配不同的镜头,会有不一样的内参,所以,只需要提前测定相机内参即可在后续中方便去畸变。

        具体原理请自行搜索图像处理-去畸变。

4.通过上位机求取相机内参

 自动全图:如果勾选,去畸变的图会涵盖全图内容;若取消勾选,去畸变后的图会损失部分视野。注意:在桶形畸变下,如果勾选,会导致结果混乱,建议取消勾选。

横向、纵向角落点数:棋盘图中横向、纵向存在的角点数目,如下棋盘标定图中,横向为8,纵向为6,可认为是(方块数-1).

结果图宽度、高度:去畸变后的图片的宽度和高度,会自动生成,可以自行略微修改。

水平、竖直偏移:将图片在水平、竖直方向平移多少像素点。

去畸变上位机教程

     最终内参会复制到您的剪切板中,如:

double cameraMatrix[3][3]={{296.482019,0.000000,152.664982},{0.000000,286.375269,104.540031},{0.000000,0.000000,1.000000}};
double distCoeffs[5]={-0.459946,0.283675,0.002304,0.002566,-0.109265};
int move_xy[2]={55,32};

注意事项:

        1.请将棋盘标定图放在同一文件夹下,文件夹内最好不要有其他东西。

        2.请保证拍摄的棋盘标定图质量,数量推荐在50张左右

5.在智能车上完成去畸变

和逆透视原理相同

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

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

在初始化时只需要对指针地址进行一次映射,以后只需要调用指针数组,就可以获取到去畸变后的图。

cameraMatrix[3][3]、distCoeffs[5]、move_xy[2] 是你通过上位机求取的矩阵,在您的剪切板中。

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

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

如果使用二值化图,那么ImageUsed就是二值化的去畸变图

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

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

代码如下:

//
// Created by RUPC on 2022/10/14.
//
#define RESULT_ROW 100//结果图行列
#define RESULT_COL 114
#define         USED_ROW                120  //用于透视图的行列
#define         USED_COL                188
#define PER_IMG     mt9v03x_image_dvp//mt9v03x_image_dvp:用于透视变换的图像 也可以使用二值化图
#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) {
/****************相机内参******************************/
    double cameraMatrix[3][3]={{296.482019,0.000000,152.664982},{0.000000,286.375269,104.540031},{0.000000,0.000000,1.000000}};
    double distCoeffs[5]={-0.459946,0.283675,0.002304,0.002566,-0.109265};
    int move_xy[2]={0,0};
    /*********************地址映射******************************/
    static uint8_t BlackColor = 0;
    double fx = cameraMatrix[0][0]
    , fy = cameraMatrix[1][1]
    , ux = cameraMatrix[0][2]
    , uy = cameraMatrix[1][2]
    , k1 = distCoeffs[0]
    , k2 = distCoeffs[1]
    , k3 = distCoeffs[4]
    , p1 = distCoeffs[2]
    , p2 = distCoeffs[3];
    int move_x=move_xy[0], move_y=move_xy[1];
    for (int i = -move_y; i < RESULT_ROW; i++) {
        for (int j = -move_x; j < RESULT_COL; j++) {
            double xCorrected = (j - ux) / fx;
            double yCorrected = (i - uy) / fy;
            double xDistortion, yDistortion;
            double r2 = xCorrected * xCorrected + yCorrected * yCorrected;
            double deltaRa = 1. + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2 * r2;
            double deltaRb = 1 / (1.);
            double deltaTx = 2. * p1 * xCorrected * yCorrected + p2 * (r2 + 2. * xCorrected * xCorrected);
            double deltaTy = p1 * (r2 + 2. * yCorrected * yCorrected) + 2. * p2 * xCorrected * yCorrected;
            xDistortion = xCorrected * deltaRa * deltaRb + deltaTx;
            yDistortion = yCorrected * deltaRa * deltaRb + deltaTy;
            xDistortion = xDistortion * fx + ux;
            yDistortion = yDistortion * fy + uy;
            if (i + move_y >= 0 && i + move_y < RESULT_ROW && j + move_x >= 0 && j + move_x <= RESULT_COL) {
                if (yDistortion >= 0 && yDistortion < USED_ROW && xDistortion >= 0 && xDistortion < USED_COL) {
                    PerImg_ip[i + move_y][j + move_x] = &mt9v03x_image_dvp[(int) yDistortion][(int) xDistortion];
                } else
                    PerImg_ip[i + move_y][j + move_x] = &BlackColor;
            }
        }
    }
}

/*ImageUsed[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;
 
        }
    }
}

6.资源文件

其中包含了测试图包

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

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

由于现在仅仅完成了只逆透视,和只去畸变的处理,后续打算加入去畸变+逆透视一体化的操作,所以github中的更新会更为及时,csdn上的更新会较为缓慢。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 拓展班上机课题解22/10/14
  • Matlab论文插图绘制模板第56期—曲面图(Surf)
  • LQ0091 完全二叉树的权值【最值】
  • 量子笔记:张量、外积、张量积
  • Hadoop中的Yarn 生产环境核心参数配置案例、Yarn 案例实操(一)
  • GCN(Graph Convolutional Netwok)公式推导
  • Docker打包深度学习项目
  • 常见十大排序算法(动图剖析)
  • 串口数据流抓包监控监视侦听监测获取PC软件和串口设备
  • 基于MAX-SUM算法的大规模信息系统的协调问题matlab仿真——详细版
  • 【九天·毕昇】一个免费获得GPU的算力平台
  • Java秒杀系统设计
  • 【C语言】自定义类型(构造类型)——结构体、枚举和联合体
  • 《SpringBoot篇》19.SpringBoot整合Quart
  • 一把搞懂线程中stop、sleep、supend、yield、wait、notify
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • docker python 配置
  • HomeBrew常规使用教程
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript对象详解
  • JavaScript异步流程控制的前世今生
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • PHP 小技巧
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • SOFAMosn配置模型
  • spring + angular 实现导出excel
  • 分享一份非常强势的Android面试题
  • 基于 Babel 的 npm 包最小化设置
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端攻城师
  • 如何在 Tornado 中实现 Middleware
  • 使用common-codec进行md5加密
  • 突破自己的技术思维
  • 网络应用优化——时延与带宽
  • 微信小程序--------语音识别(前端自己也能玩)
  • 一些关于Rust在2019年的思考
  • 译有关态射的一切
  • 正则表达式小结
  • 《码出高效》学习笔记与书中错误记录
  • Java数据解析之JSON
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #git 撤消对文件的更改
  • #数据结构 笔记三
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)