當然,我會為你繪制一個程序執行流程圖,并用中文注釋來解釋 main.cpp
的代碼邏輯思想和執行流程。
程序執行流程圖
開始|V
初始化|V
打開攝像頭 (VideoCapture cap(0))|V
進入主循環 (while (true))|V
捕獲圖像 (cap >> srcImage)|V
圖像是否為空? (if (!srcImage.empty()))| || 是 | 否V V
處理圖像 (imageProcess) 跳過本次循環|V
發送數據 (lcmutil->send)|V
打印狀態 (logMode)|V
顯示或發送圖像 (colorgroup.showPicture)|V
線程延時 20 毫秒 (QThread::msleep(20))|V
返回主循環 (while (true))|V
程序結束 (printf("程序運行結束\n"))|V
釋放攝像頭資源 (cap.release())|V
結束 (return 0)
詳細代碼邏輯解釋
-
初始化和庫的包含:
- 包含必要的庫,如標準輸入輸出庫(
<iostream>
)、OpenCV庫(<opencv2/opencv.hpp>
)和Qt庫(<QThread>
)。 - 使用命名空間
cv
和std
。
- 包含必要的庫,如標準輸入輸出庫(
-
全局變量和常量:
- 定義一些全局變量,如
colorgroup
、mythread
和udpsocket
,這些變量在程序中多處使用。
- 定義一些全局變量,如
-
主函數:
- 初始化攝像頭對象
VideoCapture cap(0)
,打開默認攝像頭。 - 定義一個
Mat
類型的變量srcImage
用于存儲捕獲的圖像。 - 進入主循環
while (true)
,不斷捕獲和處理圖像。
- 初始化攝像頭對象
-
主循環:
- 捕獲圖像
cap >> srcImage
,將攝像頭捕獲的圖像存儲在srcImage
中。 - 檢查圖像是否為空
if (!srcImage.empty())
:- 如果圖像不為空,則調用
imageProcess(srcImage)
函數處理圖像。 - 調用
lcmutil->send(v_des, gait_type, step_height, stand_height, rpy_des)
發送數據。 - 調用
logMode()
打印程序狀態。 - 調用
colorgroup.showPicture(srcImage, 1)
顯示或發送處理后的圖像。
- 如果圖像不為空,則調用
- 線程延時 20 毫秒
QThread::msleep(20)
,然后返回主循環繼續捕獲圖像。
- 捕獲圖像
-
處理圖像函數
imageProcess
:- 定義若干
Mat
類型的變量用于存儲中間處理結果,如ZoomOutimage
、frame
、frame2
和Blurimage
。 - 進行一系列圖像處理操作:
- 調整圖像大小
resize(image, ZoomOutimage, Size(400, 300))
。 - 對圖像進行中值濾波
medianBlur(ZoomOutimage, Blurimage, 5)
。 - 根據顏色閾值進行二值化處理
inRange(Blurimage, colorgroup.whiteMin, colorgroup.whiteMax, frame)
。 - 進行更多的處理步驟以提取所需信息。
- 調整圖像大小
- 定義若干
-
結束程序:
- 當主循環結束時,輸出程序結束信息
printf("程序運行結束\n")
。 - 釋放攝像頭資源
cap.release()
。 - 返回 0 結束程序
return 0
。
- 當主循環結束時,輸出程序結束信息
流程圖示例
開始|V
+--------------------+
| 包含必要的庫和命名 |
| 空間 |
+--------------------+|V
+--------------------+
| 定義全局變量和常量 |
+--------------------+|V
+------------------------+
| 初始化攝像頭 VideoCapture cap(0) |
+------------------------+|V
+-------------------+
| 進入主循環 while (true) |
+-------------------+|V
+----------------------+
| 捕獲圖像 cap >> srcImage |
+----------------------+|V
+-------------------------+
| 圖像是否為空 if (!srcImage.empty()) |
+-------------------------+| || 是 | 否| V| +-------------+| | 跳過本次循環 || +-------------+|V
+-----------------------+
| 處理圖像 imageProcess |
+-----------------------+|V
+--------------------+
| 發送數據 lcmutil->send |
+--------------------+|V
+--------------------+
| 打印狀態 logMode |
+--------------------+|V
+---------------------------+
| 顯示或發送圖像 colorgroup.showPicture |
+---------------------------+|V
+--------------------------+
| 線程延時 20 毫秒 QThread::msleep(20) |
+--------------------------+|V
+---------------------+
| 返回主循環 while (true) |
+---------------------+|V
+-------------------+
| 程序結束 printf("程序運行結束\n") |
+-------------------+|V
+---------------------+
| 釋放攝像頭資源 cap.release() |
+---------------------+|V
+--------+
| 結束 return 0 |
+--------+
這個流程圖和解釋展示了 main.cpp
的代碼邏輯思想和程序執行的主要步驟,幫助初學者理解代碼的工作原理。