我正在开展一个项目,我已经实施了线程来处理相机捕获的图像。
请找一段时间间隔后计时器调用的ProcessFrame()
代码。
private void ProcessFrame()
{
try
{
Image<Bgr, Byte> ImageFrame;
// Get Image from the camera
ImageFrame = capture.QueryFrame();
// check if imageFrame is null or not
if (ImageFrame == null)
{
// if null then re- initialize the camera
try
{
capture.Dispose();
capture = new Capture(URL);
ImageFrame = capture.QueryFrame();
}
catch (Exception ex)
{
}
}
// resize image to show on Picture control
ImageFrame = ImageFrame.Resize(img.Width, img.Height, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR);
// show image on picture control
img.Image = ImageFrame;
try
{
#region Making directory and image in this code
string VerifyImageFolderId = VerifyImageFolder + "\\" + "Camera_" + (1) + "\\";
if (!Directory.Exists(VerifyImageFolderId))
Directory.CreateDirectory(VerifyImageFolderId);
string VerifyImageFileName = VerifyImageFolderId + "\\" + nSavedImagesCounter + ".jpg";
img.Image.Save(VerifyImageFileName); // Save Image
nSavedImagesCounter++;
#endregion
#region Starting thread For processing Image
Thread processImage = new Thread(new ThreadStart(() => ProcessImage(VerifyImageFileName)));
processImage.Start();
#endregion
}
catch (Exception ex)
{
Log(ex.Message);
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
}
//#endregion
}
catch (NullReferenceException e)
{
Console.Write("Exception:\n" + DateTime.Now.ToString("hhmmss"));
}
}
这里是第二个函数ProcessImage(string ImagePath)
,它用于执行一些文件处理操作,如下所示:
private void ProcessImage(string ImagePath)
{
#region Check for threadSafeFunction
if (this.InvokeRequired)
{
Console.WriteLine("Inside InvokeRequired");
this.Invoke(new MethodInvoker(delegate() { ProcessImage(ImagePath); }));
}
else
{
1. Detect faces in Image
2. Draw Face markers on Image
3. Some database based on result of Face Detection
4. Delete image File
}
}
添加ProcessFrame()
功能的线程后,功能变慢了。
而且我无法显示直播。
任何人都可以帮我吗?
提前致谢。
答案 0 :(得分:1)
我建议您使用队列处理图像 运行此代码一次
BlockingCollection<string> imageQueue=new BlockingCollection<string>();
new Thread(() =>
{
foreach (string imagePath in imageQueue.GetConsumingEnumerable())
{
ProcessImage(imagePath);
}
}).Start();
并像这样更改ProcessFrame
private void ProcessFrame()
{
.....
#region Starting thread For processing Image
imageQueue.Add(VerifyImageFileName);
#endregion
...
}