视觉SLAM十四讲 读书编程笔记 Chapter5 相机与图像

视觉SLAM十四讲 读书 笔记 此为视觉SLAM十四讲第二章的读书笔记 1、P24 第二章对于SLAM问题的由来以及建模的发展演化过程有一个比较清晰的介绍(想吐槽一下的就是:在一个研究领域刚兴起的时候,真的就是百花齐放啊,行业内对于同一个东西会有各种各样的描述,虽然每个作者的描述都没有错,但是对于初学者而言,今天在文章中看到一个“状态估计的不确定性研究”,明天看到一个“CML”或者“SLAM”,但是其实描述的是同一个东西,徒增了一些困惑),特别是对于初学者,对于SLAM问题到底是个啥?描述的很通俗易懂。 2、Ubuntu的安装 为了减少不 阅读详情

相机模型

  1. 使用针孔和畸变两个模型来描述相机的整个投影过程,把外部的三维点投影到相机内部的成像平面,就构成了相机的内参数。

  2. 针孔相机模型
    在这里插入图片描述
    在相机坐标系下,设物点P坐标为[X,Y,Z]T,像点P’坐标为[X’,Y’,Z’]T,显然Z’=f,那么根据相似三角形,有:
    Z/f = -X/X’ = -Y/Y’
    这是初中物理的知识,其中负号表示像是倒着的,像的正倒对于CCD传感器没有任何实际意义,因此将负号去掉:
    Z/f = X/X’ = Y/Y’,整理得:X’=fX/Z Y’=fY/Z
    在这里插入图片描述

  3. 内参矩阵:像素坐标系与物理成像平面坐标系互相转换
    像素坐标系定义:原点位于左上角,u轴向右与x轴平行,v轴向下与y轴平行。
    像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。
    设像素坐标在u轴上缩放了alpha倍,在v轴上缩放了beta倍,原点平移了[cx,cy]T
    像点P’与像素坐标[u,v]T的关系为:
    u = alpha X’ + cx
    v = beta X’ + cy
    令fx = alpha f , fy = beta f ,那么:
    u = fxX/Z + cx
    v = fyY/Z + cy
    写成矩阵形式为:在这里插入图片描述
    按照传统习惯,将Z挪到左侧:
    在这里插入图片描述
    其中K就是相机的内参矩阵,它与焦距f,原点的平移[cx,cy]T,u轴上的缩放alpha,v轴上的缩放beta有关。

  4. 内参矩阵&外参矩阵:世界坐标系向像素坐标系的转换
    在这里插入图片描述
    这里的Pw=[Xw,Yw,Zw,1]T,是齐次坐标;
    TPw=[Xc,Yc,Zc,1]T,表示的也是齐次坐标;
    这里TPw隐含了一次齐次坐标向非其次坐标转换的过程,转换完之后,不区分记号Pc=TPw=[Xc,Yc,Zc]T;
    如果将Pc也进行归一化,上图中式子两边同除Z(实质上是Zc),就变成了齐次坐标等式:Puv=KTPw ,
    此时Pc=[Xc/Zc,Yc/Zc,1]T,成为归一化坐标,它位于相机前方z=1处的平面上,该平面也被称为归一化平面。

  5. 径向畸变
    径向畸变是由透镜形状引入的,分为桶形失真和枕形失真。
    设[x,y]T是归一化的平面点坐标,[xdistorted,ydistorted]T是畸变后点的坐标。
    xdistorted = x(1 + k1r2 + k2r4 + k3r6)
    ydistorted = y(1 + k1r2 + k2r4 + k3r6)
    畸变较小的图像中心区域,畸变纠正主要是k1在起作用;而对于畸变较大的边缘区域,主要是k2在起作用。普通相机用这两个系数就可以很好的纠正径向畸变,对于畸变很大的摄像头,比如鱼眼镜头,可以加入k3畸变项对径向畸变进行纠正。

  6. 切向畸变
    切向畸变是由于透镜和成像平面不严格平行而引入的。
    在这里插入图片描述
    切向畸变可以用两个参数p1,p2来进行纠正:
    xdistorted = x + 2p1xy + p2(r2+2x2)
    ydistorted = y + 2p2xy + p1(r2+2y2)

  7. 径向畸变和切向畸变共同作用
    假设相机坐标系中有一点P(X,Y,Z),通过径向畸变和切向畸变的五个系数,可以找到这个点在像素平面上的正确位置:
    (1)将相机坐标系下的三维点投影到归一化图像平面。设它的归一化坐标为[x,y]T.
    (2)对归一化平面上的点进行径向畸变和切向畸变纠正。给定归一化坐标,可以求出原始图像上的坐标
    xdistorted = x(1 + k1r2 + k2r4 + k3r6) + 2p1xy + p2(r2+2x2)
    ydistorted = y(1 + k1r2 + k2r4 + k3r6) + 2p2xy + p1(r2+2y2)
    (3)将纠正后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置。
    u = fxxdistorted + cx
    v = fyydistorted + cy

实际使用中,存在两种去畸变处理方法。
方法一:先对整张图像进行去畸变处理,得到去畸变之后的图像,然后用针孔模型讨论空间点的投影问题。
方法二:考虑图像中的某个点,按照去畸变的方程,讨论其去畸变后的空间位置。

双目相机原理简介

在这里插入图片描述
如图所示,左眼像素PL(uL,vL),右眼像素PR(uR,vR).
假设左眼像素和右眼像素的v是相同的,即相机只在水平方向发生旋转或平移。那么沿着x方向OLPL的距离为uL - cx,沿着x方向ORPR的距离为cx - uR
根据三角形PPLPR和三角形POLOR的相似关系,有:
(z-f)/z = (b-(uL-cx)-(cx-uR))/b
(z-f)/z = (b-(uL-uR))/b
设视差d=uL-uR,那么:
(z-f)/z = (b-d)/b
整理得:
z = fb/d
可见,视差与距离成反比:视差越大,距离越近。
而又因为视差最小为一个像素,所以,双目深度存在一个极限值,由fb决定。fb越大,设备能测到的距离就越远。

实践:图像的存取与访问

  1. 安装opencv的依赖
sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev

在ubuntu16.04上出现报错
在这里插入图片描述
按照提示改成:

sudo apt-get install build-essential libgtk2.0-dev libvtk5-dev libjpeg-dev libtiff5-dev libjasper-dev libopenexr-dev libtbb-dev
  1. opencv源码编译
    opencv本身也是一个cmake工程,make之后,要调用如下命令将其安装在机器上
sudo make install
  1. 一些问题说明
    我下载的opencv源码版本为opencv-3.3.0.zip,使用的操作系统是ubuntu16.04
    在执行make时,出现如下报错:
    .
    在这里插入图片描述解决办法如下:
sudo apt-get autoremove libtiff5-dev
sudo apt-get install libtiff5-dev

然后再make就可以成功了。

代码:
imageBasics,cpp

//2019.08.07
#include <iostream>
#include <chrono>
using namespace std;

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

int main(int argc, char** argv)
{
	//读取argv[1]指定的图像
	cv::Mat image;
	image = cv::imread(argv[1]);//cv::imread函数读取指定路径下的图像
	//判断图像文件是否正确读取
	if(image.data == nullptr)//数据不存在,可能是文件不存在
	{
		cerr << "文件" << argv[1] << "不存在." << endl;
		return 0;
	}
	
	//若文件读取顺利,首先输出一些基本信息
	cout<<"图像宽为"<<image.cols<<", 高为"<<image.rows<<", 通道数为"<<image.channels()<<endl;
	cv::imshow("image",image);//用cv::imshow()显示图像
	//判断image的类型
	if(image.type() != CV_8UC1 && image.type() != CV_8UC3)
	{
		//图像类型不符合要求
		cout << "请输入一张彩色图或灰度图."<<endl;
		return 0;
	}
	
	//遍历图像
	//使用std::chrono来给算法计时
	chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
	for( size_t y=0; y<image.rows;y++)
	{
		for( size_t x=0;x<image.cols;x++)
		{
			//访问位于x,y处的像素
			//用cv::Mat::ptr获得图像的行指针
			unsigned char* row_ptr = image.ptr<unsigned char>(y);//row_ptr是第y行的头指针
			unsigned char* data_ptr = &row_ptr[x*image.channels()];//data_ptr指向待访问的像素数据
			//输出该像素的每个通道,如果是灰度图就只有一个通道
			for(int c=0; c != image.channels();c++)
			{
				unsigned char data = data_ptr[c];//data为I(x,y)第c个通道的值
			}
		}
	}
	chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
	chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2-t1);
	cout <<"遍历图像用时:"<<time_used.count()<<"秒。"<<endl;
	
	
	//关于cv::Mat的拷贝
	//直接赋值并不会复制数据
	cv::Mat image_another = image;
	//修改image_another会导致image发生变化
	image_another(cv::Rect(0,0,100,100)).setTo(0);//将左上角100×100的块置零
	cv::imshow("image",image);
	cv::waitKey(0);
	
	//使用clone函数来复制数据
	cv::Mat image_clone = image.clone();
	image_clone(cv::Rect(0,0,100,100)).setTo(255);
	cv::imshow("image",image);
	cv::imshow("image_clone",image_clone);
	cv::waitKey(0);

	//销毁掉所有窗口
	cv::destroyAllWindows();
	return 0;


}

CMakeLists.txt

#2019.08.07
# 添加C++标准文件
set(CMAKE_CXX_FLAGS "-std=c++11")

#寻找opencv库
find_package(OpenCV REQUIRED)

#添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})


add_executable(imageBasics imageBasics.cpp)

#链接OpenCV库
target_link_libraries(imageBasics ${OpenCV_LIBS})

运行结果:
在这里插入图片描述
在这里插入图片描述

实践:点云拼接

安装PCL

PCL安装命令

sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all

在ubuntu16.04上运行报错,原因是源被移除。

解决办法:下载PCL源码,手动编译安装,步骤如下
(1)从github上下载pcl源码,下载地址为https://github.com/PointCloudLibrary/pcl
下载完成后,得到pcl-master.zip文件,解压

(2)安装相应依赖库

    sudo apt-get update
    sudo apt-get install git build-essential linux-libc-dev
    sudo apt-get install cmake cmake-gui 
    sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
    sudo apt-get install mpi-default-dev openmpi-bin openmpi-common  
    sudo apt-get install libflann1.8 libflann-dev
    sudo apt-get install libeigen3-dev
    sudo apt-get install libboost-all-dev
    sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
    sudo apt-get install libqhull* libgtest-dev
    sudo apt-get install freeglut3-dev pkg-config
    sudo apt-get install libxmu-dev libxi-dev 
    sudo apt-get install mono-complete
    sudo apt-get install qt-sdk openjdk-8-jdk openjdk-8-jre

(2)在pcl-master文件夹下新建文件夹build
(3)在build文件夹下编译

cmake  -DCMAKE_BUILD_TYPE=None  -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_GPU=ON  -DBUILD_apps=ON  -DBUILD_examples=ON  -DCMAKE_INSTALL_PREFIX=/usr ..
make -j2  
sudo make install  

(4)可选,PCL可视化相关包安装

sudo apt-get install libopenni-dev 
sudo apt-get install libopenni2-dev

大功告成!

数据说明

在slambook/ch5/joinMap中准备了5对图像,在color/下有1.png到5.png共5张RGB图,而在depth/下有5张对应的深度图。同时,pose.txt文件给出了5张图像相机位姿(以TWC形式)。位姿记录的形式是平移向量加旋转四元数:[x,y,z,qx,qy,qz,qw]

点云拼接

(1)根据内参计算一对RGB-D图像对应的点云。
(2)根据各张图的相机位姿,把点云加起来,组成地图。
完整代码:
joinMap.cpp

//2019.08.08
#include <iostream>
#include <fstream>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <Eigen/Geometry>
#include <boost/format.hpp>//for formating strings
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
//#include <pcl/visualization/pcl_visualizer.h>//注释掉,因为没有编译显示相关的包

int main()
{
	vector<cv::Mat> colorImgs, depthImgs;	//彩色图和深度图
	vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> poses;//相机位姿(欧式变换矩阵4×4)
	
	ifstream fin("../pose.txt");
	if(!fin)
	{
		cerr<<"请在有pose.txt的目录下运行此程序"<<endl;
		return 1;
	}

	//读取5组彩色图、深度图和相机位姿
	for(int i=0;i<5;i++)
	{
		boost::format fmt("../%s/%d.%s");//图像文件格式
		colorImgs.push_back(cv::imread((fmt%"color"%(i+1)%"png").str() ));
		depthImgs.push_back(cv::imread((fmt%"depth"%(i+1)%"pgm").str(), -1 ));//使用-1读取原始图像
		
		double data[7] = {0};
		for(auto& d:data)
			fin>>d;
		
		//构造位姿矩阵T		
		Eigen::Quaterniond q(data[6],data[3],data[4],data[5]);//文件中位姿的记录形式是[x,y,z,qx,qy,qz,qw],而Eigen构造的四元数要把实部放在最前面
		Eigen::Isometry3d T(q);//旋转用四元数表示
		T.pretranslate(Eigen::Vector3d(data[0],data[1],data[2]));//设置平移向量
		
		poses.push_back(T);
	}
	
	//计算点云并拼接
	//相机内参
	double cx = 325.5;
	double cy = 253.5;
	double fx = 518.0;
	double fy = 519.0;
	double depthScale = 1000.0;

	cout<<"正在将图像转换为点云..."<<endl;
	//定义点云使用的格式,这里用XYZRGB
	typedef pcl::PointXYZRGB PointT;
	typedef pcl::PointCloud<PointT> PointCloud;

	//新建一个点云
	PointCloud::Ptr pointCloud(new PointCloud);
	//遍历每一组数据
	for(int i=0;i<5;i++)
	{
		cout<<"转换图像中:"<<i+1<<endl;
		cv::Mat color = colorImgs[i];
		cv::Mat depth = depthImgs[i];
		Eigen::Isometry3d T = poses[i];
		//遍历每一个像素
		for(int v=0; v<color.rows;v++)
		{
			for(int u=0;u<color.cols;u++)
			{
				unsigned int d = depth.ptr<unsigned short>(v)[u];
				if(d==0) continue;//为0表示没有测量到深度
				Eigen::Vector3d point;
				point[2] = double(d)/depthScale;
				point[0] = (u-cx)*point[2]/fx;
				point[1] = (v-cy)*point[2]/fy;
				Eigen::Vector3d pointWorld = T*point;//这里的T表示的是Twc,是将相机坐标系转换为世界坐标系的外参矩阵

				PointT p;
				p.x = pointWorld[0];
				p.y = pointWorld[1];
				p.z = pointWorld[2];
				p.b = color.data[v*color.step+u*color.channels()];
				p.g = color.data[v*color.step+u*color.channels() + 1];
				p.r = color.data[v*color.step+u*color.channels() + 2];
				pointCloud->points.push_back(p);
				
			}
		}
	}


	pointCloud->is_dense = false;
	cout <<"点云共有"<<pointCloud->size()<<"个点."<<endl;
	pcl::io::savePCDFileBinary("map.pcd",*pointCloud);


	return 0;

}

值得注意的是,必须注释掉头文件的最后一行,因为在上面pcl的安装中没有编译显示相关的包。
//#include <pcl/visualization/pcl_visualizer.h>
CMakeLists.txt

#2019.08.29
cmake_minimum_required( VERSION 2.8 )
project( joinMap )

set( CMAKE_BUILD_TYPE Release )
set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )

# opencv 
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )

# eigen 
include_directories( "/usr/include/eigen3/" )

# pcl 
find_package( PCL REQUIRED COMPONENT common io )
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )

add_executable( joinMap joinMap.cpp )
target_link_libraries( joinMap ${OpenCV_LIBS} ${PCL_LIBRARIES} )

运行结果:
编译运行之后,在build文件夹下会生成map.pcd文件。
然后,输入如下命令显示这个map.pcd文件:

pcl_viewer map.pcd

结果如下:
在这里插入图片描述

SLAM_视觉SLAM面试题及答案汇总 目录 1 SIFT和SUFT的区别 2 相似变换、仿射变换、射影变换的区别 3 Homography、Essential和Fundamental Matrix的区别 4 视差与深度的关系 5 描述PnP算法 6 闭环检测常用方法 7 给一个二值图,求最大连通域 8 梯度下降法、牛顿法、高斯-牛顿法的区别 9 推导一下卡尔曼滤波、描述下粒子滤波 10 如何求解Ax=b的问题 11 什么是极线约束 12 单目视觉SLAM中尺寸漂移是怎么产生的 13 解释SLAM中的绑架问题 14 描 阅读详情

相关推荐

高通camera open代码流程(hal到kernel)

内容:简单介绍Camera open代码调用流程,从HAl到kernel。(api1+hal1) 前言 Android camera api和hal对应关系。安卓在版本更新过程中,camera相关代码也经历了几个版本的更新,表现为camera HAL版本更新(HAL1->HAL2->HAL3),camera API版本更新(camera API1->camera API2),接下...

oxoo123的专栏 4277

视觉slam十四讲 学习笔记-4

下图中:u 轴向右与 x 轴平行,v轴向下与 y 轴平行,像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。我们设像素坐标在 u 轴上缩放了 α 倍,在 v 上缩放了 β 倍。同时,原点平移了 [c x , c y ] T。中的括号就是先将世界坐标系转化为相机的坐标系,然后乘以K内参矩阵再进行一次转换。上图中:中间的量组成的矩阵称为相机的内参数矩阵K,世界坐标记为Pw,上图中的矩阵形式乘开即为展开形式,其中矩阵即为内参矩阵K。这里分别是齐次和非齐次的表示方式。(即表示的是缩放和平移)

echo_gou的博客 860

C# Code-Behind 技术全面解析

Code-Behind 是 ASP.NET Web Forms 中的一种技术模式,通过将用户界面标记(.aspx文件)与程序逻辑代码(.aspx.cs文件)分离,实现表现层与逻辑层的解耦。其核心思想是前端展示与后台逻辑的物理文件分离,通过ASP.NET编译器将两者合并编译成一个Page类并执行。Code-Behind 的优势包括较好的代码组织、较高的开发效率,尤其适合快速开发数据驱动应用。然而,与现代开发模式如ASP.NET MVC、ASP.NET Core和Blazor相比,Code-Behind 在可维

记录学习的过程 958

采用C++的eigen构造变换矩阵(Eigen::Isometry3d)的使用方式

1、采用Eigen::Isometry3d构造变换矩阵。2、采用Eigen::Isometry3d进行旋转变换。(1)定义旋转矩阵、平移向量。(2)进行旋转或者平移的变换。

weixin_71508214的博客 930

CentOS7无网环境实战:MySQL8.0完整离线安装与避坑指南(附依赖包下载)

本文详细介绍了在CentOS7无网环境下MySQL8.0的完整离线安装流程,包括依赖包获取、系统预处理、MySQL二进制安装、服务配置与优化等关键步骤。特别针对离线安装的特殊需求,提供了从依赖包下载到服务调优的全链路解决方案,帮助用户在企业内网或隔离环境中高效部署MySQL数据库。

bush的博客 176

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2927

把手眼标定结果(x,y,z,qx,qy,qz,qw)转换为变换矩阵 python代码实现

用平移向量替换掉初始变换矩阵的前三行最后一列。函数创建一个4x4单位矩阵作为初始变换矩阵,用旋转矩阵替换掉初始变换矩阵的前三行前三列,# 手眼标定结果(示例数据)函数将四元数转换为旋转矩阵,# 将四元数转换为旋转矩阵。

m0_61668946的博客 775

VS Code配置Java开发环境避坑指南:从JDK到Spring Boot插件全流程

本文详细介绍了在VS Code中配置Java开发环境的完整流程,涵盖JDK选择、环境变量配置、核心插件安装、构建工具优化及Spring Boot项目专项设置。特别针对常见问题提供避坑方案,帮助开发者快速搭建高效稳定的开发环境,提升Java和Spring Boot开发效率。

weixin_28839699的博客 983

《视觉slam十四讲》初学小白笔记(5)

拼接点云 #include<iostream> #include<fstream> using namespace std; #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include<Eigen/Geometry> #include<boost/format.hpp> #include<pcl/point_types.h&gt.

qq_38336419的博客 674

强化学习(Reinforcement Learning)与动态系统控制方法

一个具体的 RBC 的例子是自动驾驶汽车中的交通规则。在训练过程中,代理通过与环境交互获取奖励信号,并学习如何在某个状态下采取最佳的行动,以最大化长期的累积奖励。在化工过程中,通过对生产过程中的温度、压力、流量等参数的控制来实现产品的质量和产量的提高。需要注意的是,以上代码只是一个简单的示例,实际的 MPC 系统可能会更加复杂,并包含更多的模型预测和控制算法来实现更复杂的控制任务。需要注意的是,以上代码只是一个简单的示例,实际的自动驾驶汽车系统可能会更加复杂,并包含更多的规则和条件来确保安全行驶。

AI天才研究院 4065

QGis 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中...)

QGis 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中...)

279

《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲)

前言 之所以想要写这个系列的博客,是因为想要总结一下高博的《SLAM视觉十四讲第二版》的各章内容以及自己对书后习题的一些做法,也算是对自己学习过程的一个总结和回顾。那么,正式开始! 第一讲、预备知识 SLAM 是Simultaneous Localization and Mapping 的缩写,中文译作“同时定位与地图构建”。它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建...

weixin_43619346的博客 4459

汽车ECU诊断刷写和OTA升级中的验签和校验

汽车ECU诊断刷写和OTA升级中的验签和校验

天赐好车的博客 619

《视觉SLAM十四讲 第二版》笔记及课后习题(第二讲)

读书笔记: 这一讲算是全书的一个大纲,最关键的就是介绍了经典视觉SLAM框架。 小萝卜的例子 小萝卜要解决的问题分为两个: 要明白自身的状态 这就是location 要明白外在的环境 这就是mapping 对于视觉SLAM而言,熟悉各类相机的优缺点很有必要: SLAM问题的数学表述: 运动方程和观测方程: 经典视觉SLAM框架: 我们把整个视觉 SLAM 流程分为以下几步: 传感器...

weixin_43619346的博客 4037

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

《视觉SLAM十四讲 第二版》笔记及课后习题(第七讲)

读书笔记:视觉里程计1

weixin_43619346的博客 4539

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

《视觉SLAM十四讲 第二版》笔记及课后习题(第十二讲)

读书笔记:建图

weixin_43619346的博客 3109

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《视觉SLAM十四讲 第二版》笔记及课后习题(第八讲)

读书笔记:视觉里程计2

weixin_43619346的博客 3369

视觉SLAM十四讲(2):初识SLAM

这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM。 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 编程实践 Hello SLAM 使用cmake 使用库 【高翔】视觉SLAM十四讲 2.1 小萝卜的例子 这一节高翔博士首先介绍了自己组装的“小萝卜”机器人,小萝卜要想具有自主运动的能力,首先要知道自身的姿态,然后是了解外界的环境。这两类问题都需要使用传感器,视觉SL.

