我正在运行一个安卓相机应用程序,我想用 Python 进行图像处理。为了测试这一点,我想将单个图像帧传递给 python 函数,使用整数除法将所有值除以 2 并返回结果。
为此,我有以下代码:
在 Java 中:
public void onCapturedImage(Image image)
{
Image.Plane[] tmp = image.getPlanes();
byte[] bytes = null;
ByteBuffer buffer = tmp[0].getBuffer();
buffer.rewind();
bytes = new byte[buffer.remaining()];
buffer.get(bytes, 0, buffer.remaining());
buffer.rewind();
Log.d(TAG, "start python section");
// assume python.start() is elsewhere
Python py = Python.getInstance();
PyObject array1 = PyObject.fromJava(bytes);
Log.d(TAG, "get python module");
PyObject py_module = py.getModule("mymod");
Log.d(TAG, "call pic func");
byte [] result = py_module.callAttr("pic_func", array1).toJava(byte[].class);
// compare the values at some random location to see make sure result is as expected
Log.d(TAG, "Compare: "+Byte.toString(bytes[33]) + " and " + Byte.toString(result[33]));
Log.d(TAG,"DONE");
}
在python中,我有以下内容:
import numpy as np
def pic_func(o):
a = np.array(o)
b = a//2
return b.tobytes()
我对这段代码有几个问题。
它的行为不像预期的那样 - 位置 33 的值不是一半。我可能混淆了字节值,但我不确定到底发生了什么。没有“tobytes”并使用 python 列表而不是 numpy 数组的相同代码确实可以按预期工作。
传递参数 - 不确定幕后会发生什么。它是按值传递还是按引用传递?是数组被复制,还是只是一个指针被传递?
它很慢。计算超过 1200 万个值的操作大约需要 90 秒。关于加快速度的任何指示?
谢谢!