V-function

このチュートリアルはM5StickV/UnitVに適しています

機能紹介です

本チュートリアルは M5StickV/UnitV 向けの V-function を紹介します。V-function は M5Stack チームが V シリーズデバイス向けに開発した複数の視覚認識機能ファームウェアです。利用者は、異なる機能ファームウェア(オブジェクト追跡、動体検出等)を利用し、視覚認識機能を迅速に構築することができます。本チュートリアルでは、ファームウェアをデバイスに書き込み、UIFlow のグラフィカルプログラミングを利用して呼び出す方法を紹介します。

ファームウェアのシリアルポート出力ボーレートは固定の 115200 です。

ドライバーのインストール

デバイスを PC に接続し、 FTDI ドライバー をデバイスマネージャーからインストールします。Windows 10 の例として、適切なオペレーティングシステム用のドライバーファイルをダウンロードし、解凍します。その後、デバイスマネージャーを利用してインストールを実行します。(注意:一部のシステム環境下では、ドライバーが有効化されるまで 2 回のインストールが必要です。未認識のデバイス名は通常M5StackまたはUSB Serialです。Windows では、推奨のインストール方法は、デバイスマネージャー内で直接(カスタム更新)ドライバーファイルをインストールすることです。実行可能ファイルのインストール方法は正常に動作しない可能性があります)。 FTDI ドライバーをダウンロード
MacOS ユーザーは、インストール前にシステムの環境設定->安全性とプライバシー->一般->許可するアプリケーションの位置->App Storeと承認済みの開発者のオプションを選択してください。

ファームウェアの書き込み

ご使用のオペレーティングシステムに応じて、下記のボタンをクリックして適切の M5Burner ファームウェア書き込みツールをダウンロードしてください。解凍後、アプリケーションを起動します。

ソフトウェア版です ダウンロードリンクです
M5Burner_Windows Download
M5Burner_MacOS Download
M5Burner_Linux Download
注意:
MacOSユーザーはインストールが完了後、アプリケーションをApplicationフォルダ内に移動してください。下図を参考にしてください。
Linuxユーザーは解凍したファイルのパス下に移動し、ターミナルで./M5Burnerを実行してください。

左側のデバイス欄でデバイスを M5StickV/UnitV に選択し、必要な機能ファームウェアを選択してダウンロードを開始します。M5StickV/UnitV をデータケーブルを通じて PC に接続し、対応のポートを選択し、Burn をクリックして書き込みを開始します。

「Burn Successfully」とログの書き込みがあった場合、ファームウェアの書き込みが完了したことを示します。

UIFlow の参照

拡張の追加

ファームウェアが書き込まれた M5StickV/UnitV は Unit 形式のスレーブデバイスとして使用されます。したがって、利用者は他の M5 ホストデバイスと連携して操作する必要があります。UIFlow の基本操作とその他の M5 ホスト製品の使用方法は、対応製品のドキュメントページを参照してください。

https://flow.m5stack.com/ にアクセスして UIFlow を開きます。右側の機能パネルの Unit 追加ボタンをクリックし、UnitV 拡張を選択して追加します。追加時は、実際に使用するポートに応じて構成を設定してください。OK をクリックして追加を完了します。

追加が完了後、機能ブロックメニューの「Unit」オプションから、追加した機能ブロックを探し出すことができます。右側のプログラミング領域にドラッグ&ドロップして使用できます。詳細は下記のサンプルプログラムを参照してください。

注意事项

デバイス(M5StickV/UnitV)をマスターコントローラに接続後、データの取得が異常な場合は、M5StickV/UnitV を再起動してください。ファームウェア起動が成功後、再接続を試みてください。

运动目标检测

画面内の変化を検出し、検出領域内の物体の動きを判断します。

