java - 如何在 Java 中序列化/反序列化 OpenCv Mat?
问题描述
我想序列化 OpenCv Mat(https://docs.opencv.org/3.4.3/javadoc/index.html)以保存在 Preference 中(https://developer.android.com/reference/android/preference/Preference)然后反序列化它。
下面是我如何序列化它。
Mat cameraMatrix = {put some Mat value here};
Gson gson = new Gson();
String json;
// serialize
json = gson.toJson(Double.toString(cameraMatrix));
// deserialize
cameraMatrix = gson.fromJson(json, Mat.class);
不幸的是,它不能作为 Java Mat 存储 nativeObject 而不是真正的 Mat 值。
如何在 Java 中序列化和反序列化 Mat?
解决方案
我让它适用于我的用例。这是序列化/反序列化类。我使用这里的表格作为参考。http://ninghang.blogspot.com/2012/11/list-of-mat-type-in-opencv.html
import com.google.gson.Gson;
import org.opencv.core.Mat;
class CommonUtility
{
// Serialization/deserialization utility
public static String SerializeFromMat(Mat mat)
{
SerializedMat serializedMat = new SerializedMat();
serializedMat.setType(mat.type());
serializedMat.setRows(mat.rows());
serializedMat.setCols(mat.cols());
if (serializedMat.getType()==0||
serializedMat.getType()==8||
serializedMat.getType()==16||
serializedMat.getType()==24)
{
serializedMat.setBytes(new byte[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.bytes);
}
else if (serializedMat.getType()==1||
serializedMat.getType()==9||
serializedMat.getType()==17||
serializedMat.getType()==25)
{
serializedMat.setBytes(new byte[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.bytes);
}
else if (serializedMat.getType()==2||
serializedMat.getType()==10||
serializedMat.getType()==18||
serializedMat.getType()==26)
{
serializedMat.setShorts(new short[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.shorts);
}
else if (serializedMat.getType()==3||
serializedMat.getType()==11||
serializedMat.getType()==19||
serializedMat.getType()==27)
{
serializedMat.setShorts(new short[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.shorts);
}
else if (serializedMat.getType()==4||
serializedMat.getType()==12||
serializedMat.getType()==20||
serializedMat.getType()==28)
{
serializedMat.setInts(new int[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.ints);
}
else if (serializedMat.getType()==5||
serializedMat.getType()==13||
serializedMat.getType()==21||
serializedMat.getType()==29)
{
serializedMat.setFloats(new float[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.floats);
}
else if (serializedMat.getType()==6||
serializedMat.getType()==14||
serializedMat.getType()==22||
serializedMat.getType()==30)
{
serializedMat.setDoubles(new double[(int)(mat.total()*mat.elemSize())]);
mat.get(0,0,serializedMat.doubles);
}
Gson gson = new Gson();
return gson.toJson(serializedMat);
}
public static Mat DeserializeToMat(String json)
{
Gson gson = new Gson();
SerializedMat serializedMat = gson.fromJson(json, SerializedMat.class);
Mat mat = new Mat(serializedMat.getRows(),serializedMat.getCols(),serializedMat.getType());
if (serializedMat.getType()==0||
serializedMat.getType()==8||
serializedMat.getType()==16||
serializedMat.getType()==24)
{
mat.put(0,0,serializedMat.getBytes());
}
else if (serializedMat.getType()==1||
serializedMat.getType()==9||
serializedMat.getType()==17||
serializedMat.getType()==25)
{
mat.put(0,0,serializedMat.getBytes());
}
else if (serializedMat.getType()==2||
serializedMat.getType()==10||
serializedMat.getType()==18||
serializedMat.getType()==26)
{
mat.put(0,0,serializedMat.getShorts());
}
else if (serializedMat.getType()==3||
serializedMat.getType()==11||
serializedMat.getType()==19||
serializedMat.getType()==27)
{
mat.put(0,0,serializedMat.getShorts());
}
else if (serializedMat.getType()==4||
serializedMat.getType()==12||
serializedMat.getType()==20||
serializedMat.getType()==28)
{
mat.put(0,0,serializedMat.getInts());
}
else if (serializedMat.getType()==5||
serializedMat.getType()==13||
serializedMat.getType()==21||
serializedMat.getType()==29)
{
mat.put(0,0,serializedMat.getFloats());
}
else if (serializedMat.getType()==6||
serializedMat.getType()==14||
serializedMat.getType()==22||
serializedMat.getType()==30)
{
mat.put(0,0,serializedMat.getDoubles());
}
return mat;
}
private static class SerializedMat
{
byte[] bytes;
short[] shorts;
int[] ints;
float[] floats;
double[] doubles;
int type;
int rows;
int cols;
byte[] getBytes()
{
return bytes;
}
void setBytes(byte[] bytes)
{
this.bytes = bytes;
}
short[] getShorts()
{
return shorts;
}
void setShorts(short[] shorts)
{
this.shorts = shorts;
}
int[] getInts()
{
return ints;
}
void setInts(int[] ints)
{
this.ints = ints;
}
float[] getFloats()
{
return floats;
}
void setFloats(float[] floats)
{
this.floats = floats;
}
double[] getDoubles()
{
return doubles;
}
void setDoubles(double[] doubles)
{
this.doubles = doubles;
}
int getType()
{
return type;
}
void setType(int type)
{
this.type = type;
}
int getRows()
{
return rows;
}
void setRows(int rows)
{
this.rows = rows;
}
int getCols()
{
return cols;
}
void setCols(int cols)
{
this.cols = cols;
}
SerializedMat()
{
}
}
}
推荐阅读
- python - 如何消除时区规范?
- python - 如何根据值将列表元素添加或减去变量?
- python - 了解 Python 基本的多处理速度
- python - 在 numpy 中,如何使用索引列表从二维数组的第二维进行切片?
- java - Drools 无法从静态函数返回地图
- amazon-web-services - 如何将数据从数据库传输到同一个 Redshift 集群中的另一个数据库?
- javascript - 如何遍历一个类并识别具有特定类列表属性的每个元素
- javascript - 从 angularjs 下拉列表中删除空白选项
- azure - Azure 函数失败然后工作
- android - 无法解析符号“opcfoundation”