[i=s] 本帖最后由 keer_zu 于 2025-7-3 05:47 编辑 [/i]<br />
<br />
数据流全过程解析
结合四个代码文件,整个系统的数据流可以分为以下几个关键阶段:
1. 相机采集阶段 (CameraThread)

- 线程:
CameraThread (独立线程)
- 关键过程:
1. 初始化工业相机SDK
2. 循环捕获原始图像帧
3. 应用相机标定参数进行畸变校正
4. 发射携带校正后图像的
frameCaptured 信号
2. 主线程接收原始帧 (MainWindow)

- 线程:主线程(GUI线程)
- 关键过程:
1. 通过信号槽接收
cv::Mat 格式的校正后图像
2. 转换为QImage并显示在原始视频区域
3. 调用 m_processingThread->processFrame() 将图像传递给处理线程
3. 图像处理阶段 (ProcessingThread)

- 线程:
ProcessingThread (独立线程)
- 关键处理步骤:
1. 背景差分:当前帧与背景模型比较
2. 二值化:使用阈值分割目标区域
3. 轮廓分析:寻找最大轮廓作为板材
4. 图像拼接:将连续帧中的板材部分拼接成完整图像
5. 坐标转换:将像素坐标转换为世界坐标(毫米)
6. 点云生成:累积轮廓点生成2D点云
4. 处理结果反馈

-
- 四类信号发射:
1.
processedFrame :发送二值化处理后的图像
2. measurementComplete :发送板材尺寸测量结果
3. pointCloudGenerated :发送生成的2D点云数据
4. statusChanged :发送处理状态信息
5. 主线程更新UI

- 关键UI更新:
- 处理后的二值图像显示在processedView
- 尺寸结果显示在QLabel控件
- 点云在VTK组件中3D可视化
- 状态信息显示在底部状态栏
信号槽连接机制详解
1. 连接建立原理
connect(
sender, // 信号发送对象
&Sender::signalName, // 信号函数地址
receiver, // 接收对象
&Receiver::slotName // 槽函数地址
);
2. 参数传递机制
当信号被发射时:
emit signalName(arg1, arg2, ...);
参数会通过Qt的元对象系统自动传递给槽函数:
receiver->slotName(arg1, arg2, ...);
3. 具体连接分析
(1) 处理后的图像显示
connect(m_processingThread, &ProcessingThread::processedFrame,
this, &MainWindow::updateProcessedVideo);
(2) 测量结果更新
connect(m_processingThread, &ProcessingThread::measurementComplete,
this, &MainWindow::updateResults);
-
参数传递:
// ProcessingThread.cpp
emit measurementComplete(width, height, area);
// MainWindow.cpp
void updateResults(double length, double width, double area)
-
参数映射:
1. width → length (参数名不一致但数据对应)
2. height → width
3. area → area
(3) 点云数据传递
connect(m_processingThread, &ProcessingThread::pointCloudGenerated,
this, &MainWindow::updatePointCloud);
(4) 状态信息更新
connect(m_processingThread, &ProcessingThread::statusChanged,
this, &MainWindow::updateStatus);
跨线程通信关键技术
-
队列连接(QueuedConnection):
- 自动处理跨线程信号传递
- 信号放入接收者线程的事件队列
- 接收者线程在事件循环中处理槽调用
-
隐式共享数据类:
cv::Mat :引用计数+写时复制
QString :隐式共享
pcl::PointCloud::Ptr :智能指针
-
同步机制:
- 处理线程使用QMutex+QWaitCondition
- 保证帧处理的顺序性
- 避免数据竞争
-
资源管理:
- 点云通过智能指针传递
- OpenCV矩阵自动内存管理
- Qt对象在父对象析构时自动销毁
数据流时序图

这种设计实现了:
- 采集/处理/显示分离
- 实时性能优化
- 线程安全通信
- 资源高效管理
- 模块化扩展能力
|