如何将opencv Mat转换为numpy.ndarray?

时间:2019-08-24 21:56:30

标签: python numpy-ndarray chaquopy

我有一个用Java(android)编写的代码,可以打开手机的摄像头并显示框架。下面的代码代表了我们可以检索帧的方法。该项目使用Chaquopy解释python代码。

 @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        mRgba = inputFrame.rgba();
        Python py = Python.getInstance();

        PyObject pym = (PyObject) 
        py.getModule("MyPythonClass").callAttr("call",mRgba);

        return mRgba;
    }

python代码用于检索框架(由“ mRgba”表示,它是java代码中的Mat),以作进一步处理 问题是找到一种解决方案,将该Mat转换为可由python代码解释的类型:

def call(frame):

    im = imutils.resize(frame, width=min(300, frame.shape[1]))

“帧”应该是由Java代码检索并发送到函数“调用”的Mat。

1 个答案:

答案 0 :(得分:1)

我通过将Mat转换为Java端的byteArray找到了解决方案

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        byteArray = byteArrayOutputStream .toByteArray();

并且在python端,将检索到的byteArray转换为PIL图像,然后转换为numpy数组:

def call(imp):

    pic = Image.open(io.BytesIO(bytes(imp)))
    open_cv_image = np.array(pic)
    # Convert RGB to BGR
    frame = open_cv_image[:, :, ::-1].copy()
    im = imutils.resize(frame, width=min(300, frame.shape[1]))

希望有帮助。