实现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间隔连续捕获,需从捕获模式切换、循环控制、间隔延时三个核心点修改:
切换到连续捕获模式
在PushSnap_Click中,将单次捕获的CAMCAP_START.SNAP替换为SDK支持的连续捕获模式(通常为CAMCAP_START.CONTINUOUS,若SDK枚举名称不同请参考对应文档):// 替换原单次捕获模式为连续捕获 mycam.m_capmode = CAMCAP_START.CONTINUOUS;添加循环控制变量与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); } } }添加手动停止逻辑(可选)
若需要手动终止连续捕获,新增停止按钮事件:private void PushStop_Click(object sender, EventArgs e) { if (mycam != null && bIsCapturing) { bIsCapturing = false; mycam.cap_stop(); MyFormStatus_Idle(); // 恢复窗体空闲状态 } }确保UI更新在主线程执行
若UpdateDisplay直接操作UI控件,需添加线程检查,避免跨线程操作异常:private void UpdateDisplay() { if (PicDisplay.InvokeRequired) { PicDisplay.Invoke(new Action(UpdateDisplay)); return; } // 原图像更新逻辑... }
内容的提问来源于stack exchange,提问作者lishiyu
相关产品推荐
相关产品推荐

