Tôi có mảng byte với dữ liệu yuv420.Chuyển đổi từ yuv 420 thành hình ảnh <Bgr,byte>
byte[] yuv420;//yuv data
Tôi làm cách nào để chuyển đổi số này thành Image<Bgr, byte>
?
Tôi đã tìm thấy công thức toán học để chuyển đổi thành RGB và sau đó là Image<Bgr, byte>
nhưng nó rất chậm. Có cách nào để chuyển đổi nhanh hơn không?
Có một lớp học trong Emgu để chuyển đổi
COLOR_CONVERSION(enum CV_YUV2RGB Convert YUV color to RGB)
nhưng tôi không thể hiểu làm thế nào sử dụng lớp này. Có ai giúp được không?
static Bitmap ConvertYUV2RGB(byte[] yuvFrame, byte[] rgbFrame, int width, int height)
{
int uIndex = width * height;
int vIndex = uIndex + ((width * height) >> 2);
int gIndex = width * height;
int bIndex = gIndex * 2;
int temp = 0;
//图片为pic1,RGB颜色的二进制数据转换得的int r,g,b;
Bitmap bm = new Bitmap(width, height);
int r = 0;
int g = 0;
int b = 0;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
// R分量
temp = (int)(yuvFrame[y * width + x] + (yuvFrame[vIndex + (y/2) * (width/2) + x/2] - 128) * YUV2RGB_CONVERT_MATRIX[0, 2]);
rgbFrame[y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
// G分量
temp = (int)(yuvFrame[y * width + x] + (yuvFrame[uIndex + (y/2) * (width/2) + x/2] - 128) * YUV2RGB_CONVERT_MATRIX[1, 1] + (yuvFrame[vIndex + (y/2) * (width/2) + x/2] - 128) * YUV2RGB_CONVERT_MATRIX[1, 2]);
rgbFrame[gIndex + y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
// B分量
temp = (int)(yuvFrame[y * width + x] + (yuvFrame[uIndex + (y/2) * (width/2) + x/2] - 128) * YUV2RGB_CONVERT_MATRIX[2, 1]);
rgbFrame[bIndex + y * width + x] = (byte)(temp < 0 ? 0 : (temp > 255 ? 255 : temp));
Color c = Color.FromArgb(rgbFrame[y * width + x], rgbFrame[gIndex + y * width + x], rgbFrame[bIndex + y * width + x]);
bm.SetPixel(x, y, c);
}
}
return bm;
}
static double[,] YUV2RGB_CONVERT_MATRIX = new double[3, 3] { { 1, 0, 1.4022 }, { 1, -0.3456, -0.7145 }, { 1, 1.771, 0 } };
static byte clamp(float input)
{
if (input < 0) input = 0;
if (input > 255) input = 255;
return (byte)Math.Abs(input);
}
Cảm ơn, rất nhiều người có một số ý tưởng khác? Vì func này không nhanh. – user1541069
bạn đã thử phiên bản nào ?? phiên bản C++ nhanh gấp ba lần, vì vậy hãy sử dụng nó. nếu bạn cần càng nhanh càng tốt C# sẽ không hoạt động cho bạn. –
làm thế nào để chuyển đổi byte [] RGBData thành bitmap? – user1541069