[英]Sending a Mat object over socket from Java to Java
我了解 Java 上的套接字并通过它发送 Int、String、bytes 等。
我只想知道有没有办法将 Mat 对象解码为字节数组,然后通过 java 套接字发送它,然后从接收到的字节中检索 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.