HumansXドキュメントセンター 公式サイトへ ↗

実験6-1_ビジョン認識 – 単一物体の色範囲の取得

実験の目的:

  1. AIモジュール(K210)を使用して、単一物体の色域範囲を取得します。

応用シーン

色による物品の仕分け。

機能要件:

物体を認識し、単一物体の色域範囲を取得します(データを取得しやすくするため、単色の物体を推奨します)。

ハードウェアの準備:

AIオフラインビジョンモジュール(K210)* 1、Type-C データケーブル * 1;

回路接続:

ハードウェアモジュール

ヒント:AIビジョンモジュールの基本的な使い方に慣れておくことを強く推奨します。

AIビジョンモジュールの基本的な使い方

実際の配線

下図のように、Type-C データケーブルで K210 ビジョンモジュールをPCに接続します:

ソフトウェア設計:

プロジェクトのダウンロード

ソースコードのリンク:(HumansX サポートより提供)

プログラムコード

コアコード:color_recognition.py

"""
功能:实现检测特定物体,并将该物体的lab色域值范围打印出来
date: 2025-09-08
"""

import sensor
import image
import time
import lcd

#载入按键控制模块
from hiwonder import hw_key, hw_led , fill_light

#初始化LCD
lcd.init()
#以下是初始化传感器
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 100)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

#创建LED控制对象
led = hw_led()
#创建补光灯控制对象
f_led = fill_light()

#LED,补光灯开
led.led_onoff(1)    #LED开
led.led_onoff(0)    #LED关
f_led.fill_onoff(1) #补光灯开
time.sleep(0.5)  #延时0.5s

#帧率时钟
clock = time.clock()

#方框参数
r = [(320//2)-(50//2), (240//2)-(50//2), 50, 50]

#创建按键控制对象
key = hw_key()

state = key.key_scan(1)

#显示图像,等待按键按下
while (state == 0):
    state = key.key_scan(1)
    img = sensor.snapshot()
    img.draw_rectangle(r)
    lcd.display(img)

print("Start learning ...")
threshold = [50, 50, 0, 0, 0, 0] # Middle L, A, B values.

#第一次赋值
img = sensor.snapshot()
hist = img.get_histogram(roi=r)
lo = hist.get_percentile(0.01) #获得直方图在1%范围内的CDF(根据需要调整)!
hi = hist.get_percentile(0.99) #获得直方图在99%范围内的CDF(根据需要调整)!
threshold[0] = (threshold[0] + lo.l_value()) // 2
threshold[1] = (threshold[1] + hi.l_value()) // 2
threshold[2] = (threshold[2] + lo.a_value())
threshold[3] = (threshold[3] + hi.a_value())
threshold[4] = (threshold[4] + lo.b_value())
threshold[5] = (threshold[5] + hi.b_value())

#连续捕捉了50张图像学习阶段
for i in range(50):
    img = sensor.snapshot()
    hist = img.get_histogram(roi=r)
    lo = hist.get_percentile(0.01) #获得直方图在1%范围内的CDF(根据需要调整)!
    hi = hist.get_percentile(0.99) #获得直方图在99%范围内的CDF(根据需要调整)!
    #hi = hist.get_percentile(0.70) #获得直方图在99%范围内的CDF(根据需要调整)!
    #以百分位数表示的平均值
    threshold[0] = (threshold[0] + lo.l_value()) // 2
    threshold[1] = (threshold[1] + hi.l_value()) // 2
    threshold[2] = (threshold[2] + lo.a_value()) // 2
    threshold[3] = (threshold[3] + hi.a_value()) // 2
    threshold[4] = (threshold[4] + lo.b_value()) // 2
    threshold[5] = (threshold[5] + hi.b_value()) // 2
    #将识别区域用方框圈出来
    for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):
        img.draw_rectangle(blob.rect())
        img.draw_cross(blob.cx(), blob.cy())
        img.draw_rectangle(r, color=(0,255,0))
    lcd.display(img)
print("threshold:", threshold)

print("Thresholds Learning completed...")

print("Start Color Recognition...")

#loop
while(True):
    #用于计算帧率的函数,这里表示开始计时
    clock.tick()
    #从传感器捕获一张图像
    img = sensor.snapshot()
    #遍历图像中找到的颜色区块
    for blob in img.find_blobs([threshold], pixels_threshold=100, area_threshold=100, merge=True, margin=10):
        #绘制矩形和十字标记
        img.draw_rectangle(blob.rect())
        img.draw_cross(blob.cx(), blob.cy())
    #显示在LCD上
    lcd.display(img)
    #打印帧率
    #print(clock.fps())

操作手順:

  1. プログラムをダウンロードします。

(1)プログラムを開きます。

(2)ポート番号を選択します。接続アイコンをクリックしてポート番号(AIモジュール接続後にシステムが認識したポート番号)を選択し、詳細設定で Mode-3 を選択します。

(3)矢印ボタンをクリックしてオンライン実行します。

  1. プログラムのダウンロード後、取得・認識したい物体(例えば赤い四角形)をレンズの下に置きます。

具体的な手順:

  1. 赤い物体を白枠内に移動します(中央の枠内の領域が色の取得領域です)。

  1. モジュールの「K1」キーをクリックし、緑枠を取得対象の物体に合わせて学習・認識させます(中央の枠内の領域が色の取得領域です)。

  1. 取得に成功すると緑枠が消え、赤い物体が白枠と十字で囲まれます。

​

認識する色を切り替えたい場合は、K210 モジュールを再起動して再取得してください。

  1. CanMV IDE 下部のシリアルターミナルを開き、返された色データを確認します。下図の [34,45,-4,9,-20,-6] がその色の色域範囲の値を表します。

  1. 同様の方法で緑色の物体の色域範囲を取得します。

例えば、実験テストで取得した緑色の物体の色域範囲は [23,52,-29,-9,-9,7] です。

  1. 色域範囲のパラメータ値をプログラムに入力し、単一物体の色を認識します。具体的な操作は 実験6-2 ビジョン認識 – 単一または複数物体の色の認識 を参照してください。

実験結果

CanMV IDE 下部のシリアルターミナルで、単一物体の色域範囲を取得できます。認識したい物体を置いて、色域範囲の値を取得してください。

技術サポート

資料のダウンロード・技術サポートについては、HumansX株式会社までお問い合わせください。