您好,感谢您阅读我的主题!我想为我的代码寻求建议,因为经过大量搜索后,我找不到任何东西来解决这个特定问题。我在 stackoverflow 上进行了谷歌搜索和搜索,但所有解决方案都无法正常工作(或者我不知道如何实现它们)。这是我的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AForge.Video;
using AForge.Video.DirectShow;
using System.Threading ;
namespace Motion_Detection
{
public partial class Form1 : Form
{
private FilterInfoCollection VideoCaptureDevices;
private VideoCaptureDevice FinalVideo;
private void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
Bitmap video = (Bitmap)eventArgs.Frame.Clone();
pictureBox1.Image = video;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices)
{
devicesList.Items.Add(VideoCaptureDevice.Name);
devicesList.SelectedIndex = 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
FinalVideo = new VideoCaptureDevice(VideoCaptureDevices[devicesList.SelectedIndex].MonikerString);
FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);
FinalVideo.Start();
}
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.Image = null;
FinalVideo.Stop();
}
private void button3_Click(object sender, EventArgs e)
{
worker.RunWorkerAsync();
}
private void button4_Click(object sender, EventArgs e)
{
worker.CancelAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
while (!worker.CancellationPending)
{
Bitmap map = new Bitmap(pictureBox1.Image); // this line throws the error
for (int x = 0; x < pictureBox1.Width; x++)
{
for (int y = 0; y < pictureBox1.Height; y++)
{
Color pixel = map.GetPixel(x, y);
if (pixel.R == 255 && pixel.G == 0 && pixel.B == 0)
{
// detected red pixel
}
}
}
Thread.Sleep(100); // check every 100ms or any other given interval
}
}
}
}
所以我正在使用 Aforge 视频 dll 来访问我的网络摄像头。这部分有效,我可以访问并从中读取流,当我将其转储到 picturebox1 时,它完美显示,没有任何延迟。
现在我正在玩弄运动检测,首先,我想看看我是否可以检测到出现在相机前面的某种颜色的像素。因为我需要遍历每个像素,所以我不得不将它放在不同的线程上,否则它会一直冻结我的 GUI 并且显示开始滞后。
问题是因为我这样做了,我不知道如何在不触发标题错误的情况下从后台工作人员正确访问 picturebox.image 内容。互联网上的一些人建议使用 lock() 但我从来没有这样做过,也不知道我应该在这里 lock() 什么。我以前从未使用过多线程,只是因为最终我永远无法处理访问冲突......
为了解决这个问题,我尝试了 try finally 块之类的方法,尽管即使在 try 块中,我也遇到了同样的异常。我认为有一种更清洁的方法来做我提到的事情,但我无法真正理解可能是哪种方法。
我希望我在论坛上的第一篇文章尽可能清晰易懂。
在此致谢~Ilhan