自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 收藏
  • 关注

原创 C++——函数指针

在C++中,函数指针是指向函数的指针变量。它允许将函数作为参数传递给其他函数、动态选择调用的函数以及在运行时改变函数的行为。函数,然后通过函数指针调用函数1。接着,我们改变函数指针的指向,使其指向。使用括号将函数指针变量括起来,再加上参数列表来调用函数。将函数名赋值给函数指针变量,可以使用取址运算符。在上面的示例中,我们声明了一个函数指针类型。函数,并通过函数指针调用函数2。,它们与函数指针类型匹配。函数中,我们先将函数指针。是函数指针变量的名称,

2023-06-25 16:00:37 347

原创 OpenCV——点云投影到图像中

读取一张照片和一张 pcd, 根据标定的内参和外参,将点云投影到图像中,用于判断雷达相机外参标定是否准确。:投影部分区域的点云到图像中,不要全部都投。(一般选取标定板所处位置的点云)

2023-06-23 10:36:18 2237 2

原创 力扣——同构字符串

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。输入:s = "paper", t = "title"给定两个字符串 s 和 t ,判断它们是否是同构的。输入:s = "egg", t = "add"输入:s = "foo", t = "bar"

2023-06-14 11:45:36 333

原创 C++——哈希表

首先将 nums1 的所有元素存入哈希表中,然后遍历 nums2,把在哈希表中出现的元素加入到交集中,同时在哈希表中将该元素删除,避免元素重复计算。unordered_map 是基于哈希表的关联容器,提供了高效的插入、查找和删除操作。哈希表(Hash table),也被称为散列表,是一种常用的数据结构,用于实现键-值对的存储和检索。假设有两个数组 nums1 和 nums2,求出它们的交集并返回,其中返回的交集元素要去重。下面是哈希表在 C++ 中的一个经典例子:求解两个数组的交集。

2023-05-25 22:06:12 775

原创 C++——图

图是由节点(顶点)和连接节点的边组成的一种非线性数据结构。它用于表示不同对象之间的关系或网络结构。图可以用于建模和解决许多现实世界中的问题,例如社交网络分析、路线规划、图像处理等。在图中,节点表示实体或对象,而边表示节点之间的关系。边可以是有向的(具有方向)或无向的(没有方向),并可以具有权重或标签来表示边的属性或距离。

2023-05-22 21:59:21 661

原创 C++——广度优先搜索

由于广度优先搜索是逐层遍历,从根节点开始,先输出根节点的值,然后按照从左到右的顺序依次输出每一层的节点值。广度优先搜索(Breadth-First Search,BFS)是一种图遍历算法,它从起始节点开始逐层扩展搜索,直到找到目标节点或遍历完整个图。首先构建了一个示例的二叉树,然后调用BFS函数执行广度优先搜索,并输出遍历的结果。请注意,广度优先搜索需要注意避免重复访问节点,通常使用一个额外的数组或集合来记录已访问的节点。4、遍历当前节点的所有邻居节点,若邻居节点未被访问过,则标记为已访问并将其加入队列。

2023-05-21 16:22:56 1991

原创 C++——深度优先搜索

它从起始节点开始,沿着一条路径尽可能深地探索,直到无法继续或达到目标节点,然后回溯到前一节点,继续探索其他路径,直到遍历完所有节点或找到目标。在深度优先搜索中,每个节点都会被访问且仅被访问一次。如果某个节点的邻居节点已经被访问过,那么该节点将被跳过。在树的问题中,深度优先搜索可以用于查找树的特定节点或进行树的遍历。需要注意的是,深度优先搜索可能会陷入无限循环,因此在应用时需要合理设置终止条件和避免重复访问节点。3、若存在未访问的邻居节点,则选择一个作为当前节点,标记为已访问,并重复步骤2。

2023-05-21 15:47:53 3391

原创 C++——递归

递归关系则描述了如何将原问题划分为更小的子问题,并将它们结合起来得到原问题的解。否则,根据递归关系,将问题划分为计算第 n-1 项和第 n-2 项的子问题,并将它们的结果相加。在递归调用过程中,每一次递归都会使问题规模减小,直到达到递归基的情况。递归函数的执行过程可以形象地表示为一个递归树,每个节点代表一次函数调用,树的叶节点对应于递归基。递归的时间复杂度通常与递归的深度成正比,而空间复杂度则取决于递归树的高度和每次递归调用所需的额外空间。需要注意的是,递归函数必须满足结束条件,以避免无限递归。

2023-05-19 21:23:28 266 1

