public void SetCameraConfigFile(string file)
        {
            CameraConfigFile = file;

            if (!string.IsNullOrEmpty(file))
            {
                //获取相机配置参数
                string configFile = $"{System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase}/VisionPlatform/Camera/CameraConfig/{CameraSerial}/ConfigFile/{CameraConfigFile}";

                if (File.Exists(configFile))
                {
                    cameraConfigParam = JsonSerialization.DeserializeObjectFromFile <CameraConfigParam>(configFile);

                    //还原相机配置
                    try
                    {
                        CameraFactory.ConfigurateCamera(CameraSerial, cameraConfigParam);
                    }
                    catch (Exception)
                    {
                    }
                }
                else
                {
                    cameraConfigParam = CameraFactory.GetCameraConfigration(CameraSerial);
                    JsonSerialization.SerializeObjectToFile(cameraConfigParam, configFile);
                }
            }
        }
        /// <summary>
        /// 设置相机
        /// </summary>
        /// <param name="cameraSerial"></param>
        /// <exception cref="InvalidOperationException">
        /// 打开相机失败
        /// </exception>
        public void SetCamera(string cameraSerial)
        {
            //若相机无效,则不报异常
            try
            {
                if (VisionFrame.IsEnableCamera)
                {
                    CameraSerial = cameraSerial;

                    Camera = CameraFactory.GetCamera(cameraSerial);

                    if (CameraFactory.DefaultCameraSdkType != ECameraSdkType.VirtualCamera)
                    {
                        //配置相机参数
                        if (CameraFactory.DefaultCameraSdkType != ECameraSdkType.VirtualCamera)
                        {
                            if (string.IsNullOrEmpty(CameraConfigFile))
                            {
                                CameraConfigFile = $"default.json";
                            }
                            SetCameraConfigFile(CameraConfigFile);
                        }

                        //if (string.IsNullOrEmpty(CalibrationFile))
                        //{
                        //    CalibrationFile = $"default.json";
                        //}
                        //配置标定信息
                        SetCameraCalibrationFile(CalibrationFile);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        public RunStatus Execute(int timeout, out string visionResult)
        {
            bool isTimeout = false;
            var  runStatus = new RunStatus();

            visionResult = "";

            try
            {
                //参数校验
                if (VisionFrame == null)
                {
                    throw new NullReferenceException("VisionFrame cannot be null");
                }

                if (!IsInit)
                {
                    throw new Exception($"scene is uninitialized({nameof(IsVisionFrameInit)}:{IsVisionFrameInit} {nameof(IsCameraInit)}:{IsCameraInit})");
                }

                ItemCollection outputs;

                //开始计时
                totalProcessStopwatch.Restart();

                //如果使能相机,则调用相机采集
                if (VisionFrame.IsEnableCamera && IsCameraInit)
                {
                    lock (threadLock)
                    {
                        isVisionProcessed = false;
                    }

                    //注册相机采集完成事件
                    Camera.NewImageEvent -= Camera_NewImageEvent;
                    Camera.NewImageEvent += Camera_NewImageEvent;

                    //配置相机参数
                    CameraFactory.ConfigurateCamera(CameraSerial, cameraConfigParam);

                    //触发拍照
                    Camera.TriggerSoftware();

                    //阻塞等待视觉处理完成
                    grapTimeoutStopwatch.Restart();
                    while (true)
                    {
                        lock (threadLock)
                        {
                            if (isVisionProcessed)
                            {
                                grapTimeoutStopwatch.Stop();
                                break;
                            }
                        }

                        if ((timeout > 0) && (grapTimeoutStopwatch.Elapsed.TotalMilliseconds > timeout))
                        {
                            isTimeout = true;
                            grapTimeoutStopwatch.Stop();
                            throw new TimeoutException("grab image timeout");
                        }

                        System.Threading.Thread.Sleep(2);
                    }

                    //执行视觉框架
                    VisionFrame.ExecuteByImageInfo(imageInfo, out outputs);

                    //结果拼接
                    visionResult = ConvertItemCollectionToString(outputs, MainSeparatorChar, SubSeparatorChar);
                }
                else
                {
                    //执行视觉框架
                    VisionFrame.Execute(timeout, out outputs);

                    //结果拼接
                    visionResult = ConvertItemCollectionToString(outputs, MainSeparatorChar, SubSeparatorChar);
                }
            }
            catch (Exception ex)
            {
                return(new RunStatus(0, EResult.Error, ex.Message));
            }
            finally
            {
                //停止计时
                totalProcessStopwatch.Stop();
                VisionFrame.RunStatus.TotalTime = totalProcessStopwatch.Elapsed.TotalMilliseconds;

                if (!isTimeout)
                {
                    //释放图像资源,否则可能会导致资源泄露
                    imageInfo.DisposeImageIntPtr?.Invoke(imageInfo.ImagePtr);
                }
            }

            return(VisionFrame.RunStatus);
        }