Opencv使用socket将mat从java发送到python

时间:2016-05-05 18:22:56

标签: java python opencv

我在opencv中发现了许多通过套接字从java发送到java或c ++的例子,但是我无法在python上使用它。

服务器代码:

MatOfByte bytemat = new MatOfByte();
    Highgui.imencode(".jpg", out, bytemat);
    byte[] bytes = bytemat.toArray();
    r.write(String.valueOf(bytes.length));
    Log.d(TAG, String.valueOf(bytes.length));
    r.write(bytes);

python代码:

def recvall(sock, count):
buf = b''
while count:
    newbuf = sock.recv(count)
    if not newbuf: return None
    buf += newbuf
    count -= len(newbuf)
return buf

length = recvall(camera_socket, 5)
if not length:
    continue
print length
data = recvall(camera_socket, int(length))
if not data:
    continue

nparr = np.fromstring(data, np.uint8)
frame = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_UNCHANGED)

window = cv2.namedWindow('frame', cv2.WINDOW_NORMAL)
cv2.imshow('frame', frame)

奇怪的是,imdecode总是返回None。我无法让它发挥作用。 PS:java客户端使用ObjectInputStream

工作

---- ---- EDIT 感谢大家的建议,我用预定义的字节替换了字节流,并发现Java在发送字节时发送了一些标头,因为它使用的是ObjectOutputStream。

现在写入socket的java代码是:

    DataOutputStream oos = null;
    try {
        oos = new DataOutputStream(os);
        oos.write(byteImage);
    } catch (Exception e) {
        Log.e(TAG, "Error while writing to OutputStream", e);
        cancel();
        setState(STATE_NONE, this.type);
    }

2 个答案:

答案 0 :(得分:1)

尝试使用np.uint8(nparr)进行转换,如下所示:

frame = np.uint8(nparr)

此示例有效:

import numpy as np
import cv2

nparr = np.zeros((512, 512))
nparr[200:300, 400:450]=255

cv2.imshow("Result", np.uint8(nparr))
cv2.waitKey()

[编辑]如果是彩色图像,请记住OpenCV2图像是BGR安装的RGB,所以你可以使用

rgb = cv2.cvtColor(frame_in_bgr, cv2.COLOR_BGR2RGB)

enter image description here

答案 1 :(得分:0)

感谢大家的建议,我用预定义的字节替换了字节流,并发现Java在发送字节时发送了一些标头,因为它使用的是ObjectOutputStream。

现在写入socket的java代码是:

DataOutputStream oos = null;
        try {
            oos = new DataOutputStream(os);
            oos.write(byteImage);
        } catch (Exception e) {
            Log.e(TAG, "Error while writing to OutputStream", e);
            cancel();
            setState(STATE_NONE, this.type);
        }

这现在有效。剩下的唯一问题是颜色是倒置的。关于如何再次反转它们的任何提示?