🧪 新教程持續更新中 · 由機械臂到傳感器,跟隨教程從零搭建
跳到主要內容

第 6 章:顏色識別

淘寶店鋪

本章目標:讓 NanoCam 識別畫面中物體的顏色,並獲取座標用於分揀等應用。

原理

基於 HSV(色調-飽和度-明度)色彩空間。攝像頭輸出的 RGB565 圖像經 esp-dl 的 ColorDetector 引擎處理,將圖像縮放到 80×80 解析度降噪後,逐像素轉換為 HSV 值,與預設的 7 種顏色閾值進行匹配。

預設顏色閾值(OpenCV 標準 H 範圍,0-180 標度)

顏色色相(H)飽和度(S)明度(V)面積門檻
紅色0-1570-25590-25564
黃色23-3370-25590-25564
綠色34-7570-25590-25564
藍色97-12470-25590-25564
紫色125-15570-25590-25564
白色0-1800-40200-25580
黑色0-1800-2550-5080

色相使用 OpenCV 0-180 標度(對應 0-360°)。set_bgr(false) 確保庫原樣讀取 RGB565 數據,不交換通道。

步驟

6.1 進入顏色模式

Plain
ai_mode:3

設備自動重啟進入顏色檢測模式,WS2812 RGB LED (GPIO18) 顯示當前識別到的顏色。

完整指令見串口協議手冊

6.2 觀察識別結果

將純色物體放在攝像頭前,瀏覽器打開 http://<IP> 會顯示:

  • 彩色矩形框標註檢測到的顏色區域

  • 顏色標籤文字(red/yellow/green/blue/purple/white/black)

  • 框和標籤顏色與實際檢測顏色一致

顏色模式只做畫面疊加(OSD),不輸出串口日誌。需要獲取座標請透過 I2C 寄存器讀取。

6.3 I2C 讀取檢測數據

NanoCam 作為 I2C Slave (地址 0x33,GPIO SDA=41 SCL=42),實時更新檢測框中心點座標。

寄存器內容數據類型
0x28-0x29中心點 Xint16 BE
0x2A-0x2B中心點 Yint16 BE
0x2C-0x2D識別 IDint16 BE

程式碼

核心檢測引擎

components/modules/ai/who_color_detection.cpp — 基於 esp-dl ColorDetector:

C++
// 構建檢測器,set_bgr(false) 確保顏色通道正確
ColorDetector detector;
detector.set_bgr(false);
detector.set_detection_shape({80, 80, 1});
// 註冊 7 種顏色閾值
detector.register_color({h_lo, h_hi, s_lo, s_hi, v_lo, v_hi}, area_min, "red");
// 檢測
auto &results = detector.detect((uint16_t *)frame->buf,
    {(int)frame->height, (int)frame->width, 3});

// 遍歷結果畫框+標籤
for (int ci = 0; ci < (int)results.size(); ci++) {
    for (int ri = 0; ri < (int)results[ci].size(); ri++) {
        color_detect_result_t &res = results[ci][ri];
        draw_rect(frame, res.box[0], res.box[1], res.box[2], res.box[3], color_lcd);
        fb_gfx_print(frame, lx, ly, color_lcd, color_name);
    }
}

效果

紅綠藍物體→識別顏色→畫框+標籤→I2C 輸出座標→可接舵機分揀。

下一章:第 7 章:二維碼掃描