我在 opencv 中找到了很多通过套接字将 mat 从 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 工作
----编辑---- 感谢大家的建议,我用预定义的字节替换了字节流,发现 Java 在发送字节时发送了一些 header ,因为它使用的是 ObjectOutputStream。
现在写入套接字的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);
}
最佳答案
尝试使用 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 图像是 RGB 的 BGR,因此您可以使用
rgb = cv2.cvtColor(frame_in_bgr, cv2.COLOR_BGR2RGB)
关于java - Opencv 使用套接字将 mat 从 java 发送到 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057631/