如何设置 NewFrame 侦 事件的 侦率 500毫秒 执行一次?


videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (videoDevices.Count == 0)
{
    GLog.WriteBalanceLog("没有找到摄像头");
    return;
}
//获取摄像头
videoDevice = new VideoCaptureDevice(videoDevices[0].MonikerString);
//设备的摄像头分辨率数组 
videoCapabilities = videoDevice.VideoCapabilities;

//摄像头分辨率 最小的
int index = videoCapabilities.Length - 1;
VideoCapabilities v = videoCapabilities[index];
videoDevice.VideoResolution = v;

// DesiredFrameRate                 
videoDevice.NewFrame -= VideoDevice_NewFrame;
videoDevice.NewFrame += VideoDevice_NewFrame;
videoDevice.Start();

videoDevice.NewFrame += VideoDevice_NewFrame;

设置 NewFrame 侦 事件的 侦率 500毫秒 执行一次

简单的示例

using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using AForge.Video.DirectShow;
using AForge.Video;

namespace TakePhoto
{
    public partial class Test : Form
    {
        AIBalance aiBalance;
        public Test()
        {
            InitializeComponent();
        }

        //窗体加载完毕初始化实例并开启摄像头
        private void Test_Load(object sender, EventArgs e)
        {
            aiBalance = new AIBalance();
            aiBalance.Start();

        }
        private void button1_Click(object sender, EventArgs e)
        {
            aiBalance.takePhoto = true;//标记位true,进入拍照状态
            new Task(() => {
                while (true) {
                    if (aiBalance.isTake)//成功拍照
                    {
                        aiBalance.isTake = false;//标记位false

                        //跨线程设置控件需要invoke
                        this.Invoke(new Action(delegate {

                            pbAI.Image = aiBalance.frame;
                            //...后续2句代码
                        }));


                        break;//退出线程检查
                    }
                }
            }).Start();
        }
        //窗体关闭后释放摄像头
        private void Test_FormClosing(object sender, FormClosingEventArgs e)
        {
            aiBalance.CloseCamera();
        }
    }

    public class AIBalance
    {
        public AIBalance() { }
        //所有摄像设备
        private FilterInfoCollection videoDevices;
        //摄像设备,设置为静态变量
        private static VideoCaptureDevice videoDevice;
        //摄像头分辨率
        private VideoCapabilities[] videoCapabilities;

        /// <summary>
        /// 关闭摄像头
        /// </summary>
        public void CloseCamera()
        {
            videoDevice.SignalToStop();
            videoDevice.WaitForStop();
            videoDevice = null;
        }
        /// <summary>
        /// 开启摄像头
        /// </summary>
        public void Start() {
            //已经初始化过,在调用退出,防止重复调用打开摄像头
            if (videoDevice != null) { return; }

            videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            if (videoDevices.Count == 0)
            {
                return;
            }

            videoDevice = new VideoCaptureDevice(videoDevices[1].MonikerString);////
            //设备的摄像头分辨率数组 
            videoCapabilities = videoDevice.VideoCapabilities;

            //摄像头分辨率 最小的
            int index = videoCapabilities.Length - 1;
            VideoCapabilities v = videoCapabilities[index];
            videoDevice.VideoResolution = v;

            videoDevice.NewFrame += VideoDevice_NewFrame;
            videoDevice.Start();
        }
        /// <summary>
        /// 是否执行拍照操作,点击按钮时设置位ture
        /// </summary>
        public bool takePhoto = false;
        /// <summary>
        /// 是否已经拍照
        /// </summary>
        public bool isTake = false;

        public Bitmap frame;
        private void VideoDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            //未点击按钮,退出
            if (!takePhoto) return;
            try
            {
                // 捕获新的图像帧
                frame = (Bitmap)eventArgs.Frame.Clone();

                //.......if(clientSocket==null)....后续的代码
                isTake = true;//标记为已捕获图片状态
                takePhoto = false;//标记为非拍照状态
            }
            catch (Exception ex)
            {
               //GLog....
            }
        }
    }
}


答案参考ChatGPT Plus版,整理汇总。希望能帮助你解决问题
根据提供的代码,我可以看出以下步骤:

  1. 创建一个 FilterInfoCollection 对象 videoDevices,用于获取视频输入设备(摄像头)的信息。
  2. 检查 videoDevices 中的设备数量,如果没有找到摄像头,则记录日志并返回。
  3. 如果找到了摄像头,则从 videoDevices 中获取第一个设备的标识符 MonikerString
  4. 创建一个 VideoCaptureDevice 对象 videoDevice,并将摄像头设备的标识符作为参数传递给它,以初始化摄像头设备。
  5. 获取摄像头设备支持的分辨率列表 videoCapabilities
  6. 从分辨率列表中选择最小的分辨率,将其作为摄像头设备的当前分辨率。
  7. 注册 VideoDevice_NewFrame 方法作为 videoDeviceNewFrame 事件的处理程序。
  8. 启动摄像头设备,开始捕获视频帧。
  9. 每当摄像头设备有新的视频帧可用时,将触发 VideoDevice_NewFrame 方法进行处理。

根据您的要求,您可以在代码中添加以下部分以设置 NewFrame 事件的频率为500毫秒执行一次:

System.Timers.Timer timer = new System.Timers.Timer(500);
timer.Elapsed += Timer_Elapsed;
timer.Start();

private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // 在此处执行您的代码逻辑
    // 每隔500毫秒执行一次
}

private void VideoDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    // 在此处处理新的视频帧
}

通过使用 System.Timers.Timer 类,您可以创建一个定时器,并在指定的时间间隔内执行逻辑代码。在 Timer_Elapsed 方法中添加您需要执行的代码。每当定时器的间隔时间达到时,将触发 Timer_Elapsed 方法。

请注意,以上代码是基于C#编程语言的示例。确保将其与您的现有代码结合使用,并根据您的需求进行适当的修改。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632