nuScenes、Culane数据集、Camera选型及内参标定、TX2外接双目相机ZED

2023-05-16

1:nuScenes数据集

在这里插入图片描述
https://zhuanlan.zhihu.com/p/295549692
在这里插入图片描述

nuScenes-mini-data
在这里插入图片描述

在这里插入图片描述
点云数据集
在这里插入图片描述
针对cuda10.0 spconv版本
安装cu100版本
torch-1.3.0+cu100-cp37-cp37m-linux_x86_64.whl
torchvision-0.4.1+cu100-cp37-cp37m-linux_x86_64.whl

2:Culane数据集

CULane由安装在六辆由北京不同驾驶员驾驶的不同车辆上的摄像机收集。收集了超过55小时的视频,并提取了133,235帧。数据示例如上所示。我们将数据集分为88880个训练集,9675个验证集和34680个测试集。测试集分为正常和8个挑战性类别,分别对应于上述9个示例。

https://zhuanlan.zhihu.com/p/295549692

如果使用百度云,请确保driver_23_30frame_part1.tar.gz 和 driver_23_30frame_part2.tar.gz中的图像解压缩后位于一个文件夹“ driver_23_30frame”中,而不是两个单独的文件夹中。

数据集文件夹应包括:

1.培训与验证的图像和注释:

  • driver_23_30frame.tar.gz
  • driver_161_90frame.tar.gz
  • driver_182_30frame.tar.gz 对于每个图像,将有一个.txt注释文件,其中每个行给出车道标记关键点的x,y坐标。

2.测试图像和注释:

  • driver_37_30frame.tar.gz
  • driver_100_30frame.tar.gz
  • driver_193_90frame.tar.gz

3.培训/认证/检测列表:

  • list.tar.gz 对于用于训练的train_gt.txt,每行的格式为“输入图像,每个像素的标签,四个0/1数字,指示从左到右存在四个车道标记”。
  1. Train&val的车道分段标签:
    -laneseg_label_w16.tar.gz ,它是从原始注释生成的。

注意: training&val集的原始注释(不是分段标签)在2018年4月16日之前不正确。要更新到正确的版本,您可以下载“
annotations_new.tar.gz”并覆盖原始注释文件或下载training&val集再次。
可视化:

import os
import numpy as np
import sys
sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
import cv2 as cv

root_name = "/home/laneseg_label_w16/driver_23_30frame/05151640_0419.MP4"
img_root_name = "/home/driver_23_30frame/05151640_0419.MP4"
img_path = os.listdir(root_name)
print('img_path:',img_path)
for i in img_path:
    if os.path.splitext(i)[1]==".png":
       print (i)
       img = cv.imread(root_name +"/"+ i)
       for x in range(img.shape[0]):
             for y in range(img.shape[1]):
                px = img[x,y]
                #print(px)
                if px[0] == 2:
                   img[x,y] = 200
       cv.imshow("vis",img)
       img = cv.imread(img_root_name +"/"+ i.split('.')[0]+'.jpg')
       cv.imshow("vis_img",img)
       cv.waitKey(0)
       

CULane训练的文件结构:

包括存放 车道线关键点的txt;
车道线图片和车道小label1的图片以及对应txt路径

├── annotations_new
│   ├── driver_161_90frame
│   ├── driver_182_30frame
│   └── driver_23_30frame
├── laneseg_label_w16
│   ├── driver_161_90frame
│   ├── driver_182_30frame
│   └── driver_23_30frame
├── laneseg_label_w16_test
│   ├── driver_100_30frame
│   ├── driver_193_90frame
│   └── driver_37_30frame
├── list
│   ├── test_split
│   ├── test.txt
│   ├── train_gt.txt
│   ├── train.txt
│   ├── val_gt.txt
│   └── val.txt
├── show_lane.py
├── test_set
│   ├── driver_100_30frame
│   ├── driver_193_90frame
│   └── driver_37_30frame
└── train_set
    ├── driver_161_90frame
    ├── driver_182_30frame
    └── driver_23_30frame

3:Camera摄像头

焦距选择,
2.8mm到16mm情况
轨道用12ms
双目6mm,25mm
在这里插入图片描述
内参和小孔成像:

https://blog.csdn.net/weixin_41977337/article/details/111941234
在这里插入图片描述

估算理论相机内参方法:

通俗的讲像元就是每张图片的最小构成单元,就是一幅图像中每个小像素格,每个像素格均为正方形因此可以理解为像元的长宽是一样的;

(像元尺寸)=(传感器的高度)/(最大像素高度)=(传感器的宽度)/(最大像素宽度)
注:传感器的高度和宽度是定值 相机确定好了就不会改变;
但是图像的像素值是可以改变的,选用最大像素值就是选用没有更改的图片的像素值,即这个情况下的像素宽高比和相机传感器的宽高比是一定的,最后在高度方向算出的像元尺寸是一致的,符合理论。如果选用不同的像素值来计算可能造成宽高比不一致 ,计算出的像元尺寸不符合。

像元的物理尺寸大小:d x =F w/W , dy =Fh / H ;
像素为单位的主点坐标:u0 =X/dx , v0 =Y /dy ;

内参参数包括

针孔相机模型的内参包含6个(f,κ,fx,fy,u0,v0);

f 为相机的焦距,单位一般是mm。

fx = f/dx, fy = f/dy,分别称为x轴和y轴上的归一化焦距。
一个像素的实际物理尺寸在x方向和y方向分别为dx和dy,dx,dy 为像元尺寸。
dx和dy表示x方向和y方向的一个像素分别占多少个单位,是反映现实中的图像物理坐标关系与像素坐标系转换的关键(可以理解为像元密度)。

(u0,v0 )为图像中心,u0,v0表示图像的中心像素坐标和图像原点像素坐标之间相差的横向和纵向像素数偏移量(以像素为单位)。

为了不失一般性,在相机的内参矩阵中,添加一个扭曲参数,在图像物理坐标系中的扭曲因子为。对于大多数标准相机,该扭曲参数为0。

k:表示径向畸变量级,如果k为负值,畸变为桶型畸变,如果为正值,那畸变为枕型畸变,初始值为0。

在这里插入图片描述

fx fy

估算方法:
在这里插入图片描述

内参标定方法:

https://www.cnblogs.com/wangguchangqing/p/8335131.html

正常情况,单应性矩阵求解:

这样一组匹配点对p1和p2就可以构造出两项约束,于是自由度为 8 的单应矩阵可以通过 4 对匹配点算出组
在这里插入图片描述

上述方程组采用直接线性解法通常很难得到最优解,

初值基础上进行非线性优化:
在这里插入图片描述

所以实际使用中一般会用其他优化方法,如奇异值分解、Levenberg-Marquarat(LM)算法等进行求解。

在这里插入图片描述

那么张正友标定:

上面我们推导的单应性矩阵是在相机运动的情况下进行的,但是相机标定的过程中相机是静止的,而运动的棋盘格标定板。在张正友标定中,用于标定的棋盘格是三维场景中的一个平面P,其在成像平面的像是另一个平面p,
单应性矩阵就是指两个平面之间的映射关系,
准确的来说是世界坐标系和像素坐标系之间的映射关系。

https://blog.csdn.net/qq_42118719/article/details/112347552

标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄,最少需要3张,以10~20张为宜。
步骤:
1、从照片中提取棋盘格角点。
2、估算理想无畸变的情况下,五个内参和六个外参。
3、应用最小二乘法估算实际存在径向畸变下的畸变系数。
4、极大似然法,优化估计,提升估计精度.
在这里插入图片描述
又由于,R是旋转矩阵,则其是正交矩阵,也就是其任意两个列向量的内积为0,列向量的模为1。

