gpt4 book ai didi

java - Opencv 使用套接字将 mat 从 java 发送到 python

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:41 24 4
gpt4 key购买 nike

我在 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)

enter image description here

关于java - Opencv 使用套接字将 mat 从 java 发送到 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com