目标检测(ObjectDetector)使用指导:找出物体并在画布上画框

« 返回

机器学习套件(ML Kit)组件在在线版和教育版中提供,离线版(含机房版)不包含。

暂未开放:该组件暂未上架组件面板,本页保留供了解(原因与恢复进度见 组件参考)。

它能做什么

目标检测找出图片里有哪些物体,并给出每个物体的位置矩形框。可以只找最显眼的一个,也可以找出多个;可选同时给出粗分类(时尚商品、食物、家居用品、地点、植物 5 大类)。先触发一次汇总事件,再逐个物体触发一次,方便画框。

准备工作

  • 多个物体 / 分类:两个开关都打开最全;都关最快。要细分类别请用「自定义目标检测」。
  • 画框换算:坐标是原图像素,在画布上画要乘以「画布宽度 ÷ 原图宽度」。
  • 联机调试:安卓上用 AI 伴侣调试需要安装 MLKit 版 AI 伴侣(应用宝,包名 cn.fun123.appinventor);普通版伴侣不含识别引擎,调用时会触发「屏幕.出现错误时」(错误码 4722)。直接打包 APK 安装测试不受影响。
  • 安装包体积:只有用到本组件的 App 才会打包它的识别引擎与模型,体积以编译结果为准。
  • 鸿蒙:完整支持图片检测:调用系统目标检测;类别名为鸿蒙系统的类别(Animal、Plant、Food、Car、Person 等);实时摄像头检测暂不支持,「打开实时摄像头」会触发「检测失败时」。

案例一:检测并统计物体

画布背景设成原图,检测汇总事件里记下换算比例:

global 横向比例 = 1
global 纵向比例 = 1
procedure 检测(路径) {
  画布_结果.BackgroundImage = 路径
  画布_结果.Clear()
  目标检测1.DetectFromFile(路径)
}
when 图像选择器_相册.AfterPicking() { 检测(图像选择器_相册.Selection) }
when 目标检测1.GotObjects(数量, 图片宽度, 图片高度, 结果JSON) {
  横向比例 = 画布_结果.Width / 图片宽度
  纵向比例 = 画布_结果.Height / 图片高度
  标签_状态.Text = join("找到 ", 数量, " 个物体")
}

案例二:逐个物体画框并编号

每个物体触发一次「获得物体」,按比例画出四条边和编号:

when 目标检测1.GotObject(索引, x坐标, y坐标, 宽度, 高度, 标签文字, 置信度, 跟踪编号) {
  var 左 = x坐标 * 横向比例
  var 上 = y坐标 * 纵向比例
  var 右 = (x坐标 + 宽度) * 横向比例
  var 下 = (y坐标 + 高度) * 纵向比例
  画布_结果.DrawLine(左, 上, 右, 上)
  画布_结果.DrawLine(右, 上, 右, 下)
  画布_结果.DrawLine(右, 下, 左, 下)
  画布_结果.DrawLine(左, 下, 左, 上)
  画布_结果.DrawText(join(索引), 左 + 6, 上 + 24)
}

案例三:打开摄像头实时检测,物体带跟踪编号

实时检测用的是视频流模式:更快,而且同一个物体在连续画面里保持同一个「跟踪编号」,适合计数、跟随。画面上直接框出物体并标出类别,不用自己在画布上画;事件里只刷新列表:

when 按钮_实时.Click() {
  目标检测1.PreviewContainer = 垂直布局_预览
  目标检测1.StartLiveCamera()
}
when 按钮_停止.Click() { 目标检测1.StopLiveCamera() }
when 目标检测1.LiveObjects(数量, 图片宽度, 图片高度, 结果JSON) {
  var 名单 = list()
  foreach 物体 in Web客户端1.JsonTextDecodeWithDictionaries(结果JSON) {
    var 标签表 = dictget(物体, "labels", list())
    var 类别 = "(未分类)"
    if length(标签表) > 0 {
      类别 = dictget(select(标签表, 1), "label", "")
    }
    listAdd(名单, join("#", dictget(物体, "trackingId", -1), " ", 类别))
  }
  标签_状态.Text = join("实时:", 数量, " 个物体")
  列表显示框_物体.Elements = 名单
}

结果数据说明

「获得物体」的序号从 1 开始;不分类时「标签文字」为空、置信度为 0;单张图片没有跟踪,「跟踪编号」为 -1。「结果JSON」是数组,每项含 bounds(left/top/right/bottom/width/height)、trackingId、labels。

常见问题

现象 原因与处理
框画歪了 画布宽高比与原图不同会拉伸;横纵分别按比例换算即可对上
类别不准 基础模型只有 5 大类;细分类用「自定义目标检测」
只找到一个 「多个物体」被关掉了
实时预览黑屏、看不到画面 「预览容器」要选布局组件并给明确宽高(如宽度充满、高度 300 像素);第一次打开要允许摄像头权限
实时检测时界面卡 调大「实时事件间隔」,事件里少做事;画面上的标注不受间隔影响

完整 .aia 源码与操作指导

下载 .aia 源码

导入 ObjectDetectorDemo.aia 后可以直接打包 APK 运行;用 AI 伴侣联机调试请安装 MLKit 版 AI 伴侣。源码文件已通过正式编辑器载入、后台导入和 APK 编译校验;真机识别效果请以实际设备为准。

功能 操作 预期结果
检测照片 选一张有几样东西的照片 画布上画出编号框,列表列出类别和置信度
只找一个 取消「多个物体」再检测 只画出最显眼的一个框
不分类 取消「给出类别」再检测 只有位置框,列表显示「未分类」
实时检测 点「实时检测」,对准桌上的东西 预览区直接框出物体,列表按跟踪编号实时刷新

案例界面与积木源码在仓库 docs/markdown/reference/components/guide/examples/ObjectDetectorDemo/,SHA-256:602d657931ac089cbd3b47cbb60b6690a36b5f4b63cc3497170abb99cb2e2cc4。

文档反馈