首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

智能车图像处理去畸变教程

  • 23-07-24 11:52
  • 1903
  • 2031
blog.csdn.net

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

 去畸变+逆透视请参考:智能车去畸变+逆透视教程_LoseHu的博客-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张左右

        3.如果选择文件夹后出现闪退,说明图片数量过少,达标的图片过少,请重新采样!!!

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) {

    static uint8_t BlackColor = 0;
    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};


/* 0:USED_COL
 * 1:USED_ROW
 * 2:fx =K.at(0, 0)
 * 3:fy = K.at(1, 1)
 * 4: ux = K.at(0, 2)
 * 5:  uy = K.at(1, 2);
 * 6: k1 = .at(0, 0),
 * 7:  k2 = D.at(0, 1),
 * 8: k3=  D.at(0, 4),
 * 9: p1 = D.at(0, 2),
 * 10:   p2 = D.at(0, 3);
 */




    /*********************Mat******************************/

    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-move_y; i++) {
        for (int j = -move_x; j < RESULT_COL-move_x; 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

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        修复去畸变+逆透视下位机代码中未考虑的可能

注:本文转载自blog.csdn.net的LoseHu的文章"https://blog.csdn.net/wu58430/article/details/127324103"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top