【发布时间】:2016-08-31 15:45:26
【问题描述】:
我在 opencv 中找到了许多通过套接字从 java 到 java 或 c++ 发送 mat 的示例,但我无法让它在 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工作
----编辑---- 感谢大家的建议,我已经用预定义的字节替换了字节流,并发现 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);
}
【问题讨论】:
-
您的错误信息是什么?发送前后是否对比过文件大小,确定发送成功并完成?
-
没有错误信息,传输的字节数是一样的。我真的不知道怎么调试这个东西
-
你能把imdecode的结果写到一个文件里和我们分享一下吗? java中的imdecode可以处理那个文件吗?
-
imdecode 在 python 中返回 None。我能尝试的最好的方法是发回字节并在java中使用imdecode,但我怀疑它会起作用。传输的字节数相同
-
您可以腌制“数据”并与我们分享:
pickle.dump(data, open('data_file.p', 'w'))。发回数据也是一个好方法,如果成功,传输是完整的。你在两台机器上都使用什么硬件和操作系统?