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;
}
谢谢,我认为这是问题来自于裁剪前的图像宽度是4的倍数。一个选项只允许用户选择4的倍数,这可能不是最佳选择。任何建议如何使我使用填充感知的方法?我将更新上述代码以包含该方法。我想投你的答案,但我仍然需要更多的声誉:P – 2014-12-05 19:16:18
@maziar derakhshandeh:你可以遍历每一行,并且只复制'每像素宽度*字节'字节而不是'步幅'。您可能必须使用不安全的代码。另一种方法是改变你的阅读循环。让它遍历行并在一行内只考虑“每像素宽度*字节”字节。 – 2014-12-05 21:17:10