数据很不好下载,需要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
出现在 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 每次使用指针之前记得赋值就好了
https://blog.csdn.net/u014636245/article/details/90904151
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'])
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文件有问题,重新下载