oxford robotcar dataset 图像操作记录

杜良骏
2023-12-01

数据很不好下载,需要edu注册帐号。

主要下载了 bumblebee的left 和right,图片是png的,但是 一种马赛克的格式—— bayer ,且是其中的 gbrg 

bayer理论: https://blog.csdn.net/vincentlipan/article/details/36480619

https://www.cnblogs.com/qiqibaby/p/5267566.html

官方的sdk image.py 处理代码中可以看到,用了PIL库

BAYER_STEREO = 'gbrg'
BAYER_MONO = 'rggb'

    img = Image.open(image_path)
    img = demosaic(img, pattern)
    if model:
        img = model.undistort(img)

    return np.array(img).astype(np.uint8)

想用opencv,查了一下这种格式为了基本是单通道,所以就简单处理了

# 原样读取, 单通道读取
Mat img = cv:: imread( argv[1],-1);
# 转换
cv::cvtColor(img, img, cv::COLOR_BayerGR2BGR);

 

参考 https://zhuanlan.zhihu.com/p/93470381

static void demosaic(UINT16* raw_buf, UINT16* bgr_buf, UINT32 width, UINT32 height, UINT16 white_level, BAYER_TYPE bayer)
{
    cv::Mat raw_data(height, width, CV_16UC1, raw_buf);
    cv::Mat rgb_data(height, width, CV_16UC3);

    if(bayer == RGGB)
        cv::cvtColor(raw_data, rgb_data, cv::COLOR_BayerBG2BGR);
    else if(bayer == GRBG)
        cv::cvtColor(raw_data, rgb_data, cv::COLOR_BayerGB2BGR);
    else if (bayer == GBRG)
        cv::cvtColor(raw_data, rgb_data, cv::COLOR_BayerGR2BGR);
    else
        cv::cvtColor(raw_data, rgb_data, cv::COLOR_BayerRG2BGR);

    memcpy(bgr_buf, rgb_data.data, sizeof(UINT16)*width*height * 3);
    for (UINT32 row = 0; row < height; row++)
    {
        for (UINT32 col = 0; col < width*3; col++)
        {
            if (bgr_buf[row*width * 3 + col] > white_level)
                bgr_buf[row*width * 3 + col] = white_level;
        }
    }
}

 

图片保存方法的不同

https://www.cnblogs.com/skyfsm/p/8276501.html

 

运行 orb-line-slam 会出现一个 根据line求解位姿的段错误,

出现在 tracking.cc中的optimizewithline中 

https://github.com/robotseu/ORB_Line_SLAM/issues/4

修改如下解决,

Optimizer.cc  620行  bool Optimizer::PoseOptimizationWithLine(Frame *pFrame)函数

DT_cov = pFrame->DT_cov; 改为  DT_cov << pFrame->DT_cov;

bool Optimizer::PoseOptimizationWithLine(Frame *pFrame)
{

    // definitions
    Matrix4d DT, DT_;
    Matrix6d DT_cov;
    double   err = numeric_limits<double>::max();
    err = -1.0;

    if(pFrame->mTcw_prev.empty())
        pFrame->mTcw_prev = pFrame->mTcw;     // After Relocalization(), mTcw_prev is empty.
    // set init pose (depending on the use of prior information or not, and on the goodness of previous solution)
    if( Config::useMotionModel() && pFrame->mnId >1)
    {
        DT     = Converter::toMatrix4d(pFrame->mTcw) * Converter::toInvMatrix4d(pFrame->mTcw_prev);
        // DT     = expmap_se3(logmap_se3( inverse_se3( pFrame->DT ) )); //pFrame->DT;
        DT_cov << pFrame->DT_cov;
        // double e_prev = pFrame->err_norm;
        // if( !isGoodSolution(DT,DT_cov,e_prev) )
        //     DT = Matrix4d::Identity();
    }

 

同样,bool Optimizer::PoseOptimizationWithLine(Frame *pFrame)  682 683 行

pFrame->DT       <<  expmap_se3(logmap_se3( inverse_se3( DT ) ));
pFrame->DT_cov   << DT_cov;

原因分析:

作为类的对象成员变量的DT 等存在于与 函数临时变量不同的内存,直接赋值存在 内存非法

用 << 解决了 内存拷贝的问题

段错误究根到底就是访问了非法内存:

这个内存区要么是不存在的,要么 是受到系统保护的,还有可能是缺少文件或者文件损坏。可能的原因包括:
访问代码段(原因经常是指针未初始化指向了错误的位置或解引用空指针)、访问寄存器
例子1:解引用空指针 int *p=NULL; printf("%d\n",*p); //因为内存低地址为代码段,不可访问?
例子2:访问含有非法值得内存 register int p =10; printf("%d\n",*p); //由于register关键字使变量存储到内核寄存器中,因此不能访问。
野指针:即定义指针时并未对其初始化,其指向的的位置式未知的。对野指针解引用可能造成段错误或者导致程序崩溃。
防止方案:1;定义时初始化为NULL 2;解引用前赋值 3;使用完后指向NULL 每次使用指针之前记得赋值就好了

 

matplotlib.animation 绘制动态

https://blog.csdn.net/u014636245/article/details/90904151

 

matplotlib绘制三维轨迹图

https://www.cnblogs.com/leexiaoming/p/6641162.html

 

拾取

np.savez

如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数的第一个参数是文件名,其后的参数都是需要保存的数组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, …。

savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容

 

import numpy as np
a=np.arange(3)
b=np.arange(4)
c=np.arange(5)
np.savez('array_save.npz',a,b,c_array=c)

import numpy as np
A=np.load('array_save.npz')
print(A['arr_0'])
print(A['arr_1'])
print(A['c_array'])

 

跑 r2d2 可视化

sift是  float 描述子,matcher默认参数 NORM_L2,只能用 knnMatch

orb是 二进制描述子,要用norm_hanming, 可以用bfmatcher

https://blog.csdn.net/weixin_44996354/article/details/103320462

https://blog.csdn.net/weixin_39625008/article/details/110367515

numpy读取.p文件时出现Cannot load file containing pickled data:

对照了下  是r2d2文件有问题,重新下载

 类似资料: