我在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);
}
答案 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)
答案 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);
}
这现在有效。剩下的唯一问题是颜色是倒置的。关于如何再次反转它们的任何提示?