我正在使用 Emgu.CV 進行模板匹配并保存影像。不幸的是,我遇到了一個我一周都無法解決的問題。
問題是我將位元組陣列和大小從原始影像序列化為 json 檔案,每當我嘗試將其轉換回來時,有時影像會失真。我已經嘗試跳過序列化程序,但它仍然被扭曲了。這是轉換程序的代碼:
Image<Bgr565, byte> screenCrop = SnipMaker.takeSnip();//method creates screenshot at this point when i display the images they are 100% correct
byte[] data = screenCrop.Bytes;//I would get normaly all this from json file(in this case im skipping over it)
Mat mat = new Mat(screenCrop.Rows, screenCrop.Cols, screenCrop.Mat.Depth, asset.NumberOfChannels);
Marshal.Copy(data, 0, mat.DataPointer, screenCrop.asset.Cols * screenCrop.asset.Rows * asset.NumberOfChannels);
Image<Bgr565, byte> img = mat.ToImage<Bgr565, byte>();//This image is suddenly distorted
問題是,這取決于“我不確定什么”的結果要么是好的形象,要么是歪曲的:
正常結果
相同的代碼不同的結果
它幾乎就像它有時落后 1 個像素,但唯一改變的是螢屏截圖的大小和尺寸。我已經嘗試過直接的方式,比如
Image<Bgr, byte> img = new Image<Bgr, byte>(width, height);
img.Bytes = data;//data is byte array that i got from file
這有時也會給出正確的圖片,但有時會引發例外(嘗試將位元組從資料復制到 img 時,marshal.cs 中的超出范圍例外)
在這一點上我唯一懷疑的是,每當我截屏時我做錯了,但我不確定是什么:
public static Image<Bgr565, byte> Snip()
{
int screenWidth = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
int screenHeight = (int)System.Windows.SystemParameters.PrimaryScreenHeight;
using (Bitmap bmp = new Bitmap(screenWidth, screenHeight))
{
using (Graphics gr = Graphics.FromImage(bmp))
gr.CopyFromScreen(0, 0, 0, 0, bmp.Size);
using (var snipper = new SnippingTool(bmp))
{
if (snipper.ShowDialog() == true)
{
Bitmap bitmapImage = new Bitmap(snipper.Image);
Rectangle rectangle = new Rectangle(0, 0, bitmapImage.Width, bitmapImage.Height);//System.Drawing
BitmapData bmpData = bitmapImage.LockBits(rectangle, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);//System.Drawing.Imaging
Image<Bgr565, byte> outputImage = new Image<Bgr565, byte>(bitmapImage.Width, bitmapImage.Height, bmpData.Stride, bmpData.Scan0);
bitmapImage.Dispose();
snipper.Close();
return outputImage;
}
}
return null;
}
}
到目前為止,我還無法解決這個問題,并且知道我的運氣沒有人會在這里回答我。但是請有人幫我解決這個問題嗎?先感謝您
uj5u.com熱心網友回復:
所以感謝大家的幫助。
問題確實在螢屏截圖腳本中。我使用了不正確的像素格式組合,導致位傳輸不一致。但是因為 Image<bgr,byte>.Mat 中的 step 屬性是根據影像的寬度計算的(Emgucv SC):
step = sizeof(byte) * s.Width * channels;
這導致一些影像看起來正常而另一些則不正常。(基于觀察的推測)
修復:將所有 Image<Bgr, byte> 更改為 Image<Bgra, byte> 使其成為 32 位,然后更改:
BitmapData bmpData = bitmapImage.LockBits(rectangle, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
到:
BitmapData bmpData = bitmapImage.LockBits(rectangle, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
希望這對將來的人有所幫助。:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/443679.html
下一篇:使用OpenCV洗掉水平線