プログラムブロック紹介

  • 初期化

    • 初期化
  • 変化率阈値の設定

  • 変化率阈値を設定:変化量がこの数値以下のピクセルは、変化とみなされず、画面の変化率に含まれません。
  • 検出モードの設定

    • dynamic: 動的検出モード、設定後は連続して画像を撮影し、前後のフレームの変化を比較
  • static: 静的検出モード、設定後は基準画像を撮影して保存し、以降の画面はこの画像と比較されます。新たな基準画像を撮影する必要がある場合は、先に動的検出モードに切り替え、再度静的検出モードを設定する必要があります。

  • 画面変化率の取得

    • 画面変化率:前後のフレーム間の変化ピクセル数を取得。例えば、2 つのピクセルが変化し、ピクセル A は 27、ピクセル B は 10 の変化を示すと、該当数値は 27+10=37 です。各ピクセルの R.G.B 成分の差分を合計した数値が変化量です。
  • 最高変化率の取得

    • 最高変化率:変化最も劇烈なピクセルの変化量。
  • スキャン間隔 x 軸 y 軸の設定

    • x 軸および y 軸上のスキャン間隔を設定。
  • 境界枠の数の取得

    • 変化のピクセルから生成された境界枠の数を取得。
  • x 番号境界枠の情報の取得

    • x 番号の境界枠の詳細情報をリストで返却。境界枠内の変化ピクセル数、境界枠の x 軸座標、境界枠の y 軸座標、境界枠の幅、境界枠の高さが含まれます。

プログラム例:動的検出モードを有効にし、画面の最高変化率の数値を読み取り、画面内の物体の動きを判断。変化率の数値が予想値を超えた場合は"Moved"を表示、そうでない場合は"Not Move"を表示。画面上に現在の最高変化率の数値を表示。

動体検出 - データパケット形式

回傳 JSON

{
    "FUNC": "MOTION DETECT V1.0",
    "DIFF TOTAL": 10000, //画面变动率
    "DIFF MAX": 75, // 最高变化率
    "TOTAL": 3, //边界框数量
    "0": {
        "x": 45,
        "y": 18,
        "w": 126,
        "h": 72,
        "area": 342 //该边界框内变化像素的数量
    },
    "1": {
        "x": 0,
        "y": 169,
        "w": 130,
        "h": 24,
        "area": 173
    },
    "2": {
        "x": 39,
        "y": 204,
        "w": 276,
        "h": 34,
        "area": 141
    }
}

設定 JSON

{
    "MOTION DETECT": 1.0, //功能标记,不可缺省
    "mode": "COMPUTE_MODE_STATIC", //可缺省 "COMPUTE_MODE_STATIC" 静态检测模式 or "COMPUTE_MODE_DYNAMIC" 动态检测模式
    "thr_w": 20, //可缺省 边界框宽阈值,[3,200]
    "thr_h": 20, //可缺省 边界框长阈值,[3,200]
    "stepx": 1, //可缺省 X扫描间隔,[0, 40],设置为0则关闭边界框检测
    "stepy": 2, //可缺省 Y扫描间隔,[0, 40],设置为0则关闭边界框检测
    "delta": 20, //可缺省 变化率阈值,[0, 99]
     "merge": 10 //可缺省 边界框合并阈值,[0, 40]
}

目標追跡

追跡対象を設定し、対象物体の画面内の位置情報をリアルタイムで取得。