10点43的博客 3418

【读书笔记】《视觉SLAM十四讲(高翔著)》 第5讲

文章目录PART1 读书笔记PART2 实践部分 PART1 读书笔记 PART2 实践部分

dahailuoa6的博客 663

视觉SLAM十四讲 读书编程笔记 Chapter 1&2

视觉SLAM十四讲 读书编程笔记 Chapter 1&21.有线性方程组Ax=b,若已知A,b,需要求解x,该如何求解?这对A和b有哪些要求?2.单目SLAM有哪些特性?3.双目相机有哪些特性?4.整体视觉SLAM流程图5.视觉SLAM流程图的一些理解6.SLAM问题的数学表达 1.有线性方程组Ax=b,若已知A,b,需要求解x,该如何求解?这对A和b有哪些要求? 答:x=A-1b,其中A...

wolfcsharp的博客 899

《视觉SLAM十四讲 第二版》笔记及课后习题(第十讲)

读书笔记:后端2 上讲我们重点介绍了以BA 为主的图优化。BA 能精确地优化每个相机位姿与特征点位置。不过在更大的场景中,大量特征点的存在会严重降低计算效率,导致计算量越来越大以至于无法实时化。本讲介绍两种在更大场景下使用的后端优化方法:位姿图。 位姿图(Pose Graph) Pose Graph即是省略了特征点的Bundle Adjustment。 Pose Graph 示意图。当我们不再优化...

weixin_43619346的博客 1948

【读书笔记】《视觉SLAM十四讲(高翔著)》 第6讲

文章目录PART1 读书笔记PART2 实践部分 PART1 读书笔记 PART2 实践部分

dahailuoa6的博客 910

《第5讲 相机与图像 》读书笔记

本文是《视觉SLAM十四讲》第5讲的个人读书笔记,为防止后期记忆遗忘写的。 本讲讨论的是“机器人如何观测外部世界”, 也就是观测方程部分。而在以相机为主的视觉 SLAM 中,观测主要是指相机成像的过程。 本节目标 总结针孔相机的模型、内参与径向畸变参数。 总结世界坐标-->相机坐标-->物理成像面坐标-->归一化成像坐标---->畸变纠正坐标 的变换。 学习并总...

LWHGMAN的博客 1200

《视觉SLAM十四讲》读书笔记--前八讲

一.初识SLAM 1.单目相机局限性:平移之后才能计算深度以及无法确定真实尺度。 双目相机测量原理:由两个单目相机构成,由两个相机之间的距离-基线估计每个像素的空间位置。基线距离越大测量的越远。 局限性:深度量程和精度受基线和分辨率限制,视差计算量大非常耗资源(主要问题),需GPU和FPGA加速才能实时输出 图像距离信息。 深度...

zhang__shuang_的博客 6560

《视觉SLAM十四讲 第二版》笔记及课后习题(第五讲)

读书笔记:相机与图像

weixin_43619346的博客 4386

视觉SLAM十四讲 读书编程笔记 Chapter13 建图

Chapter13 建图单目稠密重建极线搜索与块匹配高斯分布的深度滤波器实践:单目稠密重建实验分析与讨论像素梯度问题逆深度图像间的变换完整代码:RGB-D稠密建图实践:点云地图实践:八叉树地图 单目稠密重建 极线搜索与块匹配 如图所示,左边的相机观测到了某个像素p1,由于这是一个单目相机,我们无从知道它的深度。 图 就像对极几何中描述的一样,p1对应的空间点会落在右边相机拍摄的图像的极线l2上。 ...

wolfcsharp的博客 1583
上一篇: 视觉SLAM十四讲 读书编程笔记 Chapter12 回环检测
下一篇: 视觉SLAM十四讲 读书编程笔记 Chapter7 视觉里程计1
Leo-Ma
博客等级 码龄11年 1701粉丝 124原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值