6장: 색상 인식
이번 장의 목표: NanoCam이 화면 속 물체의 색상을 인식하고, 좌표를 얻어 분류 등의 응용에 사용합니다.
원리
HSV(색조-채도-명도) 색 공간을 기반으로 합니다. 카메라가 출력한 RGB565 이미지는 esp-dl의 ColorDetector 엔진으로 처리되며, 이미지를 80×80 해상도로 축소하여 노이즈를 줄인 뒤 픽셀 단위로 HSV 값으로 변환하여 사전 설정된 7가지 색상 임계값과 매칭합니다.
사전 설정 색상 임계값(OpenCV 표준 H 범위, 0-180 스케일)
| 색상 | 색조(H) | 채도(S) | 명도(V) | 면적 임계값 |
|---|---|---|---|---|
| 빨강 | 0-15 | 70-255 | 90-255 | 64 |
| 노랑 | 23-33 | 70-255 | 90-255 | 64 |
| 초록 | 34-75 | 70-255 | 90-255 | 64 |
| 파랑 | 97-124 | 70-255 | 90-255 | 64 |
| 보라 | 125-155 | 70-255 | 90-255 | 64 |
| 흰색 | 0-180 | 0-40 | 200-255 | 80 |
| 검정 | 0-180 | 0-255 | 0-50 | 80 |
색조는 OpenCV 0-180 스케일(0-360°에 대응)을 사용합니다.
set_bgr(false)는 라이브러리가 RGB565 데이터를 그대로 읽도록 하여 채널을 교환하지 않습니다.
단계
6.1 색상 모드 진입
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 | 중심점 X | int16 BE |
| 0x2A-0x2B | 중심점 Y | int16 BE |
| 0x2C-0x2D | 인식 ID | int16 BE |
코드
핵심 검출 엔진
components/modules/ai/who_color_detection.cpp — esp-dl ColorDetector 기반:
// 검출기 생성, 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 코드 스캔