原创 力扣——三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。注意:当第一个数和第二数枚举遇到相同的数(前后数相同)时,需要跳过相同的数。思路:当固定一个值时,三数之和问题变为两数之和等于第一数的值的双指针求法。你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。

2023-05-18 20:46:50 81

原创 C++——双指针

2、左右指针:在有序数组或字符串中,将一个指针指向开头,另一个指针指向末尾,通过根据问题的要求移动指针来搜索目标值、判断是否满足某个条件等。3、对撞指针:在有序数组或字符串中,将两个指针分别指向开头和末尾,并同时向中间移动,常用于寻找两个数之和、判断是否回文串等问题。1、快慢指针:使用两个指针以不同的速度遍历数组或链表,常用于解决问题如判断链表是否有环、寻找链表的中间节点等。4、快慢指针替换:在某些情况下,可以使用快慢指针来替换传统的单指针遍历,以提高算法的效率。

2023-05-18 19:16:28 648

原创 C++——动态规划

它通过将问题分解为更小的子问题,并利用子问题的解来构建原问题的解。在上述示例中,我们通过创建一个二维数组dp来保存子问题的解,其中dp[i][j]表示前i个物品放入容量为j的背包中所能达到的最大价值。动态规划的核心思想是存储并重复使用子问题的解,以避免重复计算。3、确定状态转移方程:找到子问题之间的关系,以及如何利用子问题的解来构建原问题的解。2、确定状态:找到描述子问题的状态变量,以便构建动态规划表。5、求解原问题:根据填充好的表格,求解原问题的解。1、定义子问题:将原问题拆解为较小的子问题。

2023-05-18 10:05:30 781

原创 C++——容器(map)

在C++中,map、multimap和unordered_map是三种不同的容器,用于存储键值对。它们各自有不同的特点和适用场景。

2023-05-17 17:21:13 439

原创 C++——滑动窗口

滑动窗口算法可以通过维护两个指针,一个指向窗口的起始位置,一个指向窗口的结束位置,并根据目标字符串的出现情况来移动窗口,从而找到最小的覆盖子串。滑动窗口算法可以通过保持一个窗口的和,将窗口向右移动一位,并根据需要调整窗口的大小来解决这个问题。滑动窗口算法的关键是确定窗口的大小和如何移动窗口。滑动窗口算法的基本思想是通过调整窗口的起始位置和结束位置,以有效地处理数据。3、根据问题的要求,调整窗口的起始位置和结束位置,使窗口滑动到下一个位置。1、初始化窗口的起始位置和结束位置,通常为数组或字符串的开头。

2023-05-16 21:44:50 2355

原创 C++——容器(set)

插入元素:使用 insert() 函数将元素插入集合中,对于std::unordered_set集合,如果元素已经存在,则插入操作被忽略。对于std::set和std::multiset集合插入新元素时,容器会根据元素的键值将其放置在适当的位置,以保持元素的有序性。查找元素:使用 find() 函数来查找元素,它返回一个指向要查找的元素的迭代器,如果元素不存在,则返回 end()。内部元素按照键的排序顺序进行存储,重复元素的插入会导致多个相同键的元素存在。每个元素在容器中是唯一的,即不允许重复元素。

2023-05-16 21:18:37 1382

原创 C++——二分法

如果中间元素等于目标元素,那么查找成功,返回中间位置。如果中间元素大于目标元素,说明目标元素可能在左半部分,更新结束位置为中间位置减1。如果中间元素小于目标元素,说明目标元素可能在右半部分,更新起始位置为中间位置加1。它的基本思想是将查找范围逐渐缩小一半,直到找到目标元素或确定目标元素不存在。如果目标元素不存在于列表中,那么在某个时刻,起始位置将大于结束位置,此时可以确定目标元素不存在。的函数,它接受一个有序整数数组和一个目标元素作为输入,并返回目标元素在数组中的索引。如果目标元素不存在,函数返回-1。

2023-05-16 20:01:09 1567

原创 C++——贪心算法

在上述示例中,我们定义了一个greedyCoinChange函数,它接收一个硬币面额的向量coins和需要找零的金额amount。在main函数中,我们定义了一组硬币面额和需要找零的金额,并调用greedyCoinChange函数来获取找零的结果。问题描述如下:给定一些不同面额的硬币和一个需要找零的金额,找出最少的硬币数量来凑出该金额。贪心算法的基本思想是,每一步选择当前情况下看起来最好的解决方案,而不考虑之后可能发生的情况。1、确定问题的最优子结构:问题的最优解可以通过子问题的最优解来构建。

2023-05-15 20:36:52 1385

原创 OpenCV——日常学习

