I have a code written in java (android) that open the camera of the phone and show frames. The below code represents the method in which we can retrieve frames. The project used Chaquopy to interpret python code.
@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;
}
The python code is used to retrieve the frame (represented by "mRgba" which is a Mat in the java code) for further treatment The problem is to find a solution to convert this Mat into a type that could be interpreted by python code :
def call(frame):
im = imutils.resize(frame, width=min(300, frame.shape[1]))
"frame" is supposed to be the Mat retrieved by the java code and sent to the function "call"
I found a solution by transforming the Mat into a byteArray in the java side
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byteArray = byteArrayOutputStream .toByteArray();
and in the python side the byteArray retrieved is transformed into a PIL image and then to a numpy array :
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]))
Hope that could help.
来源:https://stackoverflow.com/questions/57641801/how-to-convert-an-opencv-mat-into-a-numpy-ndarray