Camera2获取帧数据ImageReader转换YUV
Image image = reader.acquireLatestImage();
public byte[] YUV_420_888toNV21(Image image) {
byte[] data = null;
ByteBuffer buffer;
if (image.getFormat() == ImageFormat.YUV_420_888) {
Image.Plane[] planes = image.getPlanes();
buffer = planes[0].getBuffer();//Y通道
if (data == null) {
data = new byte[buffer.capacity() * 3 / 2];
}
//planes[1]和planes[2]根据摄像头上传数据判断U或者V
int len = buffer.capacity();
buffer.get(data, 0, len);
buffer = planes[1].getBuffer();
int len1 = buffer.capacity();
buffer.get(data, len, len1);
buffer = planes[2].getBuffer();
int len2 = buffer.capacity();
buffer.get(data, len+len1, len2);
buffer.clear();
}
return data;
}
RGB24转Bitmap,发现Bitmap只支持ALPHA_8,RGB_565(RGB16),ARGB_4444,ARGB_8888,RGBA_F16
int[] img = ICVPUtil.convertByteToColor(imgByte);
Bitmap bitmap = Bitmap.createBitmap(img,imgWidth, imgHeight, Bitmap.Config.ARGB_8888);
public static int[] convertByteToColor(byte[] data) {
int size = data.length;
if (size == 0) {
return null;
}
int arg = 0;
if (size % 3 != 0) {
arg = 1;
}
// 一般RGB字节数组的长度应该是3的倍数,
// 不排除有特殊情况,多余的RGB数据用黑色0XFF000000填充
int[] color = new int[size / 3 + arg];
int red, green, blue;
int colorLen = color.length;
if (arg == 0) {
for (int i = 0; i < colorLen; ++i) {
red = convertByteToInt(data[i * 3]);
green = convertByteToInt(data[i * 3 + 1]);
blue = convertByteToInt(data[i * 3 + 2]);
// 获取RGB分量值通过按位或生成int的像素值
color[i] = (red << 16) | (green << 8) | blue | 0xFF000000;
}
} else {
for (int i = 0; i < colorLen - 1; ++i) {
red = convertByteToInt(data[i * 3]);
green = convertByteToInt(data[i * 3 + 1]);
blue = convertByteToInt(data[i * 3 + 2]);
color[i] = (red << 16) | (green << 8) | blue | 0xFF000000;
}
color[colorLen - 1] = 0xFF000000;
}
return color;
}
// 将一个byte数转成int
// 实现这个函数的目的是为了将byte数当成无符号的变量去转化成int
public static int convertByteToInt(byte data) {
int heightBit = (int) ((data >> 4) & 0x0F);
int lowBit = (int) (0x0F & data);
return heightBit * 16 + lowBit;
}
OpenCV转换图片格式
Mat frameMat = new Mat(imgHeight, imgWidth, CvType.CV_8UC3);//3通道RGB
Mat frameMat = new Mat(imgHeight* 3 / 2, imgWidth, CvType.CV_8UC1);//YUV
Mat grayMat = new Mat(imgHeight, imgWidth, CvType.CV_8UC1);//灰度图
frameMat.put(0, 0, imageData);
Mat mat1 = new Mat();
Imgproc.cvtColor(frameMat, mat1, Imgproc.COLOR_YUV2RGB_NV12, 3);
frameMat.release();//格式转换
Imgproc.rectangle(mat1, rect, faceRectScalar, 2);//绘制图形
Mat flipMat = new Mat();
Core.flip(mat1, flipMat, 1);//镜像翻转
Core.rotate(rgbMat,rgbMat,Core.ROTATE_90_COUNTERCLOCKWISE);//90度旋转
Bitmap bitmap = Bitmap.createBitmap(imgWidth, imgHeight, Bitmap.Config.RGB_565);
Utils.matToBitmap(flipMat, bitmap);//转换Bitmap