You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现Continuous Capture:将单点击快照捕获改为100ms间隔连续捕获显示

如何修改代码实现以100ms间隔连续捕获并更新图像

现有代码点击PushSnap按钮可单次捕获图像并显示,需要修改为以100ms为间隔连续捕获并更新显示图像。


现有代码如下:

PushSnap_Click 事件处理方法

private void PushSnap_Click(object sender, EventArgs e)
{
    if (mycam == null) 
    {
        MessageBox.Show("内部错误:mycam 为空");
        return;                                  
    }
    string text = "";
    if (IsMyFormStatus_Opened())
    {
        if (!mydcam.buf_alloc(3))
        {
            MessageBox.Show("帧分配失败");
                return;
        }          
    }

    // 启动捕获
    mycam.m_capmode = CAMCAP_START.SNAP; // 单次捕获模式:捕获m_nFrameCount帧后停止
    if (!mycam.cap_start())
    { 
        return;
    }
    MyFormStatus_Acquiring();
    MyThreadCapture_Start();
}

MyThreadCapture_Start() 方法

private void MyThreadCapture_Start()
{
    m_threadCapture = new Thread(new ThreadStart(OnThreadCapture));

    m_threadCapture.IsBackground = true;
    m_threadCapture.Start();
}

OnThreadCapture() 方法

private void OnThreadCapture()
{
    using (mycamwait = new MycamWait()) 
    {
        while (true)
        {
            CAMWAIT eventmask = CAMWAIT.CAPEVENT.FRAMEREADY | CAMWAIT.CAPEVENT.STOPPED;
            DCAMWAIT eventhappened = DCAMWAIT.NONE;
            if (mycamwait.start(eventmask, ref eventhappened))
            {
                if (eventhappened & CAMWAIT.CAPEVENT.FRAMEREADY)
                {
                    int NewestFrame = 0;
                    int FrameCount = 0;

                    if (mycam.cap_transferinfo(ref NewestFrame, ref FrameCount))
                    {
                        MyUpdateImage(iNewestFrame);
                    }
                }

                if (eventhappened & CAMWAIT.CAPEVENT.STOPPED)
                {
                    bContinue = false;
                    if (m_cap_stopping == false && mycam.m_capmode == CAMCAP_START.SNAP)
                    {
                        // cap_stop()会自动执行,因此更新主对话框
                        //MySnapCaptureFinished();
                    }
                }
            }
        }
    }
}

图像显示更新方法 UpdateDisplay()

private void UpdateDisplay()
{
    Image oldImg = PicDisplay.Image;
    if (m_bitmap != null)
    {
        // 显示图像中心区域
        Int32 y0 = (m_image.height - PicDisplay.Height) / 2;
        Int32 x0 = (m_image.width - PicDisplay.Width) / 2;

        Rectangle rc = new Rectangle(x0, y0, PicDisplay.Width, PicDisplay.Height);
        Bitmap bmp = new Bitmap(PicDisplay.Width, PicDisplay.Height, PixelFormat.Format24bppRgb);
        using (var gr = Graphics.FromImage(bmp))
        {
            gr.DrawImage(m_bitmap, 0, 0, rc, GraphicsUnit.Pixel);
        }

        PicDisplay.Image = bmp;
        PicDisplay.Refresh();
    }
    else
    {
        PicDisplay.Image = null;
    }

    if (oldImg != null)
        oldImg.Dispose();
}

修改方案:

要实现100ms间隔连续捕获,需从捕获模式切换、循环控制、间隔延时三个核心点修改:

  1. 切换到连续捕获模式
    在PushSnap_Click中,将单次捕获的CAMCAP_START.SNAP替换为SDK支持的连续捕获模式(通常为CAMCAP_START.CONTINUOUS,若SDK枚举名称不同请参考对应文档):

    // 替换原单次捕获模式为连续捕获
    mycam.m_capmode = CAMCAP_START.CONTINUOUS; 
    
  2. 添加循环控制变量与100ms延时
    新增类级别的布尔变量控制循环,同时在捕获线程中添加100ms延时,确保捕获间隔:

    // 在类中新增控制变量
    private bool bIsCapturing = false;
    
    // 修改OnThreadCapture方法
    private void OnThreadCapture()
    {
        bIsCapturing = true;
        using (mycamwait = new MycamWait()) 
        {
            while (bIsCapturing)
            {
                CAMWAIT eventmask = CAMWAIT.CAPEVENT.FRAMEREADY | CAMWAIT.CAPEVENT.STOPPED;
                DCAMWAIT eventhappened = DCAMWAIT.NONE;
                if (mycamwait.start(eventmask, ref eventhappened))
                {
                    if (eventhappened & CAMWAIT.CAPEVENT.FRAMEREADY)
                    {
                        int NewestFrame = 0;
                        int FrameCount = 0;
    
                        if (mycam.cap_transferinfo(ref NewestFrame, ref FrameCount))
                        {
                            MyUpdateImage(NewestFrame); // 修正原代码变量名笔误
                            UpdateDisplay(); // 确保捕获后立即更新显示
                        }
                    }
    
                    if (eventhappened & CAMWAIT.CAPEVENT.STOPPED)
                    {
                        bIsCapturing = false;
                        if (m_cap_stopping == false)
                        {
                            // 处理捕获意外停止的逻辑
                        }
                    }
                }
                // 添加100ms延时,控制捕获间隔
                Thread.Sleep(100);
            }
        }
    }
    
  3. 添加手动停止逻辑(可选)
    若需要手动终止连续捕获,新增停止按钮事件:

    private void PushStop_Click(object sender, EventArgs e)
    {
        if (mycam != null && bIsCapturing)
        {
            bIsCapturing = false;
            mycam.cap_stop();
            MyFormStatus_Idle(); // 恢复窗体空闲状态
        }
    }
    
  4. 确保UI更新在主线程执行
    若UpdateDisplay直接操作UI控件,需添加线程检查,避免跨线程操作异常:

    private void UpdateDisplay()
    {
        if (PicDisplay.InvokeRequired)
        {
            PicDisplay.Invoke(new Action(UpdateDisplay));
            return;
        }
        // 原图像更新逻辑...
    }
    

内容的提问来源于stack exchange,提问作者lishiyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 02:24:12