プログラムブロック紹介

  • 初期化

    • 初期化
  • 追跡枠の座標 x y、追跡枠の幅 高さの設定

    • 追跡対象を枠選択、該当物体の画像上の位置を設定(できるだけ色の特

程序案例:通过按键 A 设置框选目标,读取目标坐标值,用于控制屏幕上的矩形元素移动,模拟显示物体的运动轨迹。

目标追踪-数据包格式

回传 JSON

{
    "FUNC": "TARGET TRACKER V1.0",
    "x": 282,
    "y": 165,
    "w": 13,
    "h": 15
}

设置 JSON

{
    "TARGET TRACKER": " V1.0",
    "x": 282, //xywh均不可缺省
    "y": 165,
    "w": 13,
    "h": 15
}

颜色追踪

设置 LAB 颜色阈值,追踪画面中符合阈值目标,并实时获取目标对象处于画面中位置信息。

程序块介绍

  • 初始化

    • 初始化。
  • 设置目标颜色 L阈值最小 0 L阈值最大 0 A阈值最小 A阈值最大 B阈值最小 B阈值最大

    • 设置追踪的 LAB 阈值(LAB 颜色空间的颜色值,在该范围外的颜色将会被过滤)。
  • 设置扫描间隔 x 轴 y 轴

    • 设置 X 轴和 y 轴上的扫描间隔,[0, 40],设置为 0 则关闭边界框检测。
  • 设置边框合并阈值

    • 设置边界框合并阈值。
  • 设置边框宽阈值 0 高阈值 0

    • 设置边框宽阈值 0 高阈值 0。
  • 获取边框数目

    • 获取边框数目。
  • 获取边框的详情

    • 获取边框的详情,包括该边界框内变化像素的数量,边界框 x 轴坐标,边界框 y 轴坐标,边界框宽,边界框高。

设置 LAB 阈值

点击下方按钮,下载 LAB 取色工具。(目前仅支持 windows 系统)

下载 LAB 取色工具

使用手机或者是其他设备拍摄样本图片,双击打开应用,点击open-->image导入图片。

点击想要用作颜色识别的物体,记录下方生成的 LAB 数值,在 UIFlow 中配置使用。补充:拖动 LAB 数值的区间条,可以用于自定义 LAB 数值。

程序案例:设置识别的 LAB 阈值,实现颜色追踪效果,并获取被追踪对象在画面中的坐标数据,符合阈值的像素数量。

颜色追踪-数据包格式

回传 JSON

{
    "FUNC": "COLOR TRACKER V1.0",
    "TOTAL": 3, //边界框数量
    "0": {
        "x": 45,
        "y": 18,
        "w": 126,
        "h": 72,
        "area": 342 //该边界框内变化像素的数量
    },
    "1": {
        "x": 0,
        "y": 169,
        "w": 130,
        "h": 24,
        "area": 173
    },
    "2": {
        "x": 39,
        "y": 204,
        "w": 276,
        "h": 34,
        "area": 141
    }
}

设置 JSON

{
    "COLOR TRACKER": 1.0, //功能标记,不可缺省
    "thr_w": 20, //可缺省 边界框宽阈值,[3,200]
    "thr_h": 20, //可缺省 边界框长阈值,[3,200]
    "stepx": 1, //可缺省 X扫描间隔,[0, 40],设置为0则关闭边界框检测
    "stepy": 2, //可缺省 Y扫描间隔,[0, 40],设置为0则关闭边界框检测
    "merge": 10, //可缺省 边界框合并阈值,[0, 40]
    "Lmin": 0, //可缺省 L阈值下限 [0, 100]
    "Lmax": 0, //可缺省 L阈值上限 [0, 100]
    "Amin": 0, //可缺省 A阈值下限 [0, 255]
    "Amax": 0, //可缺省 A阈值上限 [0, 255]
    "Bmin": 0, //可缺省 B阈值下限 [0, 255]
    "Bmax": 0, //可缺省 B阈值上限 [0, 255]
}

顔認識

画面内の顔の情報を認識し、認識数、対象の座標、信頼レベルを返却します。

プログラムブロック紹介

  • 初期化

    • 初期化
  • 顔の数を取得

    • 認識された顔の数を読み取る
  • 第x枚の顔の詳細を取得

    • 指定番号の顔の詳細データを読み取る。返却形式はリストで、顔の選択座標、長さ、幅、信頼レベルが含まれます。

プログラム例:画面内の顔認識結果と信頼レベルを読み取る。

人脸识别-数据包格式

回传 JSON

{
   "FUNC": "FACE DETECT",  // 功能说明
   "count": 3,   // 识别到的人脸数量
   "2": {  // 人脸编号
      "x": 97,    // ROI
      "y": 26,
      "w": 64,
      "h": 86,
      "value": 0.859508,  // 置信率
       "classid": 0,
       "index": 2,
       "objnum": 3
        },
    "1": {
       "x": 70,
       "y": 157,
       "w": 38,
       "h": 63,
       "value": 0.712100,
       "classid": 0,
       "index": 1,
       "objnum": 3
       },
    "0": {
       "x": 199,
       "y": 145,
       "w": 31,
       "h": 40,
       "value": 0.859508,
       "classid": 0,
       "index": 0,
       "objnum": 3
       }
    }

二维码识别

画面内の顔の情報を認識し、認識数、対象の座標、信頼レベルを返却します。Find code

プログラムブロック紹介

  • 初始化

    • 初始化
  • 获取QR码信息

    • 读取识别到的二维码内容
  • 获取QR码版本

    • 读取识别到的二维码版本

程序案例:读取二维码信息以及版本号。

回传 JSON

{
   "count": 1,
   "FUNC": "FIND QRCODE",
   "0": {
      "x": 57,
      "y": 16,
      "w": 197,
      "h": 198,
      "payload": "m5stack",    //二维码数据
      "version": 1,    //二维码版本
      "ecc_level": 1,    //二维码ECC水平
      "mask": 2,    //二维码掩码
      "data_type": 4,    //二维码数据类型
      "eci": 0    //返回二维码的ECI。
   }
}

条形码识别

识别画面中的条形码,并返回识别结果,以及版本。使用固件Find code

程序块介绍

  • 初始化

    • 初始化
  • 获取识别到的条形码内容

    • 读取识别到的条形码内容
  • 获取识别到的条形码旋转角度

    • 读取识别到的条码旋转角度
  • 获取识别到的条形码的类别

    • 读取识别到的条码类别
  • 获取识别到的条码位置信息

    • 读取识别到的条码的框选坐标,长度宽度,返回值为列表

程序案例:案例能反映条形码信息,条形码类型,条形码旋转角度以及条形码的详细位置信息。

回传 JSON

{
    "0": {
        "x": 62,
        "y": 90,
        "w": 100,
        "h": 45,
        "payload": "123", //数据
        "type": 15, //条码类别
        "rotation": 0.000000, //条码旋转角度
        "quality": 28 //条码在图像中被扫描的次数
    },
    "count": 1,
    "FUNC": "FIND BARCODE"
}

Datamatrix 码识别

识别画面中的 Datamatrix 码,并返回识别结果,以及码旋转角度,坐标数据。使用固件Find code

程序块介绍

  • 初始化

    • 初始化
  • 获取Data Matrix码信息

    • 读取识别到的 Datamatrix 码内容
  • 获取Data Matrix码旋转角度

    • 读取识别到的 Datamatrix 码旋转角度
  • 获取Data Matrix码位置信息

    • 读取识别到的 Datamatrix 码的框选坐标,长度宽度,返回值为列表

    程序案例:案例能反映 Data Matrix 码信息,旋转角度以及其的详细位置信息。

回传 JSON

{
    "0": {
        "x": 20,
        "y": 116,
        "w": 96,
        "h": 96,
        "payload": "m5stack",
        "rotation": 1.588250, //DM码旋转角度
        "rows": 16, //DM码行数
        "columns": 16, //DM码列数
        "capacity": 12, //DM码容量(字节)
        "padding": 1 //DM码剩余容量(字节)
    },
    "count": 1,
    "FUNC": "FIND DATAMATRIX"
}

Apriltag 码识别

识别画面中的 Apriltag 码(仅支持 Tag36H11 类型),并获取其位置的偏移。使用固件Find code

程序块介绍

  • 初始化

    • 初始化
  • 获取AprilTag码旋转度数

    • 返回以弧度计的 AprilTag 的旋度(int)
  • 获取AprilTag码坐标

    • 读取识别到的 Datamatrix 码的框选坐标,中心坐标,长度宽度,返回值为列表
  • 获取AprilTag码移动单位数

    • 读取 Apriltag 码的位置偏移

程序案例:案例能反映 AprilTag 码旋转度数,移动单位数,以及 AprilTag 码的详细位置信息。

回传 JSON

{
    "0": {
        "x": 71,
        "y": 5,
        "w": 85,
        "h": 88,
        "id": 1,
        "family": 16,// AprilTag的类别
        "cx": 115,
        "cy": 49,
        "rotation": 6.219228,// 返回以弧度计的AprilTag的旋度(int)。
        "decision_margin": 0.451959,// AprilTag匹配的色饱和度(取值0.0 - 1.0),其中1.0为最佳。
        "hamming": 0,// AprilTag的可接受的数位误差数值
        "goodness": 0.000000, //AprilTag图像的色饱和度
        "x_translation": 0.868200, //旋转后将图像移动到左侧或右侧的单位数
        "y_translation": 0.245313,//旋转后将图像上移或下移的单位数
        "z_translation": -2.725188,//是通过图像缩放的量。默认情况下1.0
        "x_rotation": 3.093776,//x轴在帧缓冲器中旋转图像的度数
        "y_rotation": 0.065489,//y轴在帧缓冲器中旋转图像的度数
        "z_rotation": 6.219228 //z轴在帧缓冲器中旋转图像的度数
    },
    "count": 1,
    "FUNC": "FIND APRILTAG"
}

识别模式设置 JSON

以上多个识别码功能,均使用同一个固件Find Code实现,用户可以通过发送下方 JSON 数据,配置模式切换。


{
    "FIND CODE": 1.0,
    "mode":"DATAMATRIX" //识别模式,可选QRCODE,APRILTAG,DATAMATRIX,BARCODE
}

自定义标签识别

检测画面中的标签卡,并返回二进制序列。注:仅识别固定标签卡格式,请参考下方图片

程序块介绍

  • 初始化

    • 初始化
  • 获取当前识别到的标签卡数量

    • 当前画面识别到的标签卡数量
  • 获取识别结果的二进制字符串

    • 识别结果的二进制数据的字符串,当有多个卡片时,传入下标可选择不同的卡片内容。
  • 获取uint64_t类型的代码内容

    • uint64_t 类型的内容二进制代码,本键值最大编码 64 位(8 x 8)的 TAG。
  • 获取标签的位置信息

    • 标签卡的坐标与长宽信息
00000000      00000000
00111100      00@@@@00        @@@@
01000010      0@0000@0       @    @
01000010  ->  0@0000@0  ->   @    @
01011010      0@0@@0@0       @ @@ @
01000010      0@0000@0       @    @
01000010      0@0000@0       @    @
00000000      00000000

程序案例:识别卡片信息,并显示在屏幕上

自定义标签识别-数据包格式

回传 JSON

{
    "FUNC": "TAG READER V2.0",
    "TOTAL": 1,
    "0": {
        "x": 113,
        "y": 65,
        "w": 117,
        "h": 105,
        "p0x": 113, // p0x ~ p3y: TAG 4个顶点的坐标
        "p0y": 77,
        "p1x": 211,
        "p1y": 65,
        "p2x": 230,
        "p2y": 156,
        "p3x": 127,
        "p3y": 170,
        "rotation": 8, // TAG 的相对旋转角度
        "rows": 8, // TAG 的行数(本数值不含定位框)
        "columns": 8, // TAG 的列数(本数值不含定位框)
        "size": 64, // TAG 实际内容的数据长度,该值 = 内容的行数 * 内容的列数 = (rows) * (columns)
        "code": "0x003C42425A424200", // uint64_t类型的内容二进制代码,本键值最大编码64位(8 x 8)的TAG
        "binstr": "0000000000111100010000100100001001011010010000100100001000000000" //二进制数据的字符串形式,本键值可以编码任意长宽的TAG
    }
}

巡线

检测画面中指定的颜色线条,并返回偏移角度。

程序块介绍

  • 初始化

    • 初始化
  • 获取线条偏移角度

    • 获取线条偏移角度
  • 设置追踪目标颜色 L阈值最小 0 L阈值最大 0 A阈值最小 A阈值最大 B阈值最小 B阈值最大

    • 设置追踪的 LAB 阈值(LAB 颜色空间的颜色值,在该范围外的颜色将会被过滤)
  • 设置线条weight0区域权重,weight1区域权重,weight2区域权重

    • 设置线条区域权重:三个权重分别对应图中三个区域对角度的贡献值。比如把 weight_2 的值设置的大一些,则当转弯时角度变化将更加剧烈。

设置 LAB 阈值

参考上方颜色追踪功能中的 LAB 取色工具的使用方法,拍摄需要巡线的线条与场景,并记录下方生成的 LAB 数值,在 UIFlow 中配置使用。

程序案例:获取线条偏移角度,并显示在屏幕上

巡线-数据包格式

回传 JSON

{
    "FUNC": "LINE TRACKER V1.0",
    "angle": 3.8593475818634033 //小车转弯的角度
}

设置 JSON

{
    "LINE  TRACKER": 1.0, //功能标记,不可缺省
    "thr_w": 20, //可缺省 边界框宽阈值,[3,200]
    "thr_h": 20, //可缺省 边界框长阈值,[3,200]
    "stepx": 1, //可缺省 X扫描间隔,[0, 40],设置为0则关闭边界框检测
    "stepy": 2, //可缺省 Y扫描间隔,[0, 40],设置为0则关闭边界框检测
    "merge": 10, //可缺省 边界框合并阈值,[0, 40]
    "Lmin": 0, //可缺省 L阈值下限 [0, 100]
    "Lmax": 0, //可缺省 L阈值上限 [0, 100]
    "Amin": 0, //可缺省 A阈值下限 [0, 255]
    "Amax": 0, //可缺省 A阈值上限 [0, 255]
    "Bmin": 0, //可缺省 B阈值下限 [0, 255]
    "Bmax": 0, //可缺省 B阈值上限 [0, 255]
    "weight_0": 0.1, // 可缺省 权重
    "weight_1": 0.3, // 可缺省 权重
    "weight_2": 0.7  // 可缺省 权重
}

更多内容

Github

On This Page