- 博客(66)
- 资源 (3)
- 收藏
- 关注
原创 [计算机视觉] 相机成像模型之四个坐标系
世界坐标系、相机坐标系、图像坐标系、像素坐标系1、四个坐标系简介 世界坐标系:描述相机位置,(Xw,Yw,Zw) 相机坐标系:相机坐标系是连接图像物理坐标系与世界坐标系的桥梁,镜头的光心为原点,(Xc,Yc,Zc),也是投影中心 图像物理坐标系:相机坐标系的Z轴与图像的交点为原点,(x,y) 像素坐标系:图像的左上角为原点,单位pixel,(u,v)我们可以从拍摄的图片上一个点的坐标,利用相机内参外参,反推出世界中那个点的坐标,进行三维重建。构建世界坐标系是
2021-11-10 17:01:47
11093
原创 [C++] struct和class的区别与比较
C中的struct和C++中的struct的区别CC++成员函数不允许允许静态成员不允许允许访问属性默认public,不能修改默认public,还可以是private或者protected继承关系不可以继承可以从其他类或结构体继承初始化不能直接初始化数据成员可以直接初始化数据成员C是面向过程的编程语言,C++是面向对象的编程语言C中的结构体就是不同类型数据的集合,并不涉及算法和操作C++中是把数据变量及对这些变量的相关算法和操作给
2021-10-18 16:08:54
557
原创 [C++] 智能指针及循环引用问题
C++智能指针介绍由于C++没有自动回收内存机制,程序员每次new出来的内存需要手动delete,流程太复杂,忘记delete,会造成内存泄露。所以C++引入了智能指针,智能指针可用于动态资源管理。智能指针在memory头文件的std命名空间中定义。更具体的智能指针介绍可以参考我这篇博客:C++11新特性智能指针C++智能指针的类别C++11中的:unique_ptr、shared_ptr、weak_ptrC++98中的:auto_ptrunique_ptr只允许基础指针的一个所有者。可以移
2021-10-14 20:29:49
1868
1
原创 [C++] vector内存分配与释放机制
vector相关函数size():vector当前拥有的元素个数capacity():vector在必须分配新存储空间之前可以存储元素总数创建完vector之后,size和capacity都为0,但是向vector插入元素之后,会发生变化,通常capacity大于等于size,这是vector内存增长机制决定的push_back():向vector最后插入一个元素,在调用push_back时,若当前的capacity已经不能够放入新的元素(capacity=size),那么vector会
2021-10-11 16:51:52
3603
原创 [C++] 多态机制的实现原理之虚函数表
什么是多态?程序运行时,父类指针可以根据具体指向的子类对象,来执行不同的函数虚函数实现多态每一个有虚函数的类(或者有虚函数的类的派生类)都有一个虚函数表虚函数表占4个字节类对象存储空间的最前端存放的就是虚函数表的指针该类的任何对象中都放着虚函数表的指针,vptr指针虚函数表是编译器生成的,程序运行时被载入内存一个类的虚函数表中列出了该类的全部虚函数地址举例#include <iostream>using namespace std;class A {public:
2021-10-10 15:03:53
400
原创 [C++] 浅拷贝和深拷贝的区别
浅拷贝浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针资源就会出现错误浅拷贝拷贝的仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应的改变#include <string.h>#include <iostream>using namespace std;class Student { private: int num; char
2021-10-08 18:53:23
1722
原创 [计算机网络] 读《网络是怎样连接的》第一章——浏览器生成消息
第一章生成HTTP请求消息向DNS服务器查询Web服务器的IP地址子网掩码是一串与IP地址长度相同的32比特数字,其左边一般都是1,右边一半都是0。其中子网掩码位1的部分表示网络号,子网掩码为0的部分表示主机号。使用IP地址只需要处理4个字节的数字,而域名则需要处理几十个到255个字节的字符。这增加了路由器的负担,传送数据会花费更长的时间。路由器的速度是有极限的。因此,使用域名来确定通信对象并不是一个好的方法。通过IP地址来确定通信对象。然而从域名到IP地址存在障
2021-09-27 16:07:22
122
原创 [ROS] 什么是ROS、ROS的优缺点
什么是ROS?随着科技的发展,机器人产业分工开始走向细致化、多层次化,如今电机、激光雷达、摄像头、机械臂等元器件都有不同厂家专门生产。社会分工加速了机器人行业的发展。而把各个模块集成到一起就需要一个统一的平台,在机器人领域,这个平台就是ROS。ROS是一个适用于机器人编程的框架,这个框架把原本松散的零部件耦合在一起,并且提供了通信框架。ROS虽然叫做操作系统,但并非Windows、Mac、Linux那样通常意义下的操作系统,它只是连接了操作系统和你开发的ROS程序,所以也算一个中间件。基于ROS的应用程
2021-09-12 16:33:48
6447
原创 [C++] 类继承中构造函数和析构函数的调用顺序、为什么析构函数要写成虚函数
构造函数的调用顺序:自上而下当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层目标派生类的构造函数析构函数的调用顺序:自下而上当删除一个对象时,首先调用该派生类的析构函数,然后调用上一层基类的析构函数,依次类推,直到到达最顶层的基类析构函数代码演示#include <iostream>using namespace std;class Base { public: Base() { cout << "创建Ba
2021-09-12 16:03:39
2570
1
原创 [算法] 关于十大排序——你真的了解吗
排序算法作为一项需求,足够简单,是学习基础算法思想(分治算法、减治算法、递归)很好的学习材料。面试遇到写排序算法,先问清楚数据的特点,有些时候可能还会给具体的业务场景。时间复杂度时间复杂度统计的是算法的计算操作数量,而不是运行的绝对时间。两者呈正相关,并不相等。算法运行时间受编程语言、计算机处理速度、运行环境等多种因素的影响。体现的是计算操作随数据大小N变化时的变化情况。算法基础知识铺垫稳定排序:如果a原本在b的前面,且a == b,排序之后a仍然在b的前面,则为稳定排序。冒泡排
2021-09-08 16:38:23
121
原创 算法与数据结构刷题笔记
数组二分法注意循环不变量二分法是算法面试中的常考题,需要锻炼自己手撕二分算法的能力O(n) 二分法时间复杂度:O(logn)双指针法通过一个快指针和一个慢指针在一个for循环下完成两个for循环的工作csdnO(n^2) 双指针时间复杂度:O(n)C++中vector和array区别一定要清楚,vector底层实现是array,所以vector展现出友好的一些都是因为已经包装过了面试题也需要掌握手撕双指针法滑动窗口O(n^2) 滑动窗口时间复杂度:O(n)根据当前子序列和的
2021-09-08 10:09:37
259
原创 [C++] atoi()和stoi()函数
相同点都是C++的字符串处理函数,把数字字符串转换成int输出头文件都是#include不同点atoi()的参数是const char *,因此对于一个字符串str,我们必须调用c_str()方法,把string转换成const char *类型stoi()的参数是const string *,不需要转化为为const char *stoi()会做范围检查,默认范围在int的范围内,如果超出范围的话则会runtime error!atoi()不会做范围检查,如果超出范围的话,超出上界,则
2021-09-05 21:12:57
1524
原创 [C++] 一文搞懂优先队列priority_queue
C++优先队列priority_queue优先队列头文件优先队列是一种容器适配器类型,顾名思义,优先队列中的元素有着大小先后顺序优先队列成员函数empty //判断队列是否为空size //返回队列大小top //访问队列顶部元素push //插入元素emplace //构造并且插入元素pop //删除队列顶部元素swap //交换内容初始化一个优先队列priority_queue<Type, Container, Functional> que;
2021-09-04 09:47:19
292
1
原创 [数据库] MySQL基本操作(增、删、查、改)以及数据库的备份还原操作
SQL基本语法一、基础SQL语句不区分大小写,但是数据库表名、列名和值是否区分依赖于具体的DBMS以及配置SQL支持三种注释:# 注释SELECT *FROM mytable; -- 注释/*注释1 注释2*/数据库的创建与使用:CREATE DATABASE test;USE test;二、创建表CREATE TABLE mytable ( # int 类型,不为空,自增 id INT NOT NULL AUTO_INCREMENT, # int 类型,不可为空
2021-09-03 20:14:26
283
原创 [自动驾驶] 如何理解自动驾驶的L0-L5
6个级别的辅助驾驶L0:无自动化系统能力:无驾驶员参与:驾驶员负责转向、制动、加速和协商交通L1:驾驶员辅助系统能力:在某些情况下可以转向、车速,但是不能同时控制两者驾驶员参与:驾驶员执行驾驶的所有其他方面,并全权负责监控道路并在辅助系统未能适当采取行动时接管驾驶L2:部分自动化系统能力:汽车在某些情况下可以转向、加速和制动驾驶员参与:应对交通信号或改变车道等战术操作主要由司机负责,扫描危险也同样如此。司机可能不得不把一只手放在方向盘上,作为注意力集中的象征。
2021-09-01 23:30:59
435
原创 [计算机操作系统] 设备管理
磁盘结构盘面(Platter):一个磁盘有多个盘面磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位(512bites或者4k)磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写)制动手臂(Actuator arm):用于在磁道之间移动磁头主轴(Spindle):使整个盘面转动磁盘调度算法读写一个磁盘块的时间的影响因素有:
2021-09-01 10:33:47
170
原创 [C++] 从代码到可执行程序过程(预编译、编译、汇编、链接)
C++从代码到可执行程序编译系统一个hello.c程序#include <stdio.h>int main(){ printf("hello, world\n"); return 0;}在Linux系统上,由编译器把源文件转换为目标文件gcc -o hello.c hello预处理(预编译):处理以#开头的预处理命令编译:编译成汇编文件汇编:将汇编文件翻译成可重定位的目标文件链接:将可重定位目标和printf.o等编译好的目标库文件进行合并,得到最
2021-09-01 10:32:29
805
原创 [计算机操作系统] 内存管理
虚拟内存虚拟内存的目的是为了让物理内存扩充更大的逻辑内存,从而让程序获得更多的可用内存为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个快,每一块称为一页。这些页被映射到物理内存,但不需要被映射到连续的物理内存,也不需要所有的页都在物理内存中。当程序引用到不在物理内存中的页时由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败命令分页系统地址映射内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(page table)存储着
2021-09-01 09:43:46
167
原创 [ROS] 手把手教你如何从无到有构建一个ROS软件包
1、一个ROS软件包由什么组成一个符合catkin规范的package.xml文件这个package.xml文件提供有关该软件包的元信息,包括作者信息、版权、依赖一个catkin版本的CMakeLists.txt文件如果ROS软件包是一个catkin元包的话,则需要有一个CMakeLists.txt文件的相关模板,是ROS的编译系统catkin需要使用的文件,描述了package的各种编译规则,需要的源文件、库文件、搜索路径等每个包必须有自己独立的目录,保存各种文件,packa
2021-08-29 21:03:29
1259
原创 [C++] C++输入输出之cin、cin.get()、cin.getline()、getline()的用法
C++输入输出cin用法一:跳过不可见字符(空格、回车、Tab)#include <iostream>using namespace std;int main() { int a; int b; cin >> a >> b; cout << a + b << endl; return 0;}输入:1 回车 2 回车输出:3用法二:不跳过不可见字符(空格、回车、Tab),接受一个
2021-08-18 20:57:30
186
原创 [计算机操作系统] 进程、线程、线程池、协程的区别与联系
计算机操作系统之进程、线程、线程池、协程1、进程、线程、协程用一个表格来总结进程线程协程定义进程就是进程实体,进程是资源分配和调度的基本单位。进程是程序的一次执行过程。进程是一个程序及其数据在处理机上顺序执行时所发生的活动。线程是程序执行的基本单位。线程是轻量级的进程。每个进程都有唯一的主线程,主线程和线程是相互依存的关系,主线程结束进程也会结束协程是线程内部调度的基本单位切换者操作系统操作系统用户切换过程用户态->内核态->用户态用户态
2021-08-18 13:34:14
993
原创 [C++] C++之static
局部对象形参和函数体内部定义的变量统称为局部变量局部静态对象令局部变量的生命周期贯穿函数调用以及之后的时间。可以将局部变量定义成static类型局部静态对象在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被销毁。代码举例:size_t count_calls() { static size_t ctr = 0;//调用结束后这个值仍然有效 return ++ctr;}如果局部静态变量没有显式的初始化,它将执行值初始化,内置类型的局部静态变量初始化为0
2021-08-10 22:18:59
117
原创 [C++] C++11新特性之final和override关键字
final和override说明符出现在形参列表(包括任何const或者引用修饰符)以及尾置返回类型之后override派生类如果定义了一个函数与基类中的虚函数名字相同但是形参列表不同,这仍然是合法的行为编译器将会认为新定义的这个函数与基类中原有的函数相互独立派生类中的函数并没有覆盖掉基类中的函数版本这实际上是一个错误,但是编译器并没有发现这个错误C++11中可以使用override关键字来说明派生类中的虚函数如果派生类中使用了override标记了某个函数,但该函数并没有覆盖基类中已存在的虚
2021-08-10 19:38:26
272
转载 [C++] C++11新特性之explicit关键字
参考C++ explicit关键字详解C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。C++中,只有一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。一是构造二是默认且隐含的类型转换操作符所以,在我们写下如 a = b,这样的代码,且恰好b的类型正好是a单参数构造器的参数类型,这时候编译器就自动调用这个构造器,创建一个a的对象。C++中的exp
2021-08-10 13:33:54
138
原创 [C++] C++之resize和reserve
改变容器大小,resize增大或者缩小容器array不支持resize如果当前容器大小大于所要求的大小,容器后部的元素会被删除如果当前容器大小小于所要求的大小,会将新元素添加到容器后部vector<int> vec(10, 1);//容器中含有10个1,size为10vec.resize(15);//将5个值为0的元素添加到vec的末尾,size变为15vec.resize(20, 10);//将5个值为10的元素添加到vec的末尾,size变为20vec.resize(5)
2021-08-09 15:28:13
917
原创 [C++] C++11新特性之emplace、emplace_back、emplace_front操作
emplace操作C++11新标准引入了三个新成员:emplace、emplace_back、emplace_front,分别对应insert、push_back、push_frontemplace操作构造而不拷贝元素调用push或者insert时,将元素类型的对象传递出去,这些对象被拷贝到容器当中,或者创建一个局部临时对象,并将其压入容器调用emplace时,则是将参数传递给元素类型的构造函数,emplace成员使用这些参数在容器管理的内存空间中直接构造元素,没有拷贝的操作代码举例:#in
2021-08-09 14:30:46
4956
原创 [C++] C++之sizeof和strlen
参考C++ Primersizeof运算符sizeof运算符返回一条表达式或者一个类型名字所占的字节数,返回值是size_t类型的常量表达式。size_t是一种机器相关的无符号类型,它被设计的足够大以便能表示内存中任意对象的大小。sizeof (类型)sizeof 表达式//返回表达式结果类型的大小,sizeof并不实际计算其运算对象的值//定义一个student类型struct student { std::string name; int number = 0;}
2021-08-09 10:29:24
480
原创 [C++] C++中的begin和end
容器:begin和end函数begin和end是vector的两个成员函数begin和endbegin:返回指向容器第一个元素的迭代器end:返回指向容器最后一个元素下一个位置的迭代器begin和end返回的具体类型由对象是否是常量决定:如果对象是常量,begin和end返回const_iterator如果对象不是常量,返回iteratorvector<int> v1;const vector<int> v2;auto itr1 = v1.be
2021-08-08 17:35:44
14103
转载 [C++] C++之const、constexpr变量、constexpr函数总结
const是一种类型修饰符定义一个变量,它的值不能被改变。比如用一个变量来表示缓冲区的大小。const int size = 128;//const的int类型size = 1;//const对象一旦被创建以后,其值就不能再改变 const int i = get_size();//正确,运行时初始化const int j = 11;//正确,编译时初始化const int k;//错误,k是一个未经初始化的常量const对象必须初始化初始化默认状态下,const对象仅在文件
2021-08-08 16:11:16
549
原创 [C++] C++11新特性之左值右值、引用、左值引用右值引用、move、forward
参考C++ PrimerC++ 11 左值,右值,左值引用,右值引用,std::move, std::foward左值右值C++的表达式要么是左值,要么是右值。简单说,左值可以位于赋值语句的左边,右值则不能。右值:当一个对象被用作右值的时候,用的是对象的值(内容),右值要么是字面常量,要么在表达式求值过程中创建的临时对象,没有名字,不能被赋值。左值:当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置),左值就是有名字的对象,可以被赋值,左值可以被取地址,左值持久需要右值的地方
2021-08-06 13:59:58
230
转载 [C++] C++11新特性之lambda表达式(匿名函数)、bind函数(函数适配器)、function模板类型(可调用对象包装器)
什么是lambda表达式?一个lambda表达式可以理解为是一个一个未命名的内联函数,也就是可调用的代码单元,即可调用对象。lambda表达式定义立即执行,无需跳出当前函数,可以简化代码,可以把多行代码简化成一行。可调用对象有四种:函数函数指针重载了函数调用运算符的类lambda表达式bind创建的对象与任何函数类似,一个lambda表达式具有:一个返回类型、一个参数列表、一个函数体。与函数不同的是,lambda表达式可定义在函数的内部。lambda表达式的形式[捕获列表
2021-08-06 10:22:55
425
原创 [C++] 由浅入深学习C++11多线程并发(互斥量、生产者消费者问题、线程池)
参考C++多线程并发基础入门教程我主要是对线程池部分做了拓展什么是C++多线程并发?线程:操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务。它的本质相当于多个人去合伙完成一件事情。多线程并发:把一个任务拆分成多个子任务,然后交由不同线程处理不同子任务,使得多个子任务同时执行。C++多线程并发:将任务的不同功能交由多个函数分别实现,创建多个线程,每个线程执行一个函数,一个任务就这样同时由不同
2021-08-05 17:33:23
442
原创 [C++] C++11新特性之智能指针shared_ptr和unique_ptr的使用详解
参考C++ Primer 第5版C++11 Smart Pointers直接管理动态内存在C++中,动态内存的管理是通过一对运算符来完成的:new:在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化int *pi = new int;//pi指向一个动态分配的、未初始化的无名对象string *ps = new string;//初始化为空stringint *pi = new int(1024);//pi指向的对象的值为1024string *ps =
2021-08-05 11:29:03
1252
原创 [Linux] Linux下文件和目录权限查看和修改(Ubuntu)
Linux下文件和目录权限查看和修改查看文件和目录权限# 查看path目录下名为filename的文件或文件夹权限ls -l path/filename # 查看path路径下的所有文件权限ls -ls path # 查看当前文件夹权限ls -ld 文件夹名称(所在目录) 1,代表文件类型,一般有三类,- 代表普通的二进制文件,l 代表符号链接文件(软链接),d 代表目录文件2-4,代表文件所有者的权限表示情况,分别对应可读® 可写(w) 可执行(x),- 代表没..
2021-07-27 20:16:56
1164
原创 [计算机视觉] 什么是齐次坐标?为什么要引入齐次坐标?
0、参考链接Homogeneous Coordinates为什么要引入齐次坐标1、问题:两条平行线可以相交于一点在欧式空间中,同一平面的两条直线不能相交;在透视空间中,两条平行线可以相交,火车轨道随着我们的视线越来越窄,最后两条平行线在无穷远处交于一点;欧式空间描述2D/3D几何非常合适,但这种方法不适合处理透视空间的问题。2、解决方法:利用齐次坐标解决这一问题齐次坐标就是用N+1维来代表N维坐标;我们可以在一个2D笛卡尔坐标(X, Y)末尾加上一个额外的变量
2021-07-27 14:50:48
3174
3
原创 [计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)
0、国外原文链接Homography examples using OpenCV ( Python / C ++ )1、什么是单应性?考虑图中显示的平面。红点代表两个图像中的相同物理点。在计算机视觉术语中,我们将这些对应点。图中显示了四种不同颜色的四个对应点:红色、绿色、黄色和橙色。单应性(3 * 3的矩阵)是指从图像中的一个点映射到另一张图像中的对应点的变换。3 * 3的单应矩阵可以写成如下形式:H=[h00h01h02h10h11h12h20h21h22]H=\left[\begin{ar
2021-07-27 10:52:45
7473
原创 [计算机视觉] AprilTag 2: Efficient and robust fiducial detection(2016)论文理解
摘要跟AprilTag 1相比,Apriltag 2对TagDetector部分进行了优化,提高了鲁棒性和效率。更高的检测率,较少的误报和较低的计算时间,从而提高了性能。介绍AprilTag 1基于ARTag和ARToolkit,一个黑白方形标签,带一个编码的二进制载荷,与ARTag相比具有更低的假阳性率,AprilTag 2在不牺牲定位精度的前提下降低误检率。本文的贡献:提高了小标签的检出率,显示更少的误报,并减少了计算时间。提出了一种新的标签边界分割方法,该方法对性能有很大的提高,
2021-07-22 15:01:40
1845
原创 [计算机视觉] AprilTag: A robust and flexible visual fiducial system(2011)论文理解
Apriltag是改进的ARToolkit、 ARTagARToolkit的劣势每个模板都是独立的,所以校正操作非常慢。每一个合适正交直线的图像创建模板是非常困难的。tag获取的时候通过用户设定的阈值得到一个简单的二值化图像。易受光照影响,而且识别不了有适当遮挡的标签边缘。ARTag对ARToolkit的改进使用图像梯度来获取tag,这样对光照的鲁棒性更强。ARTag算法不开源AprilTag主要组件Tagdetector估计图像中可能的标签位置(内黑外白..
2021-07-22 10:04:56
1674
1
原创 [计算机视觉] 手把手教你如何生成高清的AprilTag
官方提供的AprilTag 3系列的所有标签的图像:https://github.com/AprilRobotics/apriltag-imgs但是当我克隆下来以后,发现里面的AprilTag标签图片分辨率低的可怕,完全不能用。what,这不是官方提供的吗?所以我就开始找其他的方法去生成AprilTag标签图片。之前写过一个通过openmv生成AprilTag标签图片的博客。这个方法也很好用,能够生成高清的AprilTag标签图片。唯一美中不足的缺点就是,生成的标签的种类太少了,现在要使用tagStan
2021-07-13 17:40:47
1549
2
原创 GoogleTest从入门到入门,小白都能看懂的gtest详细教程
单元测试项目管理和技术管理中做单元测试,衡量一个软件是否正常的标准,良好的单元测试以及足够多的覆盖率,至少保证关键功能,关键业务的覆盖率接近100%。gtest是谷歌公司发布的一个跨平台(Linux、Mac OS、Windows等)的C++单元测试框架,它提供了丰富的断言、致命和非致命判断、参数化、死亡测试等等。两种断言:ASSERT_*:当断言失败时,产生致命错误、并终止当前函数。EXPECT_*:当断言失败时,产生非致命错误,并且不会终止当前函数。通常都会用EXPECT_*,因为能在一
2021-06-30 21:12:53
23362
5
几个常用的zeal离线API
2020-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人