wangwulicsdn 2023-05-19 18:21 采纳率: 46.4%
浏览 83
已结题

摄像头每执行 test 方法,调用一次 VideoDevice_NewFrame 事件。



//所有摄像设备
private FilterInfoCollection videoDevices;
//摄像设备
private VideoCaptureDevice videoDevice;
//摄像头分辨率
private VideoCapabilities[] videoCapabilities;



// 测试方法
public void test()
{
    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;

    videoDevice.NewFrame += VideoDevice_NewFrame;
    videoDevice.Start();  
}


/// <summary>
/// 相机抓拍图片
/// 创迹商品图片识别
/// </summary>
/// <param name="sender"></param>
/// <param name="eventArgs"></param>
private void VideoDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
    try
    {
         GLog.WriteBalanceLog("相机抓拍图片");
         
        // 捕获新的图像帧
        Bitmap frame = (Bitmap)eventArgs.Frame.Clone();                

         
        // 关闭相机 
        if (videoDevice != null && videoDevice.IsRunning) {
            GLog.WriteBalanceLog("关闭相机"); 
            videoDevice.SignalToStop();
            videoDevice.WaitForStop();
        }
    }
    catch (Exception ex)
    { 
        GLog.WriteBalanceLog("识别过程出现异常:" + ex.Message);
    }  
} 

问题一
执行 test 方法, 注册 VideoDevice_NewFrame 事件。
VideoDevice_NewFrame 方法执行了 无数次 n 次,直到程序死掉为止。

问题二

// 关闭相机 
if (videoDevice != null && videoDevice.IsRunning) {
    GLog.WriteBalanceLog("关闭相机"); 
    videoDevice.SignalToStop();
    videoDevice.WaitForStop();
}

如果加上关闭相机的代码。
第一次执行test 方法,会调用 VideoDevice_NewFrame。
第二 三 四次 后面所有执行 test 方法, 不会调用 VideoDevice_NewFrame 事件。

我想要的效果
每执行 test 方法,调用一次 VideoDevice_NewFrame 事件。

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2023-05-19 21:36
    关注

    测试了下再NewFrame事件中无法停止VideoSource,可以用一个线程来检查拍照后停止可以

    
    
            bool stop = false;//是否拍照标志////////////////////////////
            // 测试方法
            public void test()
            {
                stop = false;///重置
                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;
    
                videoDevice.NewFrame += VideoDevice_NewFrame;
                videoDevice.Start();
    
                //线程检查////////////////////////////////////////////
                new Task(() => {
                    while (!stop)
                    {
    
                        System.Threading.Thread.CurrentThread.Join(100);
                    }
    
                    this.Invoke(new Action(delegate
                    {
                        videoDevice.SignalToStop();
                        videoDevice.WaitForStop();
                    }));
                }).Start();
            }
    
    
            /// <summary>
            /// 相机抓拍图片
            /// 创迹商品图片识别
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="eventArgs"></param>
            private void VideoDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
            {
                try
                {
                    GLog.WriteBalanceLog("相机抓拍图片");
    
                    // 捕获新的图像帧
                    Bitmap frame = (Bitmap)eventArgs.Frame.Clone();
                    ////////////////
                    stop = true;///通过线程来关闭,而不是在NewFrame事件中关闭,测试了下无法关闭
                    // 关闭相机 
                    /*if (videoDevice != null && videoDevice.IsRunning)
                    {
                        GLog.WriteBalanceLog("关闭相机");
                        videoDevice.SignalToStop();
                        videoDevice.WaitForStop();
                    }*/
                }
                catch (Exception ex)
                {
                    GLog.WriteBalanceLog("识别过程出现异常:" + ex.Message);
                }
            }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月27日
  • 已采纳回答 5月19日
  • 赞助了问题酬金15元 5月19日
  • 创建了问题 5月19日