【问题标题】:Opencv send mat from java to python with socketOpencv使用套接字将mat从java发送到python
【发布时间】: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'))。发回数据也是一个好方法,如果成功,传输是完整的。你在两台机器上都使用什么硬件和操作系统?

标签: java python opencv


【解决方案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)

【讨论】:

  • 我尝试了灰度、未更改和彩色,但仍然无法正常工作。
  • 我已经修改了我的解决方案,更简单,使用np.uint8(nparr)
【解决方案2】:

感谢大家的建议,我已将字节流替换为预定义的字节,并发现 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);
        }

现在可以了。剩下的唯一问题是颜色反转了。关于如何再次反转它们的任何提示?

【讨论】:

  • 请不要添加答案,而是更改您的原始帖子。
  • 对于反转颜色,您必须从 BRGB 转换为 BGR,请参阅上面我编辑的答案。
猜你喜欢
  • 2023-04-03
  • 2016-04-28
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-31
  • 1970-01-01
  • 2013-10-08
  • 2012-01-14
相关资源
最近更新 更多