尝试让多个线程使用 capture.QueryFrame() 获取帧
Trying to get multiple threads to get frames with capture.QueryFrame()
所以我有一个主要 class 从我的网络摄像头获取帧和处理帧的多个线程。我已经锁定了 main class 从 cam 抓取帧的部分,因此只有一个线程可以处理同一帧。现在我收到一个外部异常,我不知道为什么。
我的主要 class:
public Image<Bgr, byte> GetImage()
{
Image<Bgr, byte> returnable;
Mat f = null;
lock (locker)
{
do
{
f = capture.QueryFrame();
} while (!capture.Grab());
returnable = f.ToImage<Bgr, byte>();
}
return returnable;
}
我的帖子:
Image<Bgr,byte> image;
image = o.GetImage(); //o is the main class
Image imag = image.ToBitmap();
string savePath = path + rofNumber + "/Original.jpg";
imag.Save(savePath); //Exception is on this line
toFind = o.GetNumbersFromDatabase();
labels = FindLabels(image);
异常:
System.Runtime.InteropServices.ExternalException was unhandled
ErrorCode=-2147467259
HResult=-2147467259
Message=Er is een algemene fout opgetreden in GDI+.
Source=System.Drawing
StackTrace:
bij System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
bij OCR.Worker.Run() in C:\Users\...\Code\Visual Studio\OCR\OCR\Worker.cs:regel 178
bij System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bij System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bij System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bij System.Threading.ThreadHelper.ThreadStart()
InnerException:
我自己发现了问题。
由于我正在使用多个线程,因此在保存图像时我应该更加谨慎。
问题是其中一个线程正在保存图像,但在完成之前,另一个线程开始保存到同一个文件,这导致了错误。
我首先尝试这个的原因是为了获得相机画面的小型幻灯片。
结论:
我为每个线程使用了不同的名称来保存图像!
最后我自己解决了这个问题,但我了解到我需要对多线程非常谨慎...
所以我有一个主要 class 从我的网络摄像头获取帧和处理帧的多个线程。我已经锁定了 main class 从 cam 抓取帧的部分,因此只有一个线程可以处理同一帧。现在我收到一个外部异常,我不知道为什么。 我的主要 class:
public Image<Bgr, byte> GetImage()
{
Image<Bgr, byte> returnable;
Mat f = null;
lock (locker)
{
do
{
f = capture.QueryFrame();
} while (!capture.Grab());
returnable = f.ToImage<Bgr, byte>();
}
return returnable;
}
我的帖子:
Image<Bgr,byte> image;
image = o.GetImage(); //o is the main class
Image imag = image.ToBitmap();
string savePath = path + rofNumber + "/Original.jpg";
imag.Save(savePath); //Exception is on this line
toFind = o.GetNumbersFromDatabase();
labels = FindLabels(image);
异常:
System.Runtime.InteropServices.ExternalException was unhandled
ErrorCode=-2147467259
HResult=-2147467259
Message=Er is een algemene fout opgetreden in GDI+.
Source=System.Drawing
StackTrace:
bij System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
bij OCR.Worker.Run() in C:\Users\...\Code\Visual Studio\OCR\OCR\Worker.cs:regel 178
bij System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bij System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
bij System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bij System.Threading.ThreadHelper.ThreadStart()
InnerException:
我自己发现了问题。 由于我正在使用多个线程,因此在保存图像时我应该更加谨慎。
问题是其中一个线程正在保存图像,但在完成之前,另一个线程开始保存到同一个文件,这导致了错误。
我首先尝试这个的原因是为了获得相机画面的小型幻灯片。
结论:
我为每个线程使用了不同的名称来保存图像!
最后我自己解决了这个问题,但我了解到我需要对多线程非常谨慎...