我正在尝试使用EmguCV在.NET中执行此代码:
Parallel.ForEach<Bitmap>(GetImagesFromCamera(), bmp =>
{
Image<Gray, Byte> src = new Image<Gray, Byte>(bmp);
Image<Gray, Byte> dest = new Image<Gray, Byte>(src.Width, src.Height);
CvInvoke.cvThreshold(src, dest, 100, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
form.setImage(dest);
});
这是我的GetPicturesFromCamera()方法:
static IEnumerable<Bitmap> GetImagesFromCamera()
{
Camera cam = new Camera();
cam.StartCapture();
while (true)
{
yield return new Image<Gray, Byte>(cam.getBitmap());// <=== AccessViolationException
}
}
在标记点,我总是得到一个AccessViolationException,说“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”, 但我没有发现错误。
你能搞清楚吗?
编辑:
我也尝试了顺序,这种方式有效:
foreach (var bmp in GetImagesFromCamera())
{
Image<Gray, Byte> dest = new Image<Gray, Byte>(bmp.Width, bmp.Height);
CvInvoke.cvThreshold(bmp, dest, 100, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
form.setImage(dest);
};
但这样做不会:
foreach (var bmp in GetImagesFromCamera())
{
Image<Gray, Byte> dest = new Image<Gray, Byte>(bmp.Width, bmp.Height);
Image<Gray, Byte> tmp = new Image<Gray, Byte>(bmp.Width, bmp.Height);
CvInvoke.cvThreshold(bmp, dest, 100, 255, Emgu.CV.CvEnum.THRESH.CV_THRESH_BINARY);
CvInvoke.cvErode(dest, tmp, IntPtr.Zero, 2);
CvInvoke.cvDilate(tmp, dest, IntPtr.Zero, 2);
form.setImage(dest);
};
答案 0 :(得分:0)
我找到了一个解决方案:我必须将Camera类中的所有代码放入GetImagesFromCamera方法中,但我不知道为什么。