我正在尝试将我的android相机(Android.media.Image,YUV格式,1920 * 1080)捕获的图像转换为openCV Mat。 为此,我必须将Image对象转换为字节数组,然后用此数组提供我的opencv Mat。
它起作用了,但看来我的opencv Mat只有一个通道而不是3个通道。你知道它从哪里来吗?
private byte[] convertYuvToByteArray(Image image){
Image.Plane Y = image.getPlanes()[0];
Image.Plane U = image.getPlanes()[1];
Image.Plane V = image.getPlanes()[2];
int Yb = Y.getBuffer().remaining();
int Ub = U.getBuffer().remaining();
int Vb = V.getBuffer().remaining();
byte[] data = new byte[Yb + Ub + Vb];
Y.getBuffer().get(data, 0, Yb);
U.getBuffer().get(data, Yb, Ub);
V.getBuffer().get(data, Yb+ Ub, Vb);
return data;
}
// Main function
final byte[] data = convertYuvToByteArray(image);
Mat matTest = new Mat();
matTest.put(0, 0, data);
// DIsplay number of channels, rows and cols
Log.d("channels", Integer.valueOf(matTest.channels()).toString()); // channels 1, should be 3
Log.d("rows", Integer.valueOf(matTest.rows()).toString()); // rows 1080
Log.d("cols", Integer.valueOf(matTest.cols()).toString()); // cols 1920