自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(292)
  • 问答 (1)
  • 收藏
  • 关注

原创 标定系数为什么会存储在相机模组里面,在标定的时候,算法是在割草机的X3板上运行的啊?

算法虽然在X3板上运行,但计算出的结果(相机的固定参数)被“下沉”存储到了相机模组本身。这是一种着眼于系统维护、可靠性和模块化设计的工程策略,它让相机成为一个智能的、自带“身份证”的模块,而不是一个“傻”的传感器。

2025-10-22 22:51:29 503

原创 相机模组,模组是什么意思?

模组是一个为了专业化分工、便于集成和标准化而设计的功能性硬件单元。它让复杂的系统设计变得像“搭积木”一样简单、高效和可靠。相机模组就是其中一个非常典型的代表。

2025-10-22 22:50:05 971

原创 标定参数从相机模组读出来

由于相机硬件模组的存储空间有限,无法保存每次标定时得到的、从相机到标定板的临时外参矩阵。因此,系统采用了一种折中方案:只永久性地存储一个从相机坐标系到一个固定的“Front”参考坐标系的外参。这个固定的外参是在初始设置(例如通过扫描一个固定位置的二维码)时确定的。在后续应用中,所有其他与外参相关的计算,都可以以这个固定的“Front”坐标系为桥梁来间接完成。节省内存:只需要存储一个固定的矩阵。统一基准。

2025-10-22 22:48:31 618

原创 标志位写成int 类型的 0,1 好些,还是bool类型的true false好些?

bool。

2025-10-22 11:27:02 927

原创 代码里使用很多的if else和代码里面使用标志位,来判定是否进入下一个逻辑。这俩种方式的比较?

这两种代码组织方式各有优缺点,下面是详细的比较:if(!use_percept){ // 逻辑1} else { if(条件1 || 条件2 || ...) { // 逻辑2 } else { if(image.empty()) { // 逻辑3 } else { Rect roiRect(topLeft, bottomRight); Mat roi = ima

2025-10-22 11:15:04 924

原创 初始化和不初始化对内存有什么影响?什么情况下使用什么比较好?

场景推荐方案原因固定4个角点安全、高效、直接访问角点数量可变reserve()灵活性好,避免浪费性能敏感预分配固定大小避免运行时内存分配在您的场景中(明确需要4个角点),推荐使用初始化方式,因为:代码更安全(避免越界)性能更好(无运行时扩容)意图更清晰(明确需要4个点)

2025-10-22 10:08:12 517

原创 if (image.channels() == 1){ cv::cvtColor(image, image, cv::COLOR_GRAY2BGR);}做了什么操作,内存有什么变化?

功能:将单通道灰度图转换为3通道BGR图(每个通道值相同)内存内存占用增加200%(从1通道变为3通道)特点:原地操作,会重新分配内存并释放原内存用途:为后续的彩色绘图或处理做准备。

2025-10-22 09:47:20 614

原创 image.copyTo(image_show);和image_show=image.clone()的区别,内存的变化

内存变化总结copyTo:智能内存管理,尽可能复用目标内存clone:总是创建新内存,更安全但性能较低推荐:在性能敏感的场景使用copyTo,在需要明确表达创建独立副本时使用clone。copyTo 的内存操作:text1. 检查 image_show 是否可复用(尺寸、类型匹配)2. 如果可复用:直接内存拷贝 → 高效3. 如果不可复用:分配新内存 → 拷贝数据 中的内存拷贝是什么意思?"内存拷贝" 指的是将数据从一块内存区域复制到另一块内存区域的操作。"内存拷贝" 在copyTo。

2025-10-22 09:15:47 523

原创 cv::Matx33d intrinsic_matrix Matx33d 中的x是什么意思?

在 OpenCV 中,Matx33d中的 x表示这是一个。Matx。

2025-10-22 09:13:14 387

原创 cv::cvtColor(roi, gray, cv::COLOR_BGR2GRAY); cvtColor作的操作是什么?在内存方面的影响是什么?

执行的是颜色空间转换为输出图像分配新的独立内存内存占用减少约 66.7%(从3通道变为1通道)保证输入输出数据的完全独立这是一种既安全又内存高效的处理方式。resize做了什么操作,对内存的影响cv::resize执行的是图像缩放为输出图像分配新的独立内存内存占用按缩放因子的平方减少(factor²)保证输入输出数据的完全独立与 cvtColor 结合使用可大幅降低总内存占用这是一种既安全又能显著优化内存使用的处理方式。

2025-10-21 16:32:50 614

原创 gray = roi.clone();和gray = roi;的区别是什么?

if (roi.channels() == 1) { // 如果已经是灰度图,直接使用 std::cout << "Image is already grayscale, using directly" << std::endl;// 或者直接使用 image } 和 gray = roi;的区别是什么?这两行代码有重要的区别,主要体现在:在内存中创建一份全新的、独立的数据副本gray和roi使用不同的内存空间:修改gray不会影响roi,修改roi也不会影响gray。

2025-10-21 16:03:39 356

原创 为什么要使用枚举类?有什么好处?

虽然直接使用 int 看起来更简单,但在实际项目中,枚举类提供的类型安全、更好的可读性、编译时检查和更易于维护的特性,远远超过了初期的编码便利性。特别是对于状态码、错误码、配置选项等,使用枚举类是更好的选择。

2025-10-12 16:11:43 555

原创 定理是什么?

公理是深埋于地下的地基,我们无条件地接受它们。定义是建造大厦所用的砖块的规格说明。定理则是用这些砖块,按照严格的建筑规范(逻辑推理),一层一层建造起来的坚固结构(如墙壁、楼层、房间)。引理可能是搭建脚手架时用的小部件。推论是建好一面主墙后,自然而然出现的一个小壁龛。因此,定理是数学知识的骨干,是那些我们确信为真、并可以作为进一步探索和发现基础的核心真理。

2025-10-10 10:08:26 482

原创 程序的规范?一个优美的c++工程代码是什么样的?

我们通常从以下几个方面来评价一个C++工程代码的优美程度:代码结构清晰,模块化设计良好。遵循一致的命名规范。适当的注释,既不过多也不过少,注释应该解释为什么(why)而不是什么(what)。遵循面向对象的设计原则(如SOLID原则)或泛型编程原则。使用适当的设计模式,但不要过度设计。错误处理机制完善。代码可读性高,易于维护和扩展。使用版本控制,并有清晰的提交信息。有完整的文档(如README、API文档等)。有自动化构建和测试。下面通过一个简单的例子来展示一个优美的C++代码片段。

2025-09-29 10:16:13 401

原创 在当前分支中,进行了修改,如果没有git add git commit 的话,切换到其他分支,当前修改是不是不会保存?

如果在当前分支进行了修改但没有git add和git commit。

2025-09-26 10:39:16 377

原创 一款相机是只有桶形畸变 和 枕形畸变的一种,还是两个都有?

产生主体:畸变源于镜头,而非相机机身。对于变焦镜头:非常常见的情况是同时拥有两种畸变,在广角端呈桶形,在长焦端呈枕形。对于定焦镜头:通常主要表现出一种与其焦段相关的畸变,但高级定焦镜头的畸变控制得很好。最终成像:得益于数码校正技术,无论是相机直出的JPEG还是手机照片,所看到的最终效果通常都是已经过处理、畸变极其轻微甚至完全消除的图像。

2025-09-22 10:34:44 468

原创 std::thread cameraThread_; std::thread processingThread_;解释代码

用于创建和管理线程。和分别用于处理相机捕获和图像处理任务。使用可以实现多线程并发执行,提高程序的效率。在多线程程序中,需要确保线程安全,例如通过使用类型或同步机制(如互斥锁)。

2025-07-23 17:38:56 392

原创 我不喜欢尝试新事物,做事情唯唯诺诺。怎么能变得更积极主动进取一些?

将尝试新事物或可能出错的情况视为“学习机会”或“数据收集”,而不是灾难性的失败。每一次“不那么成功”的体验都提供了宝贵的信息,告诉你下次可以如何调整。问自己:“从这次经历中,我学到了什么?

2025-07-23 11:28:18 1228

原创 我很焦躁。很烦躁。无法静下心工作看论文调试代码。肩胛骨缝发紧。

嗯……用户此刻正被强烈的焦躁感和身体不适困扰,甚至无法进行日常工作。这种状态我太熟悉了——就像电路过载时发出的嗡鸣声。从ta用“肩胛骨缝发紧”这样精准的描述能看出,ta已经敏锐觉察到情绪在身体的映射。回溯对话历史,用户前几日还在困扰行动力问题,现在突然陷入急性焦虑状态,可能是积累的压力突破了临界点。ta的用词短促重复(“很焦躁。很烦躁。”),像被无形的东西扼住了喉咙。此刻最迫切的不是长期改变方案,而是帮ta从情绪洪流中上岸。需要双管齐下:先处理身体警报,再疏导情绪漩涡。

2025-07-23 11:27:24 631

原创 链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。附加的目标文件包括静态连接库和动态连接库。其中的启动文件是什么意思?

启动文件是编译和链接过程中不可或缺的一部分,它们负责初始化运行时环境、调用全局对象的构造函数和析构函数,以及提供运行时支持。(Startup Files)是一些特殊的文件,它们在程序启动时被加载和执行,用于初始化运行时环境。启动文件负责调用这些构造函数,确保全局对象在程序开始执行之前被正确初始化。在程序退出时,启动文件还会负责调用全局对象的析构函数,确保资源被正确释放。:这是 C 语言的启动文件,负责初始化 C 运行时环境。:这些文件用于初始化和结束全局对象的构造和析构。:负责初始化全局对象的构造。

2025-06-20 17:43:07 235

原创 openvins 中imu 积分相关的函数

这些函数和类提供了完整的 IMU 预积分功能,可用于视觉-惯性导航系统(VINS)中的状态估计。这些类提供了连续时间预积分的功能,用于处理 IMU 数据并计算预积分量。是连续时间预积分的基类,提供了预积分的基本框架。的一个派生类,实现了连续时间预积分的具体方法。:结束时刻的加速度计测量值(可选)。:结束时刻的加速度计测量值(可选)。:结束时刻的陀螺仪测量值(可选)。:结束时刻的陀螺仪测量值(可选)。:起始时刻的加速度计测量值。:起始时刻的加速度计测量值。:起始时刻的陀螺仪测量值。:起始时刻的陀螺仪测量值。

2025-06-20 17:37:05 508

原创 openvins 的imu 积分

OpenVINS 提供了离散时间积分的实现,包括欧拉积分、中点积分和 RK4 积分。OpenVINS 提供了详细的文档和代码实现,包括离散和连续时间的惯性积分。结合惯性和偏置误差的连续预积分因子用于建模由于偏置漂移导致的测量误差状态动态。预积分量是通过积分 IMU 测量得到的量,用于在两个时间点之间传播状态。Δbw​=bw(k)​−b~w​ 是真实偏置与当前偏置估计值之间的差值。Iτ​Ik​​R 是从时间 tk​ 到时间 tτ​ 的旋转矩阵。Δtk​=tk+1​−tk​ 是两个时间点之间的时间差。

2025-06-16 10:44:23 462

原创 #include <sstream>常用函数介绍

用于在字符串和流之间进行转换。这些类可以方便地用于字符串分割、格式化输出和双向读写操作。,它们分别用于从字符串读取数据、向字符串写入数据以及同时进行读写操作。是 C++ 标准库中的一个头文件,提供了用于在字符串和流之间进行转换的类。用于从字符串中读取数据,类似于从文件或流中读取数据。用于向字符串写入数据,类似于向文件或流中写入数据。:查看下一个字符,但不提取。:查看下一个字符,但不提取。:获取或设置内部字符串。:检查是否到达文件末尾。:获取或设置内部字符串。:获取或设置内部字符串。:检查是否发生错误。

2025-06-15 13:52:02 554

原创 std::ifstream file(filename);详细解释

确保文件路径正确。如果文件不在当前工作目录中,需要提供绝对路径或相对路径。:如果文件包含特殊字符(如 UTF-8 编码的文件),可能需要额外处理。:在实际应用中,可以使用异常处理机制来捕获文件读取过程中可能出现的错误。是 C++ 标准库中的一个类,用于从文件中读取数据。在尝试读取文件之前,应该检查文件是否成功打开。的一个特化版本,专门用于输入操作。是一个字符串,表示要打开的文件路径。以下是一个完整的示例,展示如何使用。这会创建一个未关联任何文件的。:确保程序有权限读取文件。这会直接打开指定的文件。

2025-06-14 17:32:32 1067

原创 g++ a.cpp -o a ‘pkg-config --cflags --libs opencv4‘/usr/bin/ld: 找不到 没有那个文件或目录

如果输出了 OpenCV 的版本号,说明 OpenCV 已正确安装。如果没有输出或报错,说明 OpenCV 未正确安装。首先,确保 OpenCV 已正确安装在你的系统上。如果 OpenCV 的配置文件不在默认路径中,你需要手动设置。无法找到 OpenCV 的配置文件或未正确安装导致的。命令没有正确执行,导致编译器无法找到 OpenCV 的库文件和头文件路径。你可以通过以下命令安装。无法找到 OpenCV 的配置文件,就会导致这个错误。是一个工具,用于查询已安装库的编译和链接选项。确保你的编译命令正确。

2025-06-14 17:14:16 769

原创 sudo make install # 安装到 /usr/local解释代码

是一个常用的命令,用于将编译后的软件安装到系统中。在你提供的上下文中,这个命令的作用是将编译好的 OpenCV 库和相关文件安装到。:安装完成后,你可能需要更新环境变量,以便系统能够找到 OpenCV 的库文件。是一个标准的 Linux 目录,用于安装用户自定义的软件。中的规则,将编译后的 OpenCV 库、头文件和可执行文件安装到。目标通常定义了将编译后的文件复制到指定的安装目录的规则。是一个包含构建规则的文件,通常由 CMake 生成。通过这些步骤,你可以将编译好的 OpenCV 安装到。

2025-06-12 21:09:14 626

原创 /usr/local/bin:可执行文件。/usr/local/lib:库文件。/usr/local/include:头文件。/usr/local/share:共享数据。详细解释

这些目录的结构和用途是 Linux 系统中的标准约定,有助于保持系统的整洁和组织性。:这个目录包含用户安装的软件的头文件。头文件通常包含函数声明、宏定义、数据结构等,用于在编译时提供必要的信息。:这个目录通常包含用户安装的软件的可执行文件。这些文件通常是通过编译源码或安装预编译的二进制包生成的。:这个目录包含用户安装的软件的共享数据。这些数据通常不直接用于程序的运行,但提供了额外的信息或资源。:这个目录包含用户安装的软件的库文件。这些库文件通常用于动态链接,允许多个程序共享相同的代码。

2025-06-12 21:07:50 527

原创 详细解释aruco::markdetection _detectInitialCandidates函数

│├─ 设置参数检查│├─ 计算使用多少种窗口大小(nScales)│├─ 并行遍历每个窗口大小:│ ├─ 图像二值化(_threshold)│ └─ 提取并筛选候选标记(_findMarkerContours)│ ├─ 查找轮廓│ ├─ 筛选轮廓(凸四边形、周长、角点距离等)│ └─ 添加进临时容器│└─ 合并所有窗口大小下的结果到输出特性描述功能检测图像中所有可能的 ArUco 标记候选区域输入灰度图像、检测参数输出候选角点列表、对应轮廓列表关键技术。

2025-06-11 19:50:21 876

原创 详细解释opencv aruco::detectMarkers代码

函数是 Aruco 标记检测的核心函数之一,其主要作用是从输入图像中检测出 Aruco 标记,并输出它们的角点、ID 以及其他相关信息。该函数实现了从原始图像到 Aruco 标记检测的完整流程,涵盖了检测、识别和优化等多个关键步骤。将输入图像转换为灰度图。

2025-06-11 15:29:53 536

原创 把下载的ippicv.tgz放入<opencv_build_dir>/3rdparty/ippicv/download/中cmake依然无法识别

确认文件名正确无误重新运行 cmake若仍失败,使用强制指定路径。

2025-06-11 15:07:12 592

原创 -- IPPICV: Downloading ippicv自己下载了ippicv要放在什么目录下?

如果,需要将它放到,以便 CMake 能够正确识别并跳过自动下载步骤。

2025-06-11 14:52:34 493

原创 将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 方法是一种自动阈值化技术,通过最大化类间方差来选择最佳阈值,从而将图像分割为前景和背景。在 OpenCV 中,可以通过。

2025-06-10 21:05:24 548

原创 aruco::detectMarkers中什么情况下marker会被判定为rejectedMarkers

在 OpenCV 的函数中,是一个输出参数,用于存储那些。

2025-06-10 20:38:30 431

原创 opencv RGB图像转灰度图

/ 创建灰度图 dst// 使用并行方式将 RGB 图像转为灰度图return dst;判断输入图像是否是3通道 8 位无符号整型的 RGB 图像如果是,则创建一个单通道灰度图dst使用并行循环对每一行像素进行RGB 转 Gray 操作返回灰度图像dst。

2025-06-10 14:51:23 723

原创 row_dst[col] = static_cast<uchar>(0.114 * blue + 0.587 * green + 0.299 * red);中的static_cast是什么意思

是一种类型转换操作符,用于在编译时执行类型转换。它是一种显式的类型转换方式,可以将一个表达式从一种类型转换为另一种类型,但转换必须在类型安全的范围内进行。:用于低级别的类型转换,如将一个指针类型转换为另一个指针类型,但不保证转换的安全性。它确保了类型转换的意图明确,并且在编译时检查类型转换的安全性。否则,直接将浮点数结果四舍五入到最接近的整数,并将其转换为。:用于运行时类型转换,主要用于继承体系中的对象转换。是最合适的选择,因为它可以安全地将浮点数转换为。:用于在类型安全的范围内进行转换,如从。

2025-06-10 14:24:03 421

原创 3通道图的数据在opencv的mat是如何存放的

这意味着图像的像素数据是按行顺序存储的,并且每个像素包含 3 个通道的值。对象中,采用行优先的连续内存布局,每个像素包含 3 个通道的值(默认为 BGR 顺序)。在 OpenCV 中,3 通道图像(如常见的 RGB 或 BGR 图像)的数据存储在。是一种安全的像素访问方法,适用于单个像素的读写操作。对于 3 通道图像,可以使用。:在 OpenCV 中,默认的通道顺序是 BGR(蓝、绿、红),而不是 RGB。:每个像素由 3 个字节组成,分别表示蓝色、绿色和红色通道的值。:图像的每一行数据是连续存储的。

2025-06-10 14:16:41 660

原创 cv::parallel_for_(cv::Range(0, img.rows), [&](const cv::Range &range)解释代码

在 C++ 中,是一个lambda 表达式,它用于定义一个匿名函数对象。这个 lambda 表达式在 OpenCV 的函数中被用作并行处理的回调函数,用于处理图像或数组的某个子范围。1. Lambda 表达式的结构// 函数体[capture]:捕获列表,用于捕获外部变量。[&]表示以引用方式捕获所有外部变量。:参数列表,定义了 lambda 表达式接收的参数。:返回类型(可选)。如果省略,编译器会自动推断返回类型。{}:函数体,定义了 lambda 表达式的具体逻辑。2.[&]捕获列表[&]

2025-06-10 14:05:08 800

原创 cv::Range的用法

是 OpenCV 中用于表示区间范围的一个简单而强大的工具。它可以帮助你高效地操作图像或数组的特定部分,而无需手动处理复杂的索引逻辑。是一个非常有用的类,用于表示一个连续的区间范围。它通常用于对图像或数组的特定区域进行操作,例如提取子图像、对数组的某一部分进行处理等。这是一个特殊的范围,表示从 0 到最大可能的值(通常是数组的长度)。是一个简单的类,用于表示一个连续的区间范围。的值在数组或图像的有效范围内,否则可能会导致运行时错误。:返回范围的大小(即区间内元素的数量):区间的起始位置(包含)。

2025-06-10 13:52:21 527

原创 亮度的变化会引起图片rgb的变化么?

亮度的变化确实会引起图片中像素的 RGB 值的变化。具体变化方式取决于调整亮度的方法(如线性调整、伽马校正、直方图均衡化等)。通过合理调整亮度,可以改善图像的视觉效果,使其更适合不同的应用场景。

2025-06-10 12:12:04 531

原创 在ARUCO标记识别中为什么要做镜像有什么作用

水平镜像(左右翻转)垂直镜像(上下翻转)同时翻转场景是否需要镜像使用前置摄像头✅ 需要,避免左右颠倒与机器人运动方向一致✅ 需要统一坐标系数据集已镜像✅ 保持一致性后置摄像头 + 正常视角❌ 不需要调试可视化时更符合直觉✅ 推荐开启。

2025-06-10 10:34:22 493

scureCRT9.2.3 ubuntu20.04

scureCRT9.2.3 ubuntu20.04

2025-06-23

STM32CubeMX安装包,包含java安装包

STM32CubeMX安装包,包含java安装包

2024-09-21

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

TA关注的人

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