我的代碼都認為輸入Mat是 BGR 格式,所以我想知道是否給定ImageEmguCV 中的物件,Mat該物件的屬性始終是 BGR Mat。否則,我需要使用CvtColor來獲取 BGR 表示。
示例代碼:
byte[] data = GetPngPixelsArray(string); // Byte array in RGB format
Image<Rgb, byte> image = new Image<Rgb, byte>(width, height)
{
Bytes = data
};
CvInvoke.Imshow("image mat", image.Mat);
CvInvoke.WaitKey(0);
我用來獲取位元組陣列資料的函式:
internal static byte[] GetPngPixelsArray(string filename)
{
byte[] rgbValues = null;
using (var imageIn = Image.FromFile(filename))
using (var bmp = new Bitmap(imageIn))
{
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
IntPtr ptr = bmpData.Scan0;
int bytes = Math.Abs(bmpData.Stride) * bmp.Height;
rgbValues = new byte[bytes];
Marshal.Copy(ptr, rgbValues, 0, bytes);
bmp.UnlockBits(bmpData);
}
return rgbValues;
}
在上面的示例代碼中,該Imshow函式正確顯示影像,據我所知,Imshow始終使用 BGR 格式表示影像。
所以實際上它image.Mat是 BGR 格式,但我檢查了 EmguCV 檔案,并沒有發現任何宣告表明這是我所說的。
uj5u.com熱心網友回復:
剛剛檢查了 EmguCV 創建Image物件的行為,并且該.Mat屬性具有與物件相同的表示形式Image,這意味著可以是 BGR 或 RGB。
我填充了兩個大小為 750000 (500x500x3) 的向量,這就是我所做的:
byte[] rgbChar = new byte[750000];
byte[] bgrChar = new byte[750000];
for (int i = 0; i < rgbChar.Length; i =3)
{
rgbChar[i] = 255;
rgbChar[i 1] = 0;
rgbChar[i 2] = 0;
bgrChar[i] = 0;
bgrChar[i 1] = 0;
bgrChar[i 2] = 255;
}
Image<Rgb, byte> imageRgb = new Image<Rgb, byte>(500, 500)
{
Bytes = rgbChar
};
Image<Bgr, byte> imageBgr = new Image<Bgr, byte>(500, 500)
{
Bytes = bgrChar
};
CvInvoke.Imshow("RGB Image", imageRgb);
CvInvoke.Imshow("RGB Image mat", imageRgb.Mat);
CvInvoke.Imshow("BGR Image", imageBgr);
CvInvoke.Imshow("BGR Image mat", imageBgr.Mat);
CvInvoke.WaitKey(0);

編輯:我會添加一些解釋,因為結果似乎不是自我解釋的。
我認為 EmguCVImage類曾經將屬性創建Mat為 BGR。那是什么意思?
如果檢查Image創建,則需要指定格式,例如。Image<Rgb, byte>. 我認為,由于您必須指定 的格式Image,因此該.Mat屬性是 RGB 的 BGR 表示Image。
基本上,我認為行為是這樣的:
Image<Rgb, byte>: -> 從 RGB 到 BGR 的內部轉換為.Mat屬性(錯誤)。Image<Bgr, byte>: -> 無轉換,.MatBGR 與Image.
但真正的行為是,.Mat屬性只是 的Mat表示,Image不管Image是 RGB 還是 BGR 格式,.Mat屬性都將采用相同的表示。
這就是在前兩種情況下影像顯示為藍色的原因(Imshow曾經將影像表示為 BGR,如果影像是 RGB,它將顯示藍色影像)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/476552.html
上一篇:在影像上方畫一個X字母
