Ich habe Byte-Array mit yuv420 Daten.Konvertieren von Yuv 420 zu Bild <Bgr,byte>
byte[] yuv420;//yuv data
Wie kann ich konvertiere dies ein Image<Bgr, byte>
?
Ich fand eine mathematische Formel zu RGB und dann zu Image<Bgr, byte>
konvertieren, aber es ist sehr langsam. Gibt es eine Möglichkeit, es schneller zu konvertieren?
Es gibt eine Klasse in Emgu für
UmwandlungCOLOR_CONVERSION(enum CV_YUV2RGB Convert YUV color to RGB)
aber ich kann nicht verstehen, wie diese Klasse verwenden. Kann jemand helfen?
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);
}
Vielen Dank, viele andere Ideen, denn diese Funktion ist nicht schnell. – user1541069
Welche Version hast du versucht? Die C++ Version ist ungefähr dreimal schneller, also benutze das. Wenn Sie so schnell wie möglich brauchen, wird C# nicht für Sie arbeiten. –
Wie konvertiert man byte [] RGBData in Bitmap? – user1541069