HarmonyOS NDK 中的 opencv cv::mat 格式数据如何转为 ArkTS 正确解析的 pixelMap 图片数据

在分割模型算法中,推断的结果数据,通过 opencv 处理后得到一个 cv::mat 格式的数据,如何将该数据转为HarmonyOS平台的图片格式的数据?

HarmonyOS
2024-08-13 15:58:06
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get

napi接受及转换,可以参考NDK开发部分 :https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/napi-data-types-interfaces-V5,JS和C++相互调用ArrayBuffer

具体实现如下Native侧接受传入的 ArkTS Array。

static napi_value TS2NAPI(napi_env env, napi_callback_info info) 
{ 
  // 获取TS层传来的参数 
  size_t argc = 1; 
  napi_value args; 
  napi_get_cb_info(env, info, &argc, &args, NULL, NULL); 
  napi_value input_array = args; 
  // 获取传入数组typedarray生成input_buffer 
  napi_typedarray_type type;// 数据类型 
  napi_value input_buffer; 
  size_t byte_offset;//数据偏移 
  size_t i, length;//数据字节大小 
  napi_get_typedarray_info(env, input_array, &type, &length, NULL, &input_buffer, &byte_offset); 
  // 获取数组数据z 
  void *data; 
  size_t byte_length; 
  napi_get_arraybuffer_info(env, input_buffer, &data, &byte_length); 
  if (type == napi_int32_array) { 
    int32_t *data_bytes = (int32_t *)(data); 
    for (i = 0; i < length/sizeof(int32_t); i++) { 
      OH_LOG_INFO(LOG_APP, "TS2NAPI: C++ %{public}d", *((int32_t *)(data_bytes) + i)); 
    } 
  } 
  return NULL; 
} 
TS侧 接收 Native侧返回的Array 
// NAPI层 array 传到TS层 
static napi_value NAPI2TS(napi_env env, napi_callback_info info) 
{ 
  // 数据个数 
  int num = 10; 
  // 创建output_buffer 
  napi_value output_buffer; 
  void *output_ptr = NULL; 
  napi_create_arraybuffer(env, num * sizeof(int32_t), &output_ptr, &output_buffer); 
  // output_array 
  napi_value output_array; 
  napi_create_typedarray(env, napi_int32_array, num, output_buffer, 0, &output_array); 
  // 给output_ptr、output_buffer赋值 
  int32_t * output_bytes = (int32_t *)output_ptr; 
  for (int32_t i = 0; i < num; i++) { 
  output_bytes[i] = i; 
} 
  for (int32_t i = 0; i < num; i++) { 
  OH_LOG_INFO(LOG_APP, "NAPI2TS: C++ %{public}d", *((int32_t *)(output_ptr) + i)); 
} 
  return output_array; 
}

TS 获取 Native 层回调的Object 值Native 层创建Object,通过ArkTS 传入的callback,并将Object回调给ArkTS具体实现如下:

let da:Record<string, number> = testNapi.CallbackToArkTs((value:object)=> 
{ 
  let data:Record<string, number> = value as Record<string, number>; 
  console.info("修改前type: " + data["type"].toString()) 
  console.info(JSON.stringify(value)) 
  data["type"] += 10 
  return value; 
}); 
console.info(JSON.stringify(da))

C++ 侧接收ArkTS 传入的 callback。

static bool Napi_AddPropertyInt32(napi_env env, napi_value obj, const char *key, int32_t value) { 
  napi_value key_napi = nullptr; 
  napi_status status = napi_create_string_utf8(env, key, NAPI_AUTO_LENGTH, &key_napi); 
  napi_value value_napi = nullptr; 
  status = napi_create_int32(env, value, &value_napi); 
  status = napi_set_property(env, obj, key_napi, value_napi); 
  return true; 
} 
static napi_value CallbackToArkTs(napi_env env, napi_callback_info info) { 
  // 获取ArkTS参数 
  size_t argc = 1; 
  napi_value js_cb = nullptr; 
  napi_get_cb_info(env, info, &argc, &js_cb, nullptr, nullptr); 
  // native回调到ts层的object 
  napi_value argv = nullptr; 
  napi_create_object(env, &argv); 
  Napi_AddPropertyInt32(env, argv, "type", 1); 
  Napi_AddPropertyInt32(env, argv, "index", 2); 
  // native回调到ts层 
  napi_value result = nullptr; 
  napi_call_function(env, NULL, js_cb, 1, &argv, &result); 
  // 获取ts修改后的object 
  napi_value typeNumber = nullptr; 
  napi_get_named_property(env, result, "type", &typeNumber); 
  int32_t number; 
  napi_get_value_int32(env, typeNumber, &number); 
  OH_LOG_INFO(LOG_APP, "修改后type: %{public}d", number); 
  // 返回修改后的object 
  return result; 
}
分享
微博
QQ
微信
回复
2024-08-13 21:25:13
相关问题
OH_ImageNative转为cv::Mat
222浏览 • 1回复 待解决
arkTS判断传入邮箱格式是否正确
443浏览 • 1回复 待解决
如何PixelMap数据存储到数据
1775浏览 • 1回复 待解决
ets如何图片转为byte[]?
3118浏览 • 1回复 待解决
如何对JSON数据进行解析优化
669浏览 • 1回复 待解决
解析和操作ASN.1数据工具
1185浏览 • 1回复 待解决
PixelMap数据处理(Native)
1106浏览 • 1回复 待解决