繁体   English   中英

通过套接字从 Java 向 Java 发送 Mat 对象

[英]Sending a Mat object over socket from Java to Java

我了解 Java 上的套接字并通过它发送 Int、String、bytes 等。

我只想知道有没有办法将 Mat 对象解码为字节数组,然后通过 java 套接字发送它,然后从接收到的字节中检索 Mat 对象?

到目前为止,这就是我所做的

用于通过套接字发送 Mat

//Sending Mat over Socket

Mat socketmat;      
long  nbytes = socketmat.total() * socketmat.elemSize();
byte[] bytes = new byte[ (int) nbytes ];
socketmat.get(0, 0,bytes);
mybytearray = bytes;

dos = new DataOutputStream(os);
dos.writeLong(nbytes);
dos.write(mybytearray, 0, mybytearray.length);  

dos.flush(); 

用于通过插座接收垫

//Receiving Mat over Socket

long len = clientData.readLong();  
byte[] data = new byte[ (int) len];
if (len > 0) {
    clientData.readFully(data);
}            
byte[] bytes_ = data;
result_mat.get(0, 0, bytes_ );

我认为是使用JNI的FileStorage类保存Mat。

以下代码可用于将Mat保存为文件存储

FileStorage storage("image.xml", FileStorage::WRITE);
storage << "img" << mat;
storage.release();

然后使用套接字发送文件,然后从文件中取回Mat。

FileStorage fs("image.xml", FileStorage::READ);
Mat img;
fs >> img;

正如其他指出的那样, 您可以使用Serialization解决问题 您应该让Mat类实现Serializable接口。

接下来,无需将您的对象手动转换为字节,您只需将流包装在ObjectOutputStream即可直接编写对象

ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject(mat);

在接收时,您可以以相同的方式提取对象。

ObjectInputStream ois = new ObjectInputStream(inputStream);
Mat mat = (Mat)(ois.readObject());

您可以使用更灵活的基于XML的通信来代替上述内容,而不必使用byte进行通信。 您可以让Java使用JAXB (用于Xml绑定的Java体系结构)为您创建XML,这非常简单,并且在方式上也非常类似于序列化。

// for sender
JAXBContext jc = JAXBContext.newInstance(Mat.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(mat, outputStream);

// for receiver
JAXBContext jc = JAXBContext.newInstance(Mat.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Mat mat = unmarshaller.unmarshal(inputStream);

在您的情况下,您的对象具有本机引用 但是对于这个问题,有一个简单的解决方案。 通过创建包装器类来打破本机界限

import java.io.Serializable;

public class MatWrapper implements Serializable {
    int rows;
    int cols;
    int type;
    byte[] data;

    public MatWrapper() {
    }

    public MatWrapper(Mat mat)
    {
        if (mat.isContinuous()) {

            int elemSize = (int) mat.elemSize();
            rows = mat.rows();
            cols = mat.cols();
            type = mat.type();

            data = new byte[cols * rows * elemSize];
            mat.get(0, 0, data);
        }
    }

    public Mat toMat()
    {
        Mat mat = new Mat(rows, cols, type);
        mat.put(0, 0, data);
        return mat;
    }
}

用法:

// convert Mat object to a wrapper object
MatWrapper wrapper = new MatWrapper(mat);

// this wrapper object is serializable

// next on receiver-side
MatWrapper wrapper = (MatWrapper)(ois.readObject);
Mat mat = wrapper.toMat();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM