You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ArrayList<PyObject>转换为ArrayList<Scalar>?Chaquopy整合场景

解决Chaquopy中Python返回List转Java ArrayList的问题

核心思路

Python返回的嵌套List在Java端是以List<PyObject>形式存在的,每个子列表也是PyObject,无法直接转为Scalar对象。需要手动遍历每个子列表,提取内部的int值,再实例化Scalar并添加到目标集合中。

代码实现(以OpenCV的Scalar为例)

假设你使用的是OpenCV的org.opencv.core.Scalar,可以按以下方式转换:

ArrayList<Scalar> scalar_list = new ArrayList<>();
Python py = Python.getInstance();
List<PyObject> obj = py.getModule("detect").callAttr("main", image).asList();

// 遍历每个Python返回的子列表
for (PyObject subPyList : obj) {
    // 将Python子列表转为Java的Integer列表
    List<Integer> intList = subPyList.toJava(List.class);
    // 提取三个int值并构造Scalar(Scalar构造参数为double,int会自动转换)
    Scalar scalar = new Scalar(intList.get(0), intList.get(1), intList.get(2));
    scalar_list.add(scalar);
}

备选方案(手动提取元素)

如果toJava(List.class)转换失败,可以手动遍历子列表的每个元素:

ArrayList<Scalar> scalar_list = new ArrayList<>();
Python py = Python.getInstance();
List<PyObject> obj = py.getModule("detect").callAttr("main", image).asList();

for (PyObject subPyList : obj) {
    List<PyObject> pySubElements = subPyList.asList();
    // 逐个提取int值
    int v0 = pySubElements.get(0).toJava(Integer.class);
    int v1 = pySubElements.get(1).toJava(Integer.class);
    int v2 = pySubElements.get(2).toJava(Integer.class);
    // 构造Scalar并添加到集合
    scalar_list.add(new Scalar(v0, v1, v2));
}

注意事项

  • 如果你的Scalar是自定义类,只需替换对应的构造方法即可,确保传入的参数类型与构造方法匹配。
  • 确保Python返回的每个子列表都严格包含3个int元素,避免索引越界异常。

内容的提问来源于stack exchange,提问作者user20459881

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:16:10