本教程适用于M5StickV/UnitV
V-Function是由M5Stack团队针对V系列设备开发的多个视觉识别功能固件,基于不同的功能固件(对象追踪,移动检测等),用户能够快速的进行视觉识别的功能的搭建。本教程将向你介绍,如何烧录固件至你的设备中,并通过UIFlow图形化编程进行调用。
固件串口输出波特率固定为115200
M5Stack
或USB Serial
, Windows推荐使用驱动文件在设备管理器直接进行安装(自定义更新), 可执行文件安装方式可能无法正常工作)。
点击此处,前往下载FTDI驱动
系统偏好设置
- >安全性与隐私
- >通用
- >允许以下位置下载的App
- > App Store和认可的开发者选项
。请根据您所使用的操作系统,点击下方按钮下载相应的M5Burner固件烧录工具.解压打开应用程序。
MacOS
用户安装完成后请将应用放入Application
文件夹内,如下图所示。Linux
用户请切换至解压文件路径下,在终端中运行./M5Burner
, 运行应用。左侧设备栏选择设备为M5StickV/UnitV, 根据使用需求选择对应的功能固件, 进行下载。 将M5StickV/UnitV通过数据线连接至电脑,选择其对应的端口,点击Burn开始烧录。
当烧录日志提示Burn Successfully
时,则表示固件已经烧录完成。
烧录完功能固件的M5StickV/UnitV将作为Unit形式的从设备进行使用,因此用户需要使用其他的M5主机设备来与其交互。关于其他主控产品的UIFlow基本使用与操作,请访问其对应的产品文档页面进行获取。
访问 https://flow.m5stack.com/ 进入UIFlow。 点右侧功能面板中的Unit添加按钮,选中UnitV拓展进行添加。添加时,请根据实际使用的端口,进行配置。点击ok进行添加。
添加完成后,在功能块菜单中的Unit选项,即可找到包含的功能块。将其拖拽至右侧编程区域,即可进行使用。更多内容请查看下方案例程序。
使用将从设备(M5StickV/UnitV)连接至主控后,主控端若存在数据获取不正常情况,请重启M5StickV/UnitV。等待固件启动成功后重新尝试连接。
检测当面画面的变化情况,判断检测区域内的物体是否存在运动。
程序块介绍
初始化
设置变化率阈值
设置检测模式
获取画面变化率
获取最高变化率
设置扫描间隔x轴 y轴
获取边界框数数目
获取x号边界框信息
程序案例:启用动态检测模式,通过读取画面的最高变化率数值大小,判断画面内目标是否存在运动情况。当变化率数值大于预期值时,显示"Moved",否则显示"Not Move"。屏幕显示当前的最高变化率数值。
{
"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
}
}
{
"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设置框选目标,读取目标坐标值,用于控制屏幕上的矩形元素移动,模拟显示物体的运动轨迹。
{
"FUNC": "TARGET TRACKER V1.0",
"x": 282,
"y": 165,
"w": 13,
"h": 15
}
{
"TARGET TRACKER": " V1.0",
"x": 282, //xywh均不可缺省
"y": 165,
"w": 13,
"h": 15
}
设置LAB颜色阈值,追踪画面中符合阈值目标,并实时获取目标对象处于画面中位置信息。
程序块介绍
初始化
设置目标颜色 L阈值最小 0 L阈值最大 0 A阈值最小 A阈值最大 B阈值最小 B阈值最大
设置扫描间隔 x 轴 y 轴
设置边框合并阈值
设置边框宽阈值 0 高阈值 0
获取边框数目
获取边框的详情
点击下方按钮,下载LAB取色工具。(目前仅支持windows系统)
使用手机或者是其他设备拍摄样本图片,双击打开应用,点击open
-->image
导入图片。
点击想要用作颜色识别的物体,记录下方生成的LAB数值,在UIFlow中配置使用。补充:拖动LAB数值的区间条,可以用于自定义LAB数值。
程序案例:设置识别的LAB阈值,实现颜色追踪效果,并获取被追踪对象在画面中的坐标数据,符合阈值的像素数量。
{
"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
}
}
{
"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张人脸详情
程序案例:读取画面中人脸识别结果,以及置信率。
{
"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码版本
程序案例:读取二维码信息以及版本号。
{
"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
程序块介绍
初始化
获取识别到的条形码内容
获取识别到的条形码旋转角度
获取识别到的条形码的类别
获取识别到的条码位置信息
程序案例:案例能反映条形码信息,条形码类型,条形码旋转角度以及条形码的详细位置信息。
{
"0": {
"x": 62,
"y": 90,
"w": 100,
"h": 45,
"payload": "123", //数据
"type": 15, //条码类别
"rotation": 0.000000, //条码旋转角度
"quality": 28 //条码在图像中被扫描的次数
},
"count": 1,
"FUNC": "FIND BARCODE"
}
识别画面中的Datamatrix码,并返回识别结果,以及码旋转角度,坐标数据。使用固件Find code
程序块介绍
初始化
获取Data Matrix码信息
获取Data Matrix码旋转角度
获取Data Matrix码位置信息
程序案例:案例能反映Data Matrix码信息,旋转角度以及其的详细位置信息。
{
"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码(仅支持Tag36H11类型),并获取其位置的偏移。使用固件Find code
程序块介绍
初始化
获取AprilTag码旋转度数
获取AprilTag码坐标
获取AprilTag码移动单位数
程序案例:案例能反映AprilTag码旋转度数,移动单位数,以及AprilTag码的详细位置信息。
{
"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"
}
以上多个识别码功能,均使用同一个固件Find Code
实现,用户可以通过发送下方JSON数据,配置模式切换。
{
"FIND CODE": 1.0,
"mode":"DATAMATRIX" //识别模式,可选QRCODE,APRILTAG,DATAMATRIX,BARCODE
}
检测画面中的标签卡,并返回二进制序列。注:仅识别固定标签卡格式,请参考下方图片
程序块介绍
初始化
获取当前识别到的标签卡数量
获取识别结果的二进制字符串
获取uint64_t类型的代码内容
获取标签的位置信息
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
程序案例:识别卡片信息,并显示在屏幕上
{
"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阈值最大
设置线条weight0区域权重,weight1区域权重,weight2区域权重
参考上方颜色追踪
功能中的LAB取色工具的使用方法,拍摄需要巡线的线条与场景,并记录下方生成的LAB数值,在UIFlow中配置使用。
程序案例:获取线条偏移角度,并显示在屏幕上
{
"FUNC": "LINE TRACKER V1.0",
"angle": 3.8593475818634033 //小车转弯的角度
}
{
"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 // 可缺省 权重
}