[关闭]
@superpigy 2023-07-25T12:57:26.000000Z 字数 5692 阅读 701

禾目AI SDK使用接口

sdk集成

应用权限

  1. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  2. <uses-permission android:name="android.permission.VIBRATE" />
  3. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  4. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.INTERNET" />
  8. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  9. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  10. <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

build.gradle(:project)

  1. maven { url 'https://jihulab.com/hamuna-sdk/aisdk/-/raw/main' }

build.gradle(:app)

  1. android{
  2. packagingOptions {
  3. exclude 'lib/armeabi-v7a/libRSSupport.so'
  4. exclude 'lib/arm64-v8a/librsjni.so'
  5. exclude 'lib/armeabi-v7a/librsjni.so'
  6. exclude 'lib/arm64-v8a/libRSSupport.so'
  7. exclude 'lib/x86/libRSSupport.so'
  8. exclude 'lib/x86/librsjni.so'
  9. exclude 'META-INF/atomicfu.kotlin_module'
  10. exclude 'lib/x86_64/libtensorflowlite_jni.so'
  11. exclude 'META-INF/library_release.kotlin_module'
  12. }
  13. configurations {
  14. all*.exclude group: 'com.google.guava', module: 'listenablefuture'
  15. }
  16. compileOptions {
  17. sourceCompatibility 1.8
  18. targetCompatibility 1.8
  19. }
  20. defaultConfig {
  21. ...
  22. minSdkVersion 24
  23. renderscriptTargetApi 18
  24. renderscriptSupportModeEnabled true
  25. ndk { abiFilters "armeabi-v7a" }
  26. }
  27. dependencies{
  28. implementation "com.hamuna.ai:android-sdk:1.0.0.41.0"
  29. }
  30. }

Project Bulid Gradle

  1. ext {
  2. var = '4.0.1'
  3. }
  4. buildscript {
  5. repositories {
  6. mavenCentral()
  7. maven { url 'https://maven.aliyun.com/repository/google' }
  8. maven { url 'https://maven.aliyun.com/repository/jcenter' }
  9. maven { url 'https://jitpack.io' }
  10. }
  11. dependencies {
  12. classpath 'com.android.tools.build:gradle:4.0.1'
  13. classpath 'com.google.ar.sceneform:plugin:1.6.0'
  14. classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
  15. classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
  16. }
  17. }
  18. allprojects {
  19. repositories {
  20. mavenCentral()
  21. maven { url 'https://maven.aliyun.com/repository/google' }
  22. maven { url 'https://maven.aliyun.com/repository/jcenter' }
  23. maven { url 'https://jitpack.io' }
  24. maven {
  25. url "https://gradle.finogeeks.club/repository/applet/"
  26. credentials {
  27. username "applet"
  28. password "123321"
  29. }
  30. }
  31. }
  32. configurations.all {
  33. resolutionStrategy {
  34. force 'com.google.android.gms:play-services-gcm:16.1.0'
  35. force 'com.google.android.gms:play-services-basement:16.2.0'
  36. force 'com.google.android.gms:play-services-auth:16.0.1'
  37. force 'com.google.firebase:firebase-messaging:18.0.0'
  38. force 'com.google.firebase:firebase-common:17.0.0'
  39. force 'com.google.firebase:firebase-iid:18.0.0'
  40. force 'com.google.android.gms:play-services-stats:16.0.1'
  41. force 'com.google.android.gms:play-services-base:16.0.1'
  42. }
  43. }
  44. }
  45. task clean(type: Delete) {
  46. delete rootProject.buildDir
  47. }

注意事项

SDK里用到了高德SDK辅助定位,请在App项目中的AndroidManifest.xml中修改相对应的key

SDK使用方法

1) 初始化SDK

  1. SDK.init({context}, {app}, {appid}, {appsecret})

2) 注册回调事件

  1. SDK.registerAiCountingListener(r -> Log.e("number>>", "onNumEnd: " + r.items.size()));

3) 启动AI点数

  1. SDK.aiCounting()

删除监听

  1. SDK.unregisterAiCountingListener()

注意事项

a) 点数完成后,SDK不会主动退出拍摄界面,开发者可以根据以下代码获取当前Activity,并手动退出当前Activity

Activity currentCameraSession = getActivity()
b) 点数时,会有一段采样的时间,采样完毕后会自动进行结束回调
c) 回调返回信息包括图片,猪坐标以及图片旋转角度信息。
d) 请打开项目的NDK支持以及Renderscript支持

脸部识别接口

初始化SDK时,需调用setHttpFaceidQueuedCallbackAddr(建库成功回调) 和 setHttpFaceidMatchedCallbackAddr(比对结果回调) 来设置脸部识别系统的HTTP回调接口

新建脸部采集(新建识别池)

  1. SDK.startNewFaceCapture(PoolInfo info)
  2. class PoolInfo{
  3. public String custom_id;
  4. public String pool_name;
  5. public Dictionary<String, String> extra;
  6. public PoolType pool_type;
  7. public bool dup_check; //是否开启重复采集检查
  8. }

从已有识别池继续采集

  1. SDK.continueFaceCapture(String pool_id)

脸部比对

  1. SDK.faceRecognition(String pool_id)

删除脸部信息

  1. SDK.faceDelete(String pool_id, String face_id)

离线队列

SDK采集采用自适应离线队列后台上传机制,无法连接上网路则自动停止上传任务,直到连接上网络为止。
  1. 获取离线队列排队数据
  2. List<CaptureInfo> offlineData = OfflineQueue.sharedQueue().Get()
  3. 暂停离线队列上传
  4. OfflineQueue.sharedQueue().Pause()
  5. 恢复离线队列上传
  6. OfflineQueue.sharedQueue().Resume()
  7. 查看离线队列是否运行
  8. OfflineQueue.sharedQueue().Running()

CaptureInfo数据结构

  1. public class BasicCaptureInfo {
  2. public String type; // 类型,比对: match 或者是 采集: capture
  3. public String pool_id; // 识别池id
  4. public String pool_type; // 识别池类型,cow, yak, sheep, pig 等等
  5. }

采集监听

  1. SDK.registerCaptureSessionListener(new SDK.CaptureSessionDoneCallback() {
  2. @Override //识别池创建
  3. public void onPoolCreated(Map<String, Object> o) {
  4. }
  5. @Override // 已入MQ的采集信息
  6. public void onCapturePrequeued(Map<String, Object> o) {
  7. }
  8. @Override //建库完成,不一定每次都能收到,以服务器回调为准
  9. public void onClaimDone(Map<String, Object> o) {
  10. /**
  11. {
  12. 'pool_id': {pool_id},
  13. 'face_id': {face_id},
  14. 'pool_type': {},
  15. 'duplicated': {True/False},
  16. 'cover_url': {cover}
  17. }
  18. **/
  19. }
  20. });

控制牛脸采集输入

  1. SDKConfigs.SetCaptureInputFeature(true/false);

脸部识别监听

  1. SDK.registerAiMatchListener(new SDK.AiFaceMatchDoneCallback() {
  2. @Override // 已入MQ的比对信息
  3. public void onAiFaceMatchPrequeued(Map<String, Object> o) {
  4. }
  5. @Override // 服务器比对完成回调,不一定每次都能收到,以服务器回调为准
  6. public void onDone(AiFaceMatchDone done) {
  7. }
  8. });

脸部比对后台回调接收数据格式
建库成功

  1. {
  2. 'face_id': face_id, //牛脸ID
  3. 'pool_id': pool_id, // 识别池ID
  4. 'type': pool['pool_type'], // 识别池类型
  5. 'info': pool['pool_info'], // 识别池信息
  6. 'duplicated': dup, // 是否为重复采集
  7. 'noncer': ranstr(5) //随机字符串
  8. }

比对成功

  1. {
  2. 'similarity': 1,
  3. 'cover': e,
  4. 'info': {
  5. 'face_id': matched['id'],
  6. 'cover': matched['cover'],
  7. 'lat': matched['loc'][1],
  8. 'lng': matched['loc'][0],
  9. 'state': matched['state'],
  10. 'entrypoint': matched['entrypoint'],
  11. 'percentage': get_cosine_similarity
  12. },
  13. 'timetag': time.time()
  14. }

未找到匹配

  1. {
  2. 'similarity': 0,
  3. 'cover': e,
  4. 'info': {},
  5. 'timetag': time.time()
  6. }

加密规则

加密协议 32BLOCK ECB + 自定义Padding
解密顺序:
1. AES ECB 解密(no padding)
2. unpad(密文)

  1. const unpad = (text) => {
  2. var t = ''
  3. var c = ord(text[text.length - 1])
  4. var l = text.length - c
  5. for(var i=0;i<l;i++){
  6. t += text[i]
  7. }
  8. return t
  9. }
  10. const ord = (text) => {
  11. var str = text + ''
  12. var code = str.charCodeAt(0)
  13. if (code >= 0xD800 && code <= 0xDBFF) {
  14. var hi = code
  15. if (str.length === 1) {
  16. return code
  17. }
  18. var low = str.charCodeAt(1)
  19. return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000
  20. }
  21. if (code >= 0xDC00 && code <= 0xDFFF) {
  22. return code
  23. }
  24. return code
  25. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注