|||||||||||||||||||||||||||||||||||||||||||
故有:
则对于一幅棋盘标定版的图像(一个单应矩阵)可以获得两个对内参数的约束等式

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
3D平面和2D平面约束
相机标定,双目之间标定
1:基础矩阵
2:单应性矩阵
在这里插入图片描述

图像去畸变原理

https://blog.csdn.net/dreamguard/article/details/83096071

函数调用Python
https://blog.csdn.net/qq_30815237/article/details/87622654

径向畸变去除方法
在这里插入图片描述

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;
//
string distort_image_file="/home/chen/slambook2/ch5/imageBasics/distorted.png";

int main() {
    //读图
    Mat image_distort=imread(distort_image_file,CV_8UC1);
    imshow("未去畸变的图像",image_distort);
    waitKey(0);
    Mat image_undistort=image_distort.clone();
    //去畸变参数
    double k1 = -0.28340811, k2 = 0.07395907, p1 = 0.00019359, p2 = 1.76187114e-05;
    // 内参
    double fx = 458.654, fy = 457.296, cx = 367.215, cy = 248.375;
    //去畸变
    for (size_t v=0;v<image_distort.rows;v++){
        for (size_t u=0;u<image_distort.cols;u++){
            double x=(u-cx)/fx,y=(v-cy)/fy; //畸变的空间坐标
            double r_2=x*x+y*y;             //计算r的平方
            //去畸变的P点坐标
            double x_undistort=x*(1+k1*r_2+k2*r_2*r_2)+2*p1*x*y+p2*(r_2+2*x*x);
            double y_undistort=y*(1+k1*r_2+k2*r_2*r_2)+2*p2*x*y+p1*(r_2+2*y*y);
            //去畸变后的图像坐标
            double u_undistort=fx*x_undistort+cx;
            double v_undistort=fy*y_undistort+cy;
            //插值
            if(u_undistort>=0 && v_undistort>=0 && u_undistort<image_distort.cols && v_undistort<image_distort.rows){
                image_undistort.at<uchar>(v,u)=image_distort.at<uchar>((int)v_undistort,(int)u_undistort);
            }
            else{
                image_undistort.at<uchar>(v,u)=0;
            }
        }
    }
    imshow("去畸变的图像",image_undistort);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

Linux基于V4L2的摄像头图像采集

一、V4L2的定义

V4L2(Video For Linux Two) 是内核提供给应用程序访问音、视频驱动的统一接口,在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/videoN下,N可能为0,1,2,3… 一般为0。

二、工作流程

Step1:初始化摄像头。打开设备->检查和设置设备属性->设置帧格式

Step2:启动采集命令。申请帧缓冲->内存映射->帧缓冲入队列->开始采集->帧缓冲出队列->重新入队列循环采集

Step3:停止采集命令

Step4:关闭摄像头

三、常用的结构体(参见/usr/include/linux/videodev2.h)

struct v4l2_requestbuffers reqbufs;//向驱动申请帧缓冲的请求,里面包含申请的个数
struct v4l2_capability cap;//这个设备的功能,比如是否是视频输入设备
struct v4l2_input input; //视频输入
struct v4l2_standard std;//视频的制式,比如PAL,NTSC
struct v4l2_format fmt;//帧的格式,比如宽度,高度等

struct v4l2_buffer buf;//代表驱动中的一帧
v4l2_std_id stdid;//视频制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query;//查询的控制
struct v4l2_control control;//具体控制的值

四、常用的控制命令

VIDIOC_REQBUFS:分配内存
VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成物理地址
VIDIOC_QUERYCAP:查询驱动功能
VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式
VIDIOC_S_FMT:设置当前驱动的频捕获格式
VIDIOC_G_FMT:读取当前驱动的频捕获格式
VIDIOC_TRY_FMT:验证当前驱动的显示格式
VIDIOC_CROPCAP:查询驱动的修剪能力
VIDIOC_S_CROP:设置视频信号的边框
VIDIOC_G_CROP:读取视频信号的边框
VIDIOC_QBUF:把数据从缓存中读取出来
VIDIOC_DQBUF:把数据放回缓存队列
VIDIOC_STREAMON:开始视频显示函数
VIDIOC_STREAMOFF:结束视频显示函数
VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。

例如:

//打开
#include <fcntl.h>
int open(const char *device_name, int flags);
//关闭
#include <unistd.h>
int close(int fd);

实验使用UVC摄像头,插入后自动生成设备“/dev/vedio0”,
打开关闭实例如下

int fd = open("/dev/video0",O_RDWR);

close(fd);

4 CurveLanes

在这里插入图片描述

4 TX2T外接双目相机ZED

下载ZED SDK
https://www.stereolabs.com/developers/release/

     chmod +x ZED_SDK_Ubuntu16_v2.7.1.run
     ./ZED_SDK_Ubuntu16_v2.7.1.run

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nuScenes、Culane数据集、Camera选型及内参标定、TX2外接双目相机ZED 的相关文章

  • 应用向左,理论向右,计算机2021的冰火两重天

    近来来计算理论的发展极其缓慢 xff0c 而与之对应的是计算机领域的应用侧发展可谓日新月异 xff0c 像GPT 3及其衍生的AI模型 xff0c 各类大数据模型 超大规模云平台等等方面的进展不胜枚举 xff0c 相关成果也都举世瞩目 xf
  • mysqldump常用命令

    http www blogjava net Alpha archive 2007 08 10 135694 html 1 导出整个数据库 mysqldump u 用户名 p 数据库名 gt 导出的文件名 mysqldump u wcnc p
  • ci中使用多个数据库的方法

    config 39 hostname 39 61 config item 39 database ip 39 config 39 username 39 61 config item 39 database username 39 conf
  • php中强制浏览器下载文件

    file 61 fopen written file 39 r 39 header 39 Content type application octet stream 39 header 39 Accept Ranges bytes 39 h
  • PHP 守护进程类

    出处 xff1a http www oschina net code snippet 239150 11088 用 PHP 实现的 Daemon 类 可以在服务器上实现队列或者脱离 crontab 的计划任务 使用的时候 xff0c 继承于
  • linux的nohup命令的用法

    http www cnblogs com allenblogs archive 2011 05 19 2051136 html 在应用Unix Linux时 xff0c 我们一般想让某个程序在后台运行 xff0c 于是我们将常会用 amp
  • Mysql中创建用户帐户的方法

    http www eygle com digest 2008 01 mysql create user html 1 CREATE USER CREATE USER user IDENTIFIED BY PASSWORD 39 passwo
  • 用mysql触发器自动更新memcache

    mysql 5 1支持触发器以及自定义函数接口 UDF 的特性 xff0c 如果配合libmemcache以及Memcached Functions for MySQL xff0c 就能够实现 memcache的自动更新 简单记录一下安装测
  • 一个很爽的前端网站,有大量的资源

    http www gbin1 com technology css index html firstentry 61 0
  • Html5 Geolocation获取地理位置信息

    http www cnblogs com lwbqqyumidi archive 2012 11 10 2764352 html Html5中提供了地理位置信息的API xff0c 通过浏览器来获取用户当前位置 基于此特性可以开发基于位置的
  • openfire整合外部数据库的方法

    http www igniterealtime org builds openfire docs latest documentation db integration guide html 看了这篇教程 xff0c 发现了一个问题 xff
  • 金融机构如何应对核心系统分布式智能化升级大潮?

    过去40多年 xff0c 中国金融业实现了技术上的引进 借鉴 xff0c 并逐渐开始进行原创性创新 比如 xff0c 在 支付系统建设方面 xff0c 我国现在就走在了世界的前列 从二代大小额支付系统CNAPS到跨境人民币支付系统CIPS再
  • ajax请求中session无效的问题

    遇到一个问题 xff0c 发现网站中的所有ajax在某个服务器中的session总是无效 xff0c 后来同事查了资料 xff0c 原来php的配置文件中有个选项 xff1a Whether or not to add the httpOn
  • 解决seesion在二级域名下无效的问题

    开发中遇到了一个问题 xff0c 当用户在www aa com登陆了 xff0c 在二级域名下的登陆无效 例如 aa com 后来检查了很久 xff0c 终于知道了问题所在 xff0c 在www aa com下生成的cookie不适用于 a
  • 提供全球商家信息的网站

    做LBS的应用 xff0c 商家信息的获取和维护是个很重要的问题 xff0c 在中国的某些大型网站是雇佣了兼职人员去维护这些数据 xff0c 但对于小公司来说这种方法是不现实的 现在发现了一个网站 xff0c 提供了全球的商家信息 xff0
  • 使用web端连接xmpp

    在apache的配置文件中加入下面3句 xff1a ProxyRequests Off ProxyPass xmpp httpbind http 127 0 0 1 7070 http bind ProxyPassReverse xmpp
  • ubuntu apache开启重写模块

    http www iblue cc 2011 09 ubuntu apache E5 BC 80 E5 90 AF E9 87 8D E5 86 99 E6 A8 A1 E5 9D 97 Ubuntu下apache2的rewrite模块默认
  • openfire xmpp 如何判断用户是否在线

    http iammr 7 blog 163 com blog static 49102699201041961613109 想象中如此简单的功能 xff0c 想不到却这般大费周折 如要实现 xff0c 必须先确保 xff1a 1 openf
  • sql 分组统计

    原始的数据结构是这样的 xff1a 这是一个信息表 xff0c 记录下每个app每天对应什么等级 现在需求是 xff1a 统计每天每个等级有多少个app xff1f 实现的sql如下 xff1a select count as num le
  • Errors running builder JavaScript Validator的问题

    http jc dreaming iteye com blog 1038995 最近使用eclipse时 xff0c 在编译项目总是出现问题 Errors occurred during the build Errors running b

随机推荐

  • coreseek索引更新机制

    k索引更新机制 版权声明 xff1a 转载时请以超链接形式标明文章原始出处和作者信息及本声明 http fatal blogbus com logs 45153968 html 61 61 xff0c 昨晚太晚睡觉 xff0c 所以日记又没
  • golang生成自定义标签名(带CDATA标识)的xml

    在golang中 xff0c 有时候需要生成带CDATA标识的xml值 xff0c 例如这种 xff1a lt xml version 61 34 1 0 34 gt lt xml gt lt to User gt lt CDATA use
  • 有人痴狂,有人跑路,开源软件新一年的冰火两重天

    最近有关开源软件的话题始终占领着IT界的新闻头条 xff0c Log4j开源软件的惊天漏洞 xff0c 才刚刚出现不久 xff0c Fake js的作者也惊天删库跑路了 xff0c CurL的作者怒怼苹果只会白嫖开源却不出力 xff0c L
  • linux下通过ssh用户名密码的rsync传输文件方法

    一般用rsync传输文件都会使用密钥的方式实现免密码验证 xff0c 但有些机器由于特殊的原因 xff0c 不能配置密钥 xff0c 这时就要用ssh的用户名和密码方式使用rsync 1 首先 xff0c 通过ssh 命令登录一次远程的主机
  • codeigniter验证码类库

    http hi baidu com mediumgirl item c734b8f5a1cacfc3a835a2ae 折腾了我四五个小时 xff0c 终于 xff0c ci的验证码类库成功的整出来了 下面请看源码 xff1a 在applic
  • golang json.Marshal 特殊html字符被转义解决方案

    pages goods goods gid 61 56 amp code 61 1 会在转json中变成pages goods goods gid 61 56 u0026code 61 1 解决方案 xff1a content 61 str
  • mongodb 错误src/mongo/db/query/plan_enumerator.cpp的修复

    某个mongodb 3 2的库执行下面的查询就报错 xff1a db 34 xxxx 34 find 34 createdAt 34 34 gte 34 34 2019 04 23T00 00 00 43 08 00 34 34 lte 3
  • MySQL新建用户,授权,删除用户,修改密码

    http www cnblogs com analyzer articles 1045072 html grant all privileges on test to test 64 96 96 identified by 39 1234
  • HTTP/HTTPS, without index.php, using htaccess, plus XHR

    http ellislab com forums viewthread 86113 Removing index php and forcing HTTP HTTPS I have read many posts about people
  • 解决mysql返回的字段值全变成string型的问题

    使用php的CI框架的时候 xff0c 发现在数据库中是int型的数据 xff0c 返回的时候全变成了string了 对于弱类型的语言来说 xff0c 这个没多大关系 xff0c 但是 xff0c 如果是用于其它语言 xff0c 例如obj
  • STM32学习路线

    随笔 停更了好久啊 xff0c 有偷懒 xff0c 但不是完全偷懒 xff0c 主要还是意识到 xff0c 自己太菜了 xff0c 需要补很多东西 xff0c 以下算是学习中的一些体会吧 关关难过关关过 xff0c 成为专家可能需要天赋 x
  • 做个爱读书的程序员

    很多时候我们抱怨工作过于忙碌 xff0c 疲于应付各种事情 但是往往即使有时间也总是会无所事事地浪费掉 xff0c 我们可以找很多理由去给自己解脱 xff0c 固然是想在忙碌之外给自己放松一下 xff0c 大多却是过于可惜的时候 今天跟一个
  • 共用体结构体位域的应用

    1 xff09 增加位域定义 我们经常需要直接访问寄存器中的某个位域 C281x C C 43 43 头文件及外设示例所涉及的位域结构体方法 xff0c 为多数片上外设寄存器提供了位域定义 例如 xff0c 可以为CPU 定时器 xff08
  • C#的并发机制优秀在哪?

    笔者上次用C 写 Net代码差不多还是10多年以前 xff0c 由于当时Java已经颇具王者风范 xff0c Net几乎被打得溃不成军 因此当时笔者对于这个 Net的项目态度比较敷衍了事 xff0c 没有对其中一些优秀机制有很深的了解 xf
  • 集合中常见接口与实现类的基本介绍

    1 Iterable java中集合顶级接口之一 xff0c 实现Iterable接口的集合都是可迭代到 xff0c 可遍历 2 Collection Collection接口继承了Iterable xff0c 并且实现了Iterator迭
  • KEIL5 打开时候很多文件都自动打开解决方法

    Keil5 中修改配置 Edit gt Configuration gt Other gt Open most recent project 选中既可以 xff0c 下次打开Keil时候不会再打开很多文件
  • 新手小白,求教matlab

    用matlab写了个求阶乘的函数 xff0c function y 61 digui n n为元素个数 if n lt 61 1 y 61 1 end y 61 digui n 1 n end 结果显示 xff1a 内存不足 可能的原因是程
  • 字符串有长度限制吗?是多少?

    首先字符串的内容是由一个字符数组 char 来存储的 xff0c 由于数组的长度及索引是整数 xff0c 且String类中返回字符串长度的方法length 的返回值也是int xff0c 所以通过查看java源码中的类Integer我们可
  • C++实现推理, 基于Onnx-simplifier、onnx-tensorrt、TensorRT和Cuda编程

    Cuda基础 深度学习模型推理 为啥需要学习tensorRT 因为需要加速 需要C 43 43 部署 为啥又需要学习cuda编程呢 因为有些前处理 后处理需要cuda编程来并行运算进行加速 比如anchor的解码 nms等后处理 1 CUD
  • nuScenes、Culane数据集、Camera选型及内参标定、TX2外接双目相机ZED

    1 xff1a nuScenes数据集 https zhuanlan zhihu com p 295549692 nuScenes mini data 点云数据集 针对cuda10 0 spconv版本 安装cu100版本 torch 1