2014-12-05 177 views
1

希望你們一切順利。我使用Aforge庫在C#中編寫了一些代碼。我想剪裁從網絡攝像頭捕捉到的主要圖像,以獲得良好的投資回報率。當我使用0的閾值時,一切都應該是白色像素(總數可以說是26880像素),但似乎我的裁剪圖像中有一些黑色像素(578像素)。任何可能導致它的想法?當我不裁剪我的圖像時,一切都很好。Aforge的treshould過濾器似乎不能正常工作

  Bitmap img = (Bitmap)eventArgs.Frame.Clone(); 
      Bitmap bmp = new Bitmap(x2box, y2box); 
      bmp = img.Clone(new Rectangle(x1box, y1box, x2box, y2box), eventArgs.Frame.PixelFormat); 
      Grayscale filter = new Grayscale(0.2125, 0.7154, 0.0721); 
      Bitmap img1 = filter.Apply(bmp); 
      Threshold tresh = new Threshold((int)tresh1);  // tresh1 is 0-255 but is set to zero here 
      tresh.ApplyInPlace(img1); 
      int iterator = 1; int xrow = 0;  // here i use these constant to calculate location of the pixels 
      byte[] arraybyte = BitmapToByteArray(img1);  
      for (int i = 0; i < arraybyte.Length; i++) 
      { 
       if (i - iterator * img1.Width == 0) 
       { 
        xrow++; 
        iterator++; 
       } 
       if (arraybyte[i] == 0) // if pixel is black 
       { 
        X_val.Add(i - xrow * img1.Width); 
        Y_val.Add(iterator); 
       } 
      } 

      for (int i = 0; i < X_val.Count; i++) 
      { 
       YAve += Y_val[i]; 
       XAve += X_val[i]; 
      } 
      MessageBox.Show(X_val.Count.ToString()); // shows non-zero value! 

的BitmapToByteArray方法如下:

public static byte[] BitmapToByteArray(Bitmap bitmap) 
    { 

     BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); 
     int numbytes = bmpdata.Stride * bitmap.Height; 
     byte[] bytedata = new byte[numbytes]; 
     IntPtr ptr = bmpdata.Scan0; 
     Marshal.Copy(ptr, bytedata, 0, numbytes); 
     bitmap.UnlockBits(bmpdata); 
     return bytedata; 

    } 

回答

1

爲位圖的每行的字節數將被強制爲4.如果roi width * bytes per pixel不是4的倍數的倍數,你將在每一行的末尾有填充字節。

它們不會被限制,因爲它們實際上並不是位圖的一部分,因此它們的值可能爲0.您的BitmapToByteArray方法可能不是填充感知和讀取每個字節。

+0

謝謝,我認爲這是問題來自於裁剪前的圖像寬度是4的倍數。一個選項只允許用戶選擇4的倍數,這可能不是最佳選擇。任何建議如何使我使用填充感知的方法?我將更新上述代碼以包含該方法。我想投你的答案,但我仍然需要更多的聲譽:P – 2014-12-05 19:16:18

+0

@maziar derakhshandeh:你可以遍歷每一行,並且只複製'每像素寬度*字節'字節而不是'步幅'。您可能必須使用不安全的代碼。另一種方法是改變你的閱讀循環。讓它遍歷行並在一行內只考慮「每像素寬度*字節」字節。 – 2014-12-05 21:17:10

相關問題