第五讲补充:疑难解答
约 1074 字大约 4 分钟
2026-06-21
一、C++ 异常处理 (try-catch)
1. 基本概念
- 异常 (Exception):程序运行时发生的非预期错误(如操作无效、资源不足等),会中断正常执行流程。
- try 块:包裹可能抛出异常的代码,告诉编译器“这段代码需要监控异常”。
- catch 块:用于捕获并处理 try 块中抛出的异常,指定要处理的异常类型。
2. 语法结构示例
#include <iostream>
using namespace std;
int divide(int a, int b) {
if (b == 0) {
// throw 是核心关键字,用于主动抛出异常
throw "除数不能为零!";
}
return a / b;
}
int main() {
int x = 10, y = 0;
try {
int result = divide(x, y); // 调用可能抛出异常的函数
cout << "结果:" << result << endl; // 若无异常,执行此句
}
catch (const char* errMsg) { // 捕获字符串类型的异常
cout << "捕获到异常:" << errMsg << endl; // 处理异常
}
cout << "程序继续执行..." << endl; // 异常处理后,程序不会崩溃
return 0;
}二、命名空间 (Namespace)
1. 核心作用
解决命名冲突。在大型项目或引入第三方库时,避免相同名称的变量、函数、类发生“重定义”错误。
2. 使用示例
// 定义命名空间 A
namespace A {
int num = 10;
void print() { cout << "A::num=" << num << endl; }
}
// 定义命名空间 B
namespace B {
int num = 20; // 与 A 中的 num 同名,无冲突
void print() { cout << "B::num=" << num << endl; }
}
// 调用方式
A::print(); // 输出 A::num=10
B::print(); // 输出 B::num=20
cout << A::num << endl;
// 使用 using namespace 简化代码(注意可能引入冲突)
using namespace A;
print(); // 直接调用 A::print()三、ROS 视觉核心数据类型
1. cv_bridge::CvImagePtr
- 本质:它是
boost::shared_ptr<CvImage>的别名,即一种智能指针。 - 组成:
cv_bridge::CvImage:存储图像数据(内部包含 OpenCV 的cv::Mat)和 ROS 元数据(编码格式、时间戳等)。shared_ptr:自动管理内存,无需手动delete,避免内存泄漏。
- 优势:符合 ROS 生态规范,便于在节点间安全传递图像数据。
2. cv::Mat (Matrix)
- 定义:OpenCV 中用于存储图像数据的核心数据结构,是一个多维数组容器。
- 核心特点:
- 多维度支持:常用 2D 结构表示图像(行×列)。
- 通道顺序:默认使用 BGR(蓝-绿-红),而非 RGB。
- 自动内存管理:采用引用计数机制,多个 Mat 对象共享数据时,只有最后一个对象释放时才真正释放内存。
- 灵活性:可通过
rows,cols,channels(),type()快速获取属性。
3. 指针 (Pointer)
- 本质:存储另一个变量内存地址的特殊变量。
- 关键运算符:
&:取地址符。*:解引用符(访问指针指向的值)。
- 常见场景:函数传址(修改外部变量)、动态内存分配 (
new/delete)、数组遍历。
四、OpenCV 图像处理关键函数
1. createTrackbar() - 创建滑动条
用于动态调整参数(如 HSV 阈值)。
- 参数说明:
- 滑动条名称(如
"LowH")。 - 所属窗口名称(如
"Threshold")。 - 关联变量地址(如
&iLowH,拖动时修改该值)。 - 最大值(H: 0-179, S/V: 0-255)。
- 滑动条名称(如
2. 形态学操作 (Morphological Operations)
A. 创建结构元素
// 创建一个 5x5 的矩形结构元素(核)
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));MORPH_RECT:矩形形状(还有MORPH_ELLIPSE,MORPH_CROSS)。Size(5, 5):尺寸越大,对图像影响越强。
B. 开运算 (MORPH_OPEN)
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);- 原理:先腐蚀后膨胀。
- 作用:去除微小噪点(背景中的小白点),平滑目标边界。
C. 闭运算 (MORPH_CLOSE)
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);- 原理:先膨胀后腐蚀。
- 作用:填补目标内部的小黑洞,连接邻近的连通域。
五、总结与建议
- 异常处理:在涉及文件读取、网络通信或复杂计算时使用
try-catch增强程序健壮性。 - 内存管理:在 ROS 开发中优先使用智能指针(如
CvImagePtr),避免手动管理new/delete。 - 图像预处理:
- 颜色识别首选 HSV 空间。
- 务必结合形态学操作(开/闭运算)优化二值化结果,提高定位精度。
- 调试技巧:利用
createTrackbar实时调整阈值,快速找到最佳识别参数。
