🧪 새 튜토리얼이 계속 업데이트 중 — 로봇 팔부터 센서까지
본문으로 건너뛰기

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장: QR 코드 스캔