HarmonyOS鸿蒙Next中直接识别物体的接口有吗

HarmonyOS鸿蒙Next中直接识别物体的接口有吗 【问题描述】:我想做一个卡路里记录的app,主要特色是可以拍照识别饭菜的种类然后自动计算卡路里。测试了手机自带的小艺是可以直接识别物体的,请问是否有提供接口给我们开发者使用呢?

7 回复

开发者您好,可以参考多目标识别服务,多目标识别服务提供了从图像中识别多个目标的能力。通过拍照、录像等光学输入方式,把各种场景下的图像转化为数字图像信息,再利用AI底层能力对图像进行分析,从中定位并识别出多个感兴趣的目标对象,如人脸、动物、植物等,便于用户提取目标的类别、边框位置、置信度等信息。

目前本服务支持识别的目标类型包括:风景,动物,植物,建筑,人脸,表格,文本,人头,猫头,狗头,食物,汽车,人体,文档,卡证。

也可以参考示例中的demo:多目标识别-Core Vision Kit(基础视觉服务)-AI - 华为HarmonyOS开发者

更多关于HarmonyOS鸿蒙Next中直接识别物体的接口有吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


图片

import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
import { objectDetection, visionBase } from '@kit.CoreVisionKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';

@Entry
@Component
struct Index {
  private imageSource: image.ImageSource | undefined = undefined;
  @State chooseImage: PixelMap | undefined = undefined
  @State dataValues: string = ''

  build() {
    Column() {
      Image(this.chooseImage)
        .objectFit(ImageFit.Fill)
        .height('60%')

      Text(this.dataValues)
        .copyOption(CopyOptions.LocalDevice)
        .height('15%')
        .margin(10)
        .width('60%')

      Button('选择图片')
        .type(ButtonType.Capsule)
        .fontColor(Color.White)
        .alignSelf(ItemAlign.Center)
        .width('80%')
        .margin(10)
        .onClick(() => {
          // 拉起图库
          this.selectImage()
        })

      Button('开始多目标识别')
        .type(ButtonType.Capsule)
        .fontColor(Color.White)
        .alignSelf(ItemAlign.Center)
        .width('80%')
        .margin(10)
        .onClick(async () => {
          if(!this.chooseImage) {
            hilog.error(0x0000, 'objectDetectSample', `Failed to choose image.`);
            return;
          }
          let request: visionBase.Request = {
            inputData: { pixelMap: this.chooseImage }
          };
          try {
            let data: objectDetection.ObjectDetectionResponse =
              await (await objectDetection.ObjectDetector.create()).process(request);
            let objectJson = JSON.stringify(data);
            hilog.info(0x0000, 'objectDetectSample', `Succeeded in object detection: ${objectJson}`);
            this.dataValues = objectJson;
          } catch (error) {
            hilog.error(0x0000, 'objectDetectSample', `Failed to get result. Error: ${error}`);
          }
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }

  private async selectImage() {
    try {
      let uri = await this.openPhoto();
      if (uri === undefined) {
        hilog.error(0x0000, 'objectDetectSample', "Failed to define uri.");
        return;
      }
      this.loadImage(uri);
    } catch (err) {
      hilog.error(0x0000, 'objectDetectSample', `Failed to get photo image uri. code: ${err.code}, message: ${err.message}`);
    }
  }

  private openPhoto(): Promise<string> {
    return new Promise<string>((resolve, reject) => {
      let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
      photoPicker.select({
        MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE, maxSelectNumber: 1
      }).then(res => {
        resolve(res.photoUris[0]);
      }).catch((err: BusinessError) => {
        hilog.error(0x0000, 'objectDetectSample', `Failed to get photo image uri. code: ${err.code}, message: ${err.message}`);
        reject(err);
      })
    })
  }

  private loadImage(name: string) {
    setTimeout(async () => {
      try {
        let fileSource = await fileIo.open(name, fileIo.OpenMode.READ_ONLY);
        this.imageSource = image.createImageSource(fileSource.fd);
        this.chooseImage = await this.imageSource.createPixelMap();
        await fileIo.close(fileSource);
      } catch (error) {
        hilog.error(0x0000, 'objectDetectSample', `Failed to open file. Error: ${error}`);
      }
    }, 100)
  }
}

参考地址

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/core-vision-object-detection

AI能力:objectDetection(多目标识别)

多目标识别服务提供了从图像中识别多个目标的能力。通过拍照、录像等光学输入方式,把各种场景下的图像转化为数字图像信息,再利用AI底层能力对图像进行分析,从中定位并识别出多个感兴趣的目标对象,如人脸、动物、植物等,便于用户提取目标的类别、边框位置、置信度等信息。

目前本服务支持识别的目标类型包括:风景,动物,植物,建筑,人脸,表格,文本,人头,猫头,狗头,食物,汽车,人体,文档,卡证。

示例:

import { objectDetection, visionBase } from '@kit.CoreVisionKit';
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
let imageSource: image.ImageSource | undefined = undefined;
let chooseImage: image.PixelMap | undefined = undefined;
// 创建对象检测器
let detector: objectDetection.ObjectDetector | undefined = undefined;
async function createDetector() {
  detector = await objectDetection.ObjectDetector.create();
  hilog.info(0x0000, 'objectDetectionSample', 'Object detector created successfully');
}
@Entry
@Component
struct Page {
  build() {
    Column(){
      Button('Start').onClick(() => {
        // 将图片转换为PixelMap,可以通过图库获取
        let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
        photoPicker.select({
          MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
          maxSelectNumber: 1
        }).then((res: photoAccessHelper.PhotoSelectResult) => {
          let uri = res.photoUris[0];
          if (uri === undefined) {
            hilog.info(0x0000, 'objectDetectionSample', 'uri is undefined');
            return
          }
          setTimeout(async () => {
            let file = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY);
            imageSource = image.createImageSource(file.fd);
            chooseImage = await imageSource.createPixelMap();
            hilog.info(0x0000, 'objectDetectionSample', 'chooseImage:', chooseImage);
            if (!chooseImage) {
              return
            }
            // 创建检测器
            await createDetector();
            if (!detector) {
              hilog.error(0x0000, 'objectDetectionSample', 'Detector is not initialized');
              return;
            }
            // 调用对象检测接口
            let request: visionBase.Request = {
              inputData: { pixelMap: chooseImage },
              scene: visionBase.SceneMode.FOREGROUND
            };
            let response: objectDetection.ObjectDetectionResponse = await detector.process(request);
            if (response.objects.length === 0) {
              hilog.info(0x0000, 'objectDetectionSample', 'No objects detected in the image.');
            } else {
              let objectString = JSON.stringify(response.objects);
              hilog.info(0x0000, 'objectDetectionSample', 'Detected objects: ' + objectString);
            }
            // 清理资源
            if (chooseImage && imageSource) {
              chooseImage.release();
              imageSource.release();
            }
            if (file) {
              try {
                await fileIo.close(file);
              } catch (err) {
                hilog.error(0x0000, 'objectDetectionSample', `Failed to close fileSource. Code: ${err.code},message: ${err.message}`);
              }
            }
            if (detector) {
              await detector.destroy();
              hilog.info(0x0000, 'objectDetectionSample', 'Object detector destroyed successfully');
            }
          }, 100);
        }).catch((err: BusinessError) => {
          hilog.error(0x0000, 'objectDetectionSample', `Failed to get photo image uri. code: ${err.code},message: ${err.message}`);
        });
      })
    }
  }
}

但是无法实现你所说的计算卡路里功能。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

没有。小艺的是联网的,应该不会开放。 有识别物体类别的,但只有大类: https://developer.huawei.com/consumer/cn/doc/harmonyos-references/core-vision-object-detection-api

HarmonyOS Next物体识别能力

HarmonyOS Next提供物体识别能力,主要通过AI框架的计算机视觉套件实现,支持对多种常见物体进行识别和分类。

主要特性

  • 设备端AI计算:基于设备端AI计算,无需依赖网络连接。
  • API接口支持:开发者可调用相应的API接口获取识别结果。

使用方式

具体接口定义和调用方式需查阅HarmonyOS官方API参考文档中“图像识别”或“计算机视觉”相关章节。

目前HarmonyOS Next暂未提供直接的通用物体识别接口。小艺的识别能力属于系统级功能,未开放给第三方应用调用。

建议考虑以下替代方案:

  1. 集成第三方AI服务:可接入百度AI、阿里云、华为云等提供的图像识别API,这些平台通常有食物识别专项服务。
  2. 使用设备本地AI能力:通过HarmonyOS的AI框架调用设备NPU,但需要自行训练或转换食物识别模型。
  3. 结合多模态输入:可配合文字输入、手动选择等方式作为补充交互方案。

若未来HarmonyOS开放相关视觉能力接口,通常会通过ArkTS/ArkUI的API形式提供,建议关注官方文档的更新。

回到顶部