如何将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
相关产品推荐
相关产品推荐