注意,上述代码中的“input_image.png”和“output_image.png”是您要处理的输入和输出图像的文件名。此外,您可能需要调整HoughLinesP函数的参数以获得最佳结果。首先,使用OpenCV中的线段检测函数(例如HoughLinesP)找到您要处理的图像中的两条直线。这将为您提供直线的坐标。然后,使用OpenCV中的fillPoly函数在两条直线之间创建一个多边形。此多边形将包含两条直线之间的所有像素。最后,将该多边形中所有像素的灰度值设置为255。

2023-05-05 16:54:13 83

原创 C++——auto

auto是C++11引入的一个关键字,它可以自动推断变量的类型。需要注意的是,自动类型推断并不是万能的,有时候推断出的类型可能与我们期望的不同,此时需要手动指定变量类型。此外,对于函数参数的类型,auto并不能代替,函数定义时必须显式地指定参数类型。上面的代码中,我们使用auto关键字推断函数calculate的返回值类型为int。上面的代码中,我们使用auto关键字定义了迭代器it,编译器会自动推断出它的类型。2. 推断STL容器中的迭代器类型。3. 函数返回值类型推断。1. 推断基本类型变量。

2023-05-04 09:59:09 167

原创 C++——迭代器

C++中的迭代器是一种对象,可以用于遍历容器类型(如vector、list等)中的元素。C++中有多种类型的迭代器,包括正向迭代器、反向迭代器、常量迭代器等。其中,container表示容器类型(如vector、list等),iterator表示迭代器类型,it表示定义的迭代器对象名称。- 常量反向迭代器(const_reverse_iterator):可以访问被定义为const的容器中的元素,但不能修改它们。C++中有多种迭代器类型,如正向迭代器、反向迭代器、常量迭代器等。

2023-05-04 09:54:37 1188

原创 C++——堆区、栈区

栈区是一段线性的内存区域,它用于存储程序中函数调用时创建的局部变量、函数参数、返回值和其他函数调用相关的信息。栈区的特点是大小固定,程序在执行时自动分配和释放,因此内存管理是由编译器自动完成的。堆区的特点是大小不确定,程序必须显示地分配内存,并在使用后显示地释放内存。堆区的使用依赖于动态内存分配,例如`new`和`delete`操作符。在这个示例中,我们使用了栈区和堆区来创建一个包含5个整数的数组。总之,栈区和堆区都是C++中常见的内存管理技巧。了解它们之间的区别和用法是编写高效和健壮程序的基础。

2023-05-03 20:15:51 197

原创 OpenCV——概率霍夫检测

Vec4i` 是一个长度为 4 的定长向量,分别表示直线的起点和终点坐标。- 然后调用`cv::HoughLinesP` 函数进行概率霍夫检测,检测到的直线存储在`std::vector<Vec4i>` 中。-`10`:表示最大线段间隙,同一条线段中断的间隙超过该值则会被分为两条线段。-`CV_PI / 180`:表示角度的检测步长,单位为弧度;-`50`:表示最小线段长度,小于该值的线条会被丢弃;-`1`:表示直线的检测步长,单位为像素;-`lines`:输出的直线集合;

2023-04-30 11:22:13 644

原创 OpenCV——裁剪

然后,我们获取图像的大小,并计算出图像下半部分的位置和大小。接下来,我们使用 Rect 类来定义裁剪区域,然后使用裁剪区域对图像进行裁剪。要选取一张图像的下半部分,您可以使用 OpenCV 中的裁剪(ROI)功能。在这个示例中,我们要选择原图的下半部分,因此裁剪区域的左上角坐标为 (0, height/2),表示从图像的左上角开始裁剪,水平方向不移动,垂直方向移动了。,表示裁剪区域的宽度和原图相同,高度为原图的一半,也就是选择了原图的下半部分。就定义了一个裁剪区域,它表示选择原图的下半部分。

2023-04-27 10:23:21 623

原创 C++——转义字符

在上面的示例程序中,我们使用了转义字符来输出一些特殊字符,例如制表符、换行符、双引号、单引号和反斜杠。注意,在输出反斜杠字符时,我们需要使用两个反斜杠,因为反斜杠本身也是一个转义字符。在C++中,转义字符用于表示一些特殊字符,例如换行符、制表符、双引号、反斜杠等等。

2023-04-26 17:01:30 2228

原创 C++——文件操作

可以使用 `std::filesystem` 中的函数来获取文件的属性,并用 `std::filesystem::permissions()` 函数来修改文件权限。可以使用 `std::fstream` 中的 `open()` 函数来创建新的文件,如果文件已经存在,则该函数会将其打开。可以使用 `std::filesystem` 中的 `copy()` 函数来复制文件。可以使用 `std::remove()` 函数来删除文件。

2023-04-21 10:56:23 348

原创 C++——文件访问

上述代码中,`std::filesystem::directory_iterator` 用来遍历指定路径下的所有文件和子目录,`entry.is_directory()` 判断当前遍历到的路径是否为目录,如果是,则递归调用 `ListFiles` 函数继续遍历子目录,否则使用 `entry.path().filename()` 输出文件名。

2023-04-21 10:38:39 350

原创 C++——类和结构体

在上面的示例中,类“Person”包含两个私有数据成员“name”和“age”,以及一个公共成员函数“print”。该类还有一个构造函数,用于初始化数据成员。在主函数中,我们创建了一个“Person”类的对象“p”,并调用其“print”函数。相反,结构体“PersonStruct”仅包含两个公共数据成员“name”和“age”,没有成员函数。我们创建了一个结构体变量“ps”,并在主函数中打印其数据成员。在C++中,类是一种自定义数据类型,它可以包含数据成员和成员函数,这些成员函数可以操作该类的数据成员。

2023-04-17 20:26:50 123

原创 ROS——TF

在这个例子中,我们创建了一个tf::TransformListener对象来监听"/base_link"坐标系相对于"/map"坐标系的变换,并输出当前的机器人姿态信息。通过调用lookupTransform()函数,我们可以获取当前时刻"/base_link"相对于"/map"的坐标变换信息,并将其存储在tf::StampedTransform对象中。也就是说,我们想要获取"/base_link"坐标系相对于"/map"坐标系的最新变换,以确保位置和姿态信息的准确性。

2023-04-17 20:21:01 209

原创 OpenCV——常用函数

因此,这行代码的作用就是将具有不同透明度的两个图像混合到一起,即在`visImg`图像上叠加一张透明度为`opacity`的`overlay`图像。- `0`:新图像的值被计算为两幅图像相加之和,再加上这个参数,即新图像的值为`alpha*overlay + beta*visImg + gamma`,其中gamma为用户自定义的值(这里为0);- `1-opacity`:`visImg`图像在混合中的不透明度,即与`overlay`图像的透明度相反;- `visImg`:混合后得到的新图像。

2023-04-17 10:39:51 1865

原创 ROS——个人雷达、相机融合框架

激光雷达和相机融合框架的实现需要涉及到多种技术和算法,包括点云处理、图像处理、传感器数据融合等。

2023-04-17 09:00:39 551

原创 相机坐标系、像素坐标系转换

在计算机视觉和图形学中,相机内参矩阵通常用于将图像坐标系中的像素坐标转换为相机坐标系中的三维坐标,或者将相机坐标系中的三维坐标投影到图像坐标系中的像素坐标。在计算机视觉和图形学中,像素坐标系和相机坐标系之间的转换是非常重要的,因为它允许我们将从相机中捕获的图像中的像素位置转换为三维场景中的物体位置。下面是一个简单的 C++ 代码示例,演示如何将像素坐标系中的坐标转换为相机坐标系中的坐标。方向上的焦距,表示相机坐标系中的一个单位长度在图像坐标系中对应的像素数。假设我们有一个相机,它在世界坐标系中的位置为。

2023-04-16 16:42:07 4840 1

原创 C++——模板

C++ 模板是一种用于创建通用代码的机制,可以在编译时将特定的数据类型参数传递给代码,从而生成具体的代码。使用模板,可以编写通用的算法和数据结构,以便在多个项目和数据类型上重用它们。类模板是用于创建通用类的机制。类模板定义中的一个或多个类型参数允许在编译时指定具体的数据类型。函数模板允许在函数定义中使用一个或多个类型参数,从而创建通用函数。C++ 模板有两种类型:函数模板和类模板。表示一个类型参数,它在函数体中用作类型。表示一个类型参数,它在类定义中用作类型。

2023-04-16 16:25:33 42

原创 C++——预处理器

在 C++ 中,头文件(header file)用于包含函数和变量的声明以及其他重要信息,这些信息可以在源文件(source file)中使用。当多个源文件需要使用相同的函数或变量时,我们通常将这些函数或变量的声明放在一个头文件中,然后在每个源文件中包含该头文件。在头文件中,我们通常使用 #define 来定义一个宏,该宏包含头文件的名称。这样,编译器会先读取头文件 "example.h",并将其包含在主函数源代码中,然后将源代码和头文件一起编译成可执行程序。#endif 指令之前添加头文件的声明和定义。

2023-04-16 11:45:03 192

原创 ROS——CMakeLists.txt

这个文件为CMake(ROS中使用的一个构建工具)提供了构建您的包的指令。这只是ROS包的CMakeLists.txt文件的一个基本示例,可以修改它以适应您的包的特定需求。cmake_minimum_required:设置构建包所需的cmake的最低版本。add_executable:指定将要构建的可执行文件的名称,以及它所依赖的源文件。catkin_package:这用于指定包的依赖关系,由依赖于这个包的其他包使用。project:这设置了项目的名称,并在许多地方使用,例如命名输出二进制文件。

2023-04-16 09:42:44 146

原创 C++——运算符重载

在 main() 函数中,创建了两个 Complex 类型的对象 a 和 b,然后通过 a+b 的方式调用了重载的加号运算符,得到了一个新的 Complex 对象 c,然后输出了 c 的实部和虚部。需要注意的是,不能重载的运算符包括 .(成员访问运算符)、.*(成员指针访问运算符)、::(域运算符)、?在 C++ 中,可以使用运算符重载(Operator Overloading)来为自定义数据类型定义运算符的行为。其中,返回类型指定运算符的返回类型,运算符是要重载的运算符,参数列表指定运算符的参数。

2023-04-16 09:12:47 79

原创 C++——EKF

在该实现中,EKF类将初始状态向量、状态协方差矩阵、系统模型矩阵、测量模型矩阵、过程噪声协方差矩阵和测量噪声协方差矩阵作为输入。predict()函数使用系统模型矩阵和过程噪声协方差矩阵更新状态和协方差预测。update()函数使用测量模型矩阵、测量噪声协方差矩阵和卡尔曼增益来更新状态和协方差。getState()和get协方差()函数分别返回当前状态向量和协方差矩阵。在C++中,有几个实现EKF算法的库和框架,比如机器人库(RoboLib)、Bayes++和机器人操作系统(ROS)。

2023-04-15 19:13:23 534

原创 ROS——基本框架

ROS(Robot Operating System)是一款针对机器人应用开发的开源软件平台,它提供了一系列的工具和库,支持机器人的各种功能实现,如控制、感知、导航等。ROS主要使用C++和Python语言进行开发。

2023-04-15 18:59:48 788

原创 ROS 一个功能包 多个节点

在ROS中,一个功能包可以包含多个节点。要在C++中编写ROS节点,您需要使用ROS提供的C++库来访问ROS的功能。在您的功能包的src目录下,您可以创建两个源文件:Node1.cpp和Node2.cpp。这些源文件可以使用ROS C++库来访问ROS系统。假设您的ROS功能包名为"MyPackage",包含两个节点:Node1和Node2。这样,您就可以在ROS中创建一个包含多个节点的功能包了。

2023-04-15 18:51:34 1147

原创 ROS——Launch文件

Launch文件是ROS(Robot Operating System)中的一个重要组件,用于启动和配置ROS节点和进程。Launch文件通常使用XML格式编写,其中包含ROS节点的名称,参数,运行条件,依赖项等信息。上面的示例包含两个节点和一个引用另一个Launch文件的语句,同时还设置了一个ROS参数。使用Launch文件可以方便地启动多个节点和设置多个参数,从而快速创建ROS系统的配置。同时启动两个节点 一个rviv的节点 一个my_node的节点。属性表示节点所在的ROS软件包,

2023-04-15 18:41:21 735

原创 OpenCV——求直线交点

您可以使用OpenCV中的cv::Point和cv::Vec4i数据类型来表示点和直线,然后使用cv::intersect函数来计算两条直线的交点。请注意,如果两条直线不相交,或者它们重叠,则cv::intersect函数将返回false,并且intersection变量将保持原始值。在这个例子中,intersection变量存储了两条直线的交点坐标。您需要将x1、y1、x2、y2、x3和y3等替换为实际的坐标值。

2023-04-15 16:53:44 1048 1

原创 OpenCV——道路边缘检测

在这个示例中,我们首先使用霍夫变换检测直线。然后,对于每个检测到的直线,我们计算其倾斜度并检查它是否位于图像的左侧或右侧。最后,我们将选择的道路边缘线画在图像上。请注意,这只是一个基本的流程,您可能需要根据您的应用程序进行修改和优化。2. 道路边缘线应该有一定的倾斜度,以表明它们是车道线而不是其他线(例如建筑物)。1. 道路边缘线通常位于图像的左侧或右侧。3. 道路边缘线应该与其他车道线相对应。4. 道路边缘线应该与道路中心线相对应。

2023-04-15 16:52:22 624

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除