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

标签 java python opencv

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

相关文章:

java - 无法读取 XMLFile,异常 : java. io.FileNotFoundException : C:\Temp\logger. dtd(系统找不到指定的文件)

java - 使用线程执行完成返回的值填充 Spring 模型属性

c++ - Trackbar 结果没有出现 C++/Opencv

image-processing - 如何使用 OpenCV 查找图像上一个点与另一个点的坐标

c++ - OpenCV - 来自手机摄像头的 FPS 不正确

java - 嵌套迭代 thymeleaf

java - 我在通过接口(interface)传递数据时遇到问题

python - Django 在模板中显示列表的内容

python - 如何简单地覆盖被替换元素的列表

Python 的每个循环不起作用