SungemSDK-Android API

当前版本为0.2.0,支持多模型

ConnectStatus 状态参数

  • HS_OK :正常
  • HS_BUSY :队列正忙
  • HS_ERROR :通信异常
  • HS_NO_CONTEXT :没有上下文
  • HS_NO_FILE :没有索引到文件
  • HS_DEVICE_NOT_FOUND :没有找到设备
  • HS_DEVICE_OPEN_FAILED :打开设备失败
  • HS_UNSUPPORTED_GRAPH_FILE :不支持的graph文件
  • HS_NO_OPEN :调用openDevice()之前进行通信操作产生的错误

HsBaseThread

HsBaseThread继承Thread的一个子线程,负责与角蜂鸟通信,开发者可根据自己需求继承此类去作功能扩展。

构造器

  • context:上下文
  • usbDevice:在usb连接上执行回调函数openSucceed时的参数,用于初始化通信类
  • zoom : 决定获取角蜂鸟自带摄像头图像的分辨率大小,true为640*360的图像,false为1920*1080的图像

相关函数

返回值 函数名 描述
int allocateGraph(String filename) 分配卷积神经网络模型到角蜂鸟,传入文件路径
int allocateGraphByAssets(String filename) 分配卷积神经网络模型到角蜂鸟,传入文件在assets下路径
byte[] getImage(float std,float mean,int id) 获取某graph对应的原始图像
byte[] deviceGetImage() 获取设备图像
void setZoom(boolean zoom) 设置摄像头分辨率
int loadTensor(float[] data,int length,int id) 角蜂鸟加载预处理后的图像数据
int loadTensor(byte[] data,int length,int id) 角蜂鸟加载经过预处理后的数据
byte[] getResult(int id) 获取返回结果
int openDevice() 打开设备
void closeDevice() 关闭设备
  1. allocateGraph(filename):

    此函数是分配一个神经网络模型给角蜂鸟,通过加载该模型来实现某个功能

    • 参数 Parameters:
      • filename(String类型),文件的绝对路径
    • 返回 return:如果异常,则返回错误码,如果正常,则返回模型对应的id。(<0为异常)
      • HS_ERROR值为-2,表示加载失败
      • HS_UNSUPPORTED_GRAPH_FILE值为-10,表示不支持的模型文件
      • HS_NO_FILE值为-12,表示filename路径有误,没有文件
    • Example用法:
    int id=allocateGraph(Environment.getExternalStorageDirectory().getAbsolutePath() + "/hs/" + "graph_face_SSD");
    if(id<0)//异常状态
    else //graphId
    
  2. allocateGraphByAssets(filename):

    与上述方法功能相似,区别在于参数表示在android工程assets包下的文件

    • Example用法:
     int id = allocateGraphByAssets("graph_face_SSD");
    
  3. getImage(std,mean,id):

    获取处理指定graph对应的图像

    • 参数 Parameters:
      • std,mean 预处理的值,根据卷积神经网络的区别,参数的值不同,具体参照模型列表
      • id 表示获取第几个模型对应的图像
    • 返回 return:返回 byte[] ,表示该图像的原始数据

      • 如果参数zoom为true: byte[]大小为640*360*3,得到bgr的图像

      • 如果参数zoom为false: byte[]大小为1920*1080*3 rgb图像顺序排列,需要作对应转化才能显示正确,转化代码如下:

      byte[] bytes = mHsApi.getImage(STD, MEAN,0);
      int FRAME_W = 1920;
      int FRAME_H = 1080;
      byte[] bytes_rgb = new byte[FRAME_W * FRAME_H * 3];
      for (int i = 0; i < FRAME_H * FRAME_W; i++) {
      bytes_rgb[i * 3 + 2] = bytes[i];//r
      bytes_rgb[i * 3 + 1] = bytes[FRAME_W * FRAME_H + i];//g
      bytes_rgb[i * 3] = bytes[FRAME_W * FRAME_H * 2 + i];//b
      }
      opencv_core.IplImage bgrImage = opencv_core.IplImage.create(FRAME_W, FRAME_H, opencv_core.IPL_DEPTH_8U, 3);
      bgrImage.getByteBuffer().put(bytes_rgb);
      
  4. deviceGetImage():

    从设备摄像头里取出图像

    • 返回 return:返回图像byte[],表示图像的原始数据,返回值跟getImage()函数相似,此处就不具体阐述
  5. setZoom(zoom):

    设置获取角蜂鸟的图像分辨率大小,用于处理得到数据,设置图像宽高等

    • 参数 zoom(boolean类型):
      • true:设置为true,获取分辨率为640*360
      • false:设置为false,获取分辨率为1920*1080
  6. loadTensor(inputTensor,length,id):

    把外部的图像或数据经过预处理以后传送给角蜂鸟

    该方法重载,可根据开发者使用参数不同选择对应函数

    • 参数 Parameters:

      • inputTensor(float[]或byte[]类型):传送的数据
      • length(int类型):传送数据数组的大小,默认数组index从0开始
      • id(int类型):标识模型的id
    • 返回 return:返回该函数执行后状态

      • HS_ERROR:读写发生异常
      • HS_BUSY:当前设备正忙,操作失败
      • HS_OK:正常
    • Example:此处采用hello2018的示例代码

    for (int i = 1; i < 5; i++) {
        int[] ints = new int[28 * 28];
        try {
            InputStream inputStream = mActivity.getAssets().open("hello/" + i + ".jpg");
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            bitmap.getPixels(ints, 0, 28, 0, 0, 28, 28);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        float[] float_tensor = new float[28 * 28];
        for (int j = 0; j < 28 * 28; j++) {
            float_tensor[j] = Color.red(ints[j]) * 0.007843f - 1;
        }
        int status_load = mHsApi.loadTensor(float_tensor, float_tensor.length,0);
    }
    
  7. getResult(id):

    获取图像处理后的返回结果

    • 参数 Parameters:
      • id(int类型):标识模型的id
    • 基本用法 Example:
      float[] result = mHsApi.getResult(0);
    
    • 返回 return:返回float[] 根据使用神经网络不同,返回数组长度和解析也不尽相同

      • 人脸及物体检测返回结果处理:
      //结果处理
      int num = (int) floats[0];//第一个数为检测到的个数
      if (num > 0) {
        for (int i = 0; i < num; i++) {
            int type = (int) (floats[7 * (i + 1) + 1]);//类别
            int x1 = (int) (floats[7 * (i + 1) + 3] * FRAME_W);
            int y1 = (int) (floats[7 * (i + 1) + 4] * FRAME_H);
            int x2 = (int) (floats[7 * (i + 1) + 5] * FRAME_W);
            int y2 = (int) (floats[7 * (i + 1) + 6] * FRAME_H);
            int wight = x2 - x1;
            int height = y2 - y1;
            //如果有值不满足条件,这组数据干掉
            int percentage = (int) (floats[7 * (i + 1) + 2] * 100);//置信度
            if (percentage <= MIN_SCORE_PERCENT) {
              continue;
            }
            if (wight >= FRAME_W * 0.8 || height >= FRAME_H * 0.8) {
              continue;
            }
            if (x1 < 0 || x2 < 0 || y1 < 0 || y2 < 0 || wight < 0 || height < 0) {
              continue;
            }
        }
      }
      
      • 数字识别返回结果处理:返回10个float数,分别对应0-9的置信度
      • 简笔画识别返回结果处理:返回345个float值,分别对应345种物体的置信度,详情可见手绘识别文档
  8. openDevice():

    打开角蜂鸟设备,建立连接。

    • 无参数
    • 返回值:返回该命令执行后的状态
      • -4表示ConnectStatus.HS_DEVICE_NOT_FOUND,没有找到角蜂鸟设备,请确保USB线连接正常
      • -3表示ConnectStatus.HS_NO_CONTEXT,初始化线程时没有传入上下文,无法正常运行
      • -5表示ConnectStatus.HS_DEVICE_OPEN_FAILED,打开设备失败,请确保权限的开启
      • 0表示ConnectStatus.HS_OK,正常
  9. closeDevice():

    线程关闭时调用,执行操作包括:deallocate模型,关闭角蜂鸟设备等。

    • 无参数

HsDevice相关属性及函数

该类为初始化角蜂鸟设备,定义几个抽象回调函数用于各种行为处理

相关回调

返回值 函数名 描述
void openSucceed(UsbDevice usbDevice) 搜索到角蜂鸟设备,并连接成功
void openFailed() 角蜂鸟连接失败或未授予权限
void disConnected() 断开角蜂鸟连接
  1. openSucceed(usbDevice):

    打开角蜂鸟设备以后的回调函数,主要用于进行通信,比如创建角蜂鸟线程,给出提醒等

    • 参数 Parameters:
      • usbDevice: Android系统自带usb设备类
    • Example: 示例代码
    @Override
    public void openSucceed(UsbDevice usbDevice) {
        mTvTip.setVisibility(View.GONE);
        mHsThread = new FaceDetectionThread(FaceDetectorActivity.this, usbDevice, mHandler);
        mHsThread.start();
    }
    
  2. openFailed():

    打开角蜂鸟设备失败以后的回调函数,主要用于失败以后执行对应操作,比如提醒重新插拔角蜂鸟等

    • 无参数
    • Example: 部分示例代码
    @Override
    public void openFailed() {
        mTvTip.setText("请重新插拔角蜂鸟允许权限");
      }
    
  3. disConnected():

    拔掉角蜂鸟或usb接触有问题的回调函数,用于处理断开后的release操作,比如停止线程等

    • 无参数
    • Example: 部分示例代码
    @Override
    public void disConnected() {
        Toast.makeText(this, "断开连接", Toast.LENGTH_SHORT).show();
        if (mHsThread != null) {
          mHsThread.close();
        }
    }