Browse Source

暂时取消委托,先手动采集图像

刘彬 1 week ago
parent
commit
e0875c75b6

+ 53 - 19
Cameralibs/HKCamera/MvCamera.cs

@@ -3,6 +3,7 @@ using LampInspectionMachine.Interfaces;
 using LampInspectionMachine.Log4xml;
 using LampInspectionMachine.Model;
 using Microsoft.Win32;
+using MvCamCtrl.NET;
 using MvCameraControl;
 using SqlSugar.DistributedSystem.Snowflake;
 using System;
@@ -11,12 +12,15 @@ using System.Collections.ObjectModel;
 using System.ComponentModel;
 using System.Data.SqlTypes;
 using System.Diagnostics;
+using System.Drawing.Imaging;
+using System.Drawing;
 using System.Linq;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
+using System.Windows.Media.Media3D;
 
 namespace LampInspectionMachine.Cameralibs.HKCamera
 {
@@ -379,12 +383,12 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
             //           3 - Line3;
             //           4 - Counter;
             //           7 - Software;
-            m_MyCamera.Parameters.SetEnumValueByString("TriggerSource", "Software");
+           // m_MyCamera.Parameters.SetEnumValueByString("TriggerSource", "Software");
             m_MyCamera.Parameters.SetEnumValueByString("AcquisitionMode", "Continuous");
             //m_MyCamera.Parameters.SetCommandValue("TriggerSoftware");
 
             // ch:注册回调函数 | en:Register image callback
-            m_MyCamera.StreamGrabber.FrameGrabedEvent += FrameGrabedEventHandler;
+           // m_MyCamera.StreamGrabber.FrameGrabedEvent += FrameGrabedEventHandler;
             IsConnected = m_MyCamera.IsConnected;
             return IsConnected;
         }
@@ -440,6 +444,7 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
             }
             PixelType = (MvCameraControl.MvGvspPixelType)pcPixelFormat.CurEnumEntry.Value;
 
+
             return MvError.MV_OK;
         }
 
@@ -449,6 +454,13 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
         /// <returns></returns>
         public ICogImage Grab()
         {
+                    m_MyCamera.StreamGrabber.StartGrabbing();
+            m_MyCamera.Parameters.SetEnumValueByString("AcquisitionMode", "Continuous");
+            m_MyCamera.Parameters.SetEnumValueByString("TriggerMode", "Off");
+            m_MyCamera.Parameters.SetFloatValue("ExposureTime", 5000); // 单位μs
+            m_MyCamera.Parameters.SetIntValue("GevSCPSPacketSize", 8164);
+            m_MyCamera.Parameters.SetIntValue("GevSCPD", 12000);  // 缓冲区大小
+            m_MyCamera.Parameters.SetEnumValueByString("PixelFormat", "RGB8");
             IFrameOut frameOut = null;
             bool Succeed = false;
             int nRet = -1;
@@ -471,7 +483,6 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
                         ErrorMessage = $"{nRet: x8}";
                         continue;
                     }
-
                     // ch:开始采集 | en:Start Grabbing
                     nRet = m_MyCamera.StreamGrabber.StartGrabbing();
                     if (nRet != MvError.MV_OK)
@@ -481,11 +492,12 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
                         ErrorMessage = $"{nRet: x8}";
                         continue;
                     }
-
-                    nRet = m_MyCamera.StreamGrabber.GetImageBuffer(1000, out frameOut);
+                   
+                    nRet = m_MyCamera.StreamGrabber.GetImageBuffer(20000, out frameOut);
                     m_MyCamera.StreamGrabber.StopGrabbing();
                     if (nRet != MvError.MV_OK)
                     {
+                       
                         CloseDevice();
                         OpenDevice();
                         ErrorMessage = $"{nRet: x8}";
@@ -509,6 +521,7 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
                 return null;
             }
 
+            if( frameOut !=null)
             Image = AnalyticImage(frameOut);
             TotalTime = sw.Elapsed;
 
@@ -535,8 +548,11 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
         {
             try
             {
-                IsGrabbing = false;
-                Thread.Sleep(1000);
+                if ( IsGrabbing )
+                {
+                    IsGrabbing = false;
+                    Thread.Sleep(1000);
+                }
                 if (m_hReceiveThread != null)
                 {
                     m_hReceiveThread.Abort();
@@ -613,14 +629,19 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
                 return null; // 不支持的图像格式
             }
 
-            //2.申请 byte[] 
-            byte[] m_BufForDriver1 = new byte[pImage.ImageSize];
 
-            //3.海康相机取流 指针转 byte[]
-            Marshal.Copy(pImage.PixelDataPtr, m_BufForDriver1, 0, ((int)pImage.ImageSize));
+            // 直接转换为CogImage,避免不必要的内存拷贝
+            image = ConvertToICogImage(pImage.Width, pImage.Height,
+                                     pImage.PixelDataPtr, pixelType);
+
+            ////2.申请 byte[] 
+            //byte[] m_BufForDriver1 = new byte[pImage.ImageSize];
+
+            ////3.海康相机取流 指针转 byte[]
+            //Marshal.Copy(pImage.PixelDataPtr, m_BufForDriver1, 0, ((int)pImage.ImageSize));
 
-            //4.转换成 CogImage
-            image = ConvertToICogImage(pImage.Width, pImage.Height, pImage.PixelDataPtr, pixelType);
+            ////4.转换成 CogImage
+            //image = ConvertToICogImage(pImage.Width, pImage.Height, pImage.PixelDataPtr, pixelType);
             pImage.Dispose();
             frameOut.Dispose();
             return image;
@@ -825,29 +846,38 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
 
         private void GetStreamThreadProc()
         {
+            m_MyCamera.StreamGrabber.StartGrabbing();
+            m_MyCamera.Parameters.SetEnumValueByString("AcquisitionMode", "Continuous");
+            m_MyCamera.Parameters.SetEnumValueByString("TriggerMode", "Off");
+            m_MyCamera.Parameters.SetFloatValue("ExposureTime", 5000); // 单位μs
+            m_MyCamera.Parameters.SetIntValue("GevSCPSPacketSize", 8164);
+            m_MyCamera.Parameters.SetIntValue("GevSCPD", 12000);  // 缓冲区大小
+            m_MyCamera.Parameters.SetEnumValueByString("PixelFormat", "RGB8");
             while (IsGrabbing)
             {
                 Stopwatch sw = Stopwatch.StartNew();
                 try
                 {
                     IFrameOut frameOut = null;
+                  
 
-                    int nRet = m_MyCamera.StreamGrabber.GetImageBuffer(1000, out frameOut);
-                    //double time1 = sw.Elapsed.TotalMilliseconds;
-                    //Console.WriteLine($"获取图像:{time1}ms");
-                    if (nRet == MvError.MV_OK)
+                    int nRet = m_MyCamera.StreamGrabber.GetImageBuffer(5000, out frameOut);
+
+                    double time1 = sw.Elapsed.TotalMilliseconds;
+                    Console.WriteLine($"获取图像:{time1}ms");
+                    if ( nRet == MvError.MV_OK )
                     {
                         Image = AnalyticImage(frameOut);
                         TotalTime = sw.Elapsed;
-                        //Console.WriteLine(TotalTime.TotalMilliseconds);
                         ImageCallbackEvent?.Invoke(Image, TotalTime, ErrorMessage);
+                        m_MyCamera.StreamGrabber.FreeImageBuffer(frameOut);
                     }
                     else
                     {
                         TotalTime = sw.Elapsed;
                         Thread.Sleep(5);
                     }
-                    m_MyCamera.StreamGrabber.FreeImageBuffer(frameOut);
+                   
                 }
                 catch (Exception ex)
                 {
@@ -888,6 +918,10 @@ namespace LampInspectionMachine.Cameralibs.HKCamera
                     CogImage8Grey cogImage8Grey = new CogImage8Grey();
                     cogImage8Grey.SetRoot(cogImage8Root);
                     cogImage = cogImage8Grey.ScaleImage((int)nWidth, (int)nHeight);
+
+
+
+
                     System.GC.Collect();
                 }
                 else

+ 228 - 327
Core/Management.cs

@@ -46,12 +46,9 @@ namespace LampInspectionMachine.Core
     public class Management : BindableBase
     {
 
-        private bool isConnected = false;
 
 
-        private CogJobManager myJobManager;
-        private List<CogJob> myJobs = new List<CogJob>();
-        private List<CogJobIndependent> myIndependentJobs = new List<CogJobIndependent>();
+
         private CameraView cameraView;
         private ICogImage image = new CogImage8Grey();
         private WriteableBitmap writeable;
@@ -75,12 +72,6 @@ namespace LampInspectionMachine.Core
 
         public CameraService CameraService { get; set; }
 
-        public CogJobManager MyJobManager { get => myJobManager; set => myJobManager = value; }
-        public List<CogJob> MyJobs { get => myJobs; set => myJobs = value; }
-        public List<CogJobIndependent> MyIndependentJobs { get => myIndependentJobs; set => myIndependentJobs = value; }
-
-
-        public CogJobManagerEdit MyJobManagerEdit { get => myJobManagerEdit; set => myJobManagerEdit = value; }
 
         /// <summary>
         /// 相机列表
@@ -91,43 +82,47 @@ namespace LampInspectionMachine.Core
         /// <summary>
         /// 当前相机配置
         /// </summary>
-        public CameraInfo CurrCamConfig { get => _CurrCamConfig; set { SetProperty(ref _CurrCamConfig, value); } }
+       public CameraInfo CurrCamConfig { get => _CurrCamConfig; set { SetProperty(ref _CurrCamConfig, value); } }
 
         /// <summary>
         /// 相机配置列表
         /// </summary>
         public ObservableCollection<CameraInfo> CamConfigs { get => _CamConfigs; set { SetProperty(ref _CamConfigs, value); } }
 
-        public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } }
+      //  public bool IsTriggerModel { get => _isTriggerModel; set { SetProperty(ref _isTriggerModel, value); } }
 
-        public ICamera MyCamera { get => myCamera; set { SetProperty(ref myCamera, value); } }
+        public ICamera CurrCamera { get => myCamera; set { SetProperty(ref myCamera, value); } }
 
         /// <summary>
         /// 相机对应模板工具
         /// </summary>
-        public List<CogToolBlock> CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; }
+     //   public List<CogToolBlock> CamTemplateS { get => _CamTemplateS; set => _CamTemplateS = value; }
 
         public event Action<int> ToolBlockSwitched;
         /// <summary>
         /// 当前选中相机的SN
         /// </summary>
-        public string CurrCameraSn { get => _CurrCameraSn; set { SetProperty(ref _CurrCameraSn, value); } }
+        public string CurrCameraSn { get => _CurrCameraSn; 
+            set { SetProperty(ref _CurrCameraSn, value); } }
+
+        public List<VisionProManager> VisionProManagers { get => _visionProManagers; set { SetProperty(ref _visionProManagers, value); } }
+
+        public VisionProManager Currvision { get => _Currvision; set => _Currvision =  value ; }
 
         private ObservableCollection<CameraInfo> _CamConfigs = new ObservableCollection<CameraInfo>();
 
-        private List<CogToolBlock> _CamTemplateS = new List<CogToolBlock>();
+        private List<VisionProManager>  _visionProManagers=new List<VisionProManager>();
 
-        private CogToolBlock cogToolBlock1;
+      //  private List<CogToolBlock> _CamTemplateS = new List<CogToolBlock>();
 
+        private CogToolBlock cogToolBlock1;
+        private VisionProManager _Currvision;
         private CameraInfo _CurrCamConfig = null;
         private ICamera myCamera;
-        private bool _isTriggerModel = false;
+        //private bool _isTriggerModel = false;
 
 
-        /// <summary>
-        /// 当前需要显示的工程文件
-        /// </summary>
-        private CogJobManagerEdit myJobManagerEdit;
+   
 
         private ObservableCollection<string> _CameraList = new ObservableCollection<string>();
 
@@ -152,13 +147,14 @@ namespace LampInspectionMachine.Core
             CameraList = FindLoadCamera();
             if (CamConfigs.Count == 0)
             {
-
-                CamConfigs.Add(new CameraInfo() { VppFileName = "Cam1.vpp" });
-                CamConfigs.Add(new CameraInfo() { VppFileName = "Cam2.vpp" });
-                CamConfigs.Add(new CameraInfo() { VppFileName = "Cam3.vpp" });
-                CamConfigs.Add(new CameraInfo() { VppFileName = "Cam4.vpp" });
-                CamConfigs.Add(new CameraInfo() { VppFileName = "Cam5.vpp" });
-                CamConfigs.Add(new CameraInfo() { VppFileName = "Cam6.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName="相机1", Id=new Guid(), SerialNumber="", VppIndex=0, VppFileName = "Cam1.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机2", Id = new Guid(), SerialNumber = "", VppIndex = 1, VppFileName = "Cam2.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机3", Id = new Guid(), SerialNumber = "", VppIndex = 2, VppFileName = "Cam3.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机4", Id = new Guid(), SerialNumber = "", VppIndex = 3, VppFileName = "Cam4.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机5", Id = new Guid(), SerialNumber = "", VppIndex = 4, VppFileName = "Cam5.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机6", Id = new Guid(), SerialNumber = "", VppIndex = 5, VppFileName = "Cam6.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机7", Id = new Guid(), SerialNumber = "", VppIndex = 6, VppFileName = "Cam7.vpp" });
+                CamConfigs.Add(new CameraInfo() { CameraName = "相机8", Id = new Guid(), SerialNumber = "", VppIndex = 7, VppFileName = "Cam8.vpp" });
             }
         }
 
@@ -169,37 +165,30 @@ namespace LampInspectionMachine.Core
 
         }
         /// <summary>
-        /// 初始化模板
+        /// 初始化相机管理
         /// </summary>
-        public void InitTemplates(TipService tipService)
+        public void InitTemplates(TipService tipService,Management management)
         {
-
-
             tipService.ShowMsg("相机模板加载2%");
-            CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam1.vpp");
-            CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载10%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam2.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载26%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam3.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载39%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam4.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载52%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam5.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载65%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam6.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载78%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam7.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载91%");
-            //cogToolBlock = ( CogToolBlock ) CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + "\\Vpp\\Cam8.vpp");
-            //CamTemplateS.Add(cogToolBlock);
-            //tipService.ShowMsg("相机模板加载99%");
+            for ( int i = 0; i < 1; i++ )
+            {
+               
+                CogToolBlock cogToolBlock = (CogToolBlock)CogSerializer.LoadObjectFromFile(Environment.CurrentDirectory + $"\\Vpp\\{CamConfigs[i].VppFileName}");
+                VisionProManager vision=new VisionProManager();
+                ICamera myCamera;
+                myCamera = CreateCamera(CamConfigs[i]);
+                if ( myCamera.IsConnected) 
+                {
+                    myCamera.ImageCallbackEvent += vision.CamCallBack;
+                    myCamera.GrabImageCallbackEvent += vision.ImageCallback;
+                }
+                vision.Camera= myCamera;
+                vision.CogToolBlock = cogToolBlock;
+                vision.CameraInfo = CamConfigs[ i ];
+                vision.Management=management;
+                VisionProManagers.Add(vision);
+                tipService.ShowMsg($"相机模板加载{(i+1)*10+2}%");
+            }
             tipService.Tcolse();
         }
 
@@ -208,20 +197,14 @@ namespace LampInspectionMachine.Core
         /// </summary>
         public void SoftTrigger()
         {
-            if (isConnected)
+            if ( CurrCamera.IsConnected )
             {
-                MyCamera.StopGrabbing();
+                CurrCamera.StopGrabbing();
                 LogHelper.Info($"软触发配置写入");
-                //MyCamera.SetTriggerModeOff();
-                //CurrCamConfig.TriggerMode = false;
-                //MyCamera.SetTriggerSoftware();
-                //if (!MyCamera.CheckImageCallbackEvent(CamCallBack))
-                //    MyCamera.ImageCallbackEvent -= CamCallBack;
-                //if (MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
-                //    MyCamera.ImageCallbackEvent += CamVisionProCallBack;
+                CurrCamera.SetTriggerMode(false,7) ;
+                CurrCamConfig.TriggerMode = false;
                 LogHelper.Info($"软触发取图");
-
-                MyCamera.Grab();
+                CurrCamera.Grab();
             }
         }
 
@@ -230,7 +213,7 @@ namespace LampInspectionMachine.Core
         /// 连续采集写入
         /// </summary>
         public void SoftTrigger__Continue()
-        {
+        {  CurrCamera.StopGrabbing();
             //MyCamera.SetTriggerModeOff();
             //CurrCamConfig.TriggerMode = false;
             //MyCamera.SetTriggerSoftware();
@@ -239,7 +222,7 @@ namespace LampInspectionMachine.Core
             //if (!MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
             //    MyCamera.ImageCallbackEvent -= CamVisionProCallBack;
             LogHelper.Info($"连续采集启动");
-            MyCamera.StartGrabbing();
+            CurrCamera.StartGrabbing();
         }
 
 
@@ -253,7 +236,7 @@ namespace LampInspectionMachine.Core
             //    MyCamera.ImageCallbackEvent -= CamCallBack;
             //if (MyCamera.CheckImageCallbackEvent(CamVisionProCallBack))
             //    MyCamera.ImageCallbackEvent += CamVisionProCallBack;
-            MyCamera.StartGrabbing();
+            CurrCamera.StartGrabbing();
         }
         /// <summary>
         /// 查找相机
@@ -263,10 +246,12 @@ namespace LampInspectionMachine.Core
             var listsn = MvCamera.GetDevices();
             if (listsn.Length > 0)
             {
+                
                 ObservableCollection<string> strings = new ObservableCollection<string>();
+                strings.Add("");
                 for (int i = 0; i < listsn.Length; i++)
                 {
-                    //strings.Add(listsn[i].);
+                    strings.Add(listsn[i].SerialNumber);
                 }
                 return strings;
             }
@@ -278,298 +263,214 @@ namespace LampInspectionMachine.Core
             }
         }
 
-        public void InitCamera(string name)
+        public bool InitCamera()
         {
-            // 初始化相机
-            if (isConnected && myCamera != null)
+            ICamera myCamera;
+            if ( CurrCamera!=null&& CurrCamera.IsConnected )
             {
-                myCamera.CloseDevice();
-                myCamera = null;
-            }
-            Guid guid = new Guid();
-            CameraService.CreateCamera(guid, new CameraInfo() { SerialNumber = name });
-            myCamera = CameraService.GetCamera(guid);
-            bool res = myCamera.OpenDevice();
+                CurrCamera.CloseDevice();
+                myCamera = CameraService.GetCamera(CurrCamera.ID);
+                bool res = myCamera.OpenDevice();
 
-            if (!res)
-            {
-                myCamera.CloseDevice();
-                myCamera = null;
-                isConnected = false;
-            }
-            else
-            {
-                isConnected = true;
-            }
-
-        }
-        public void InitCameras()
-        {
-            CameraService = new CameraService();
-            foreach (var item in CamConfigs)
-            {
-                try
+                if ( !res )
                 {
-                    CameraService.CreateCamera(item.Id, item);
-                    CameraService.GetCamera(item.Id).CameraConnectChangedEvent += Management_CameraConnectChangedEvent;
-                    if (CameraService.GetCamera(item.Id).OpenDevice())
-                    {
-
-
-                    }
-                    else
-                    {
-
-                    }
+                    myCamera.CloseDevice();
+                    myCamera = null;
+                    return false;
                 }
-                catch (Exception ex)
+                else
                 {
-
+                    CurrCamera = myCamera;
+                    CurrCamConfig.SerialNumber = myCamera.SerialNumber;
+                    if ( myCamera.IsConnected )
+                    {
+                        myCamera.ImageCallbackEvent -= Currvision.CamCallBack;
+                        myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
+                        myCamera.ImageCallbackEvent += Currvision.CamCallBack;
+                        myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
+                    }
+                    return true;
                 }
-
             }
-
-        }
-
-
-        public void CloseCamera()
-        {
-            myCamera?.StopGrabbing();
-            myCamera?.CloseDevice();
-            myCamera = null;
-            isConnected = false;
-
-
-
-        }
-
-
-        /// <summary>
-        ///图像显示
-        /// </summary>
-        /// <param name="img"></param>
-        private void CamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
-        {
-            try
-            {
-
-                Image = image;
-
-            }
-            finally
-            {
-
-            }
-
-        }
-
-        /// <summary>
-        ///图像显示
-        /// </summary>
-        /// <param name="img"></param>
-        private void MainCamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
-        {
-            try
+            else 
             {
-
-                Image = image;
-
-            }
-            finally
-            {
-
+                CurrCamera = null;
+                myCamera=CreateCamera(new CameraInfo() { SerialNumber=CurrCameraSn });
+                CurrCamera = myCamera;
+                CurrCamConfig.SerialNumber = myCamera.SerialNumber;
+                if ( myCamera.IsConnected )
+                {
+                    myCamera.ImageCallbackEvent -= Currvision.CamCallBack;
+                    myCamera.GrabImageCallbackEvent -= Currvision.ImageCallback;
+                    myCamera.ImageCallbackEvent += Currvision.CamCallBack;
+                    myCamera.GrabImageCallbackEvent += Currvision.ImageCallback;
+                }
+                return true;
             }
+            
 
         }
 
-        // 将海康相机帧数据转换为CogImage8Grey灰度图像
-        public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
+        public ICamera CreateCamera(CameraInfo  cameraInfo) 
         {
-
-            // 验证像素格式(支持MONO8/RGB8转灰度)
-            if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 &&
-                pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
-            {
-                throw new ArgumentException("Unsupported pixel format");
-            }
-
-            // 创建CogImage8Grey对象
-            CogImage8Grey cogImage = new CogImage8Grey();
-            int width = (int)pFrameInfo.nWidth;
-            int height = (int)pFrameInfo.nHeight;
-
-            // 分配内存并复制数据
-            cogImage.Allocate(width, height);
-
-            // 获取8位灰度图像像素内存区域
-            ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory(
-    CogImageDataModeConstants.ReadWrite,
-    0, 0,
-    cogImage.Width, cogImage.Height);
-            IntPtr destPtr = pixelMemory.Scan0;  // 获取像素数据指针
-
-            // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite);
-
-            if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
-            {
-                // 直接拷贝MONO8数据
-                SafeMemoryCopy(destPtr, pData, width * height);
-            }
-            else // RGB转灰度
+            Guid guid = Guid.NewGuid();
+            CameraService.CreateCamera(guid, cameraInfo);
+            ICamera myCamera = CameraService.GetCamera(guid);
+            if ( myCamera != null )
             {
-                byte[] rgbBuffer = new byte[width * height * 3];
-                Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
-
-                unsafe
+                try
                 {
-                    byte* pDest = (byte*)destPtr.ToPointer();
-                    for (int i = 0; i < rgbBuffer.Length; i += 3)
+                    bool res = myCamera.OpenDevice();
+                    if ( !res )
                     {
-                        // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B
-                        *pDest++ = (byte)(0.299 * rgbBuffer[i] +
-                                         0.587 * rgbBuffer[i + 1] +
-                                         0.114 * rgbBuffer[i + 2]);
+                        myCamera.CloseDevice();
+                        myCamera = null;
+                        return null;
+                    }
+                    else
+                    {
+                        return myCamera;
                     }
                 }
-            }
-            return cogImage;
-        }
-
-        // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像
-        public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
-        {
-            if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
-            {
-                throw new ArgumentException("Only RGB8 format supported for color conversion");
-            }
-
-            CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor();
-            int width = (int)pFrameInfo.nWidth;
-            int height = (int)pFrameInfo.nHeight;
-
-            // 分配内存
-            cogColorImage.Allocate(width, height);
-
-            // 获取三个颜色平面指针
-
-            CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red);
-            CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green);
-            CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue);
-
-
-
-            IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory(
-    CogImageDataModeConstants.ReadWrite,
-    0, 0,
-    red.Width, red.Height).Scan0;  // 获取像素数据指针
-            IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory(
-    CogImageDataModeConstants.ReadWrite,
-    0, 0,
-    red.Width, red.Height).Scan0; ;
-            IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory(
-    CogImageDataModeConstants.ReadWrite,
-    0, 0,
-    red.Width, red.Height).Scan0; ;
-
-            // 转换RGB数据到平面格式
-            byte[] rgbBuffer = new byte[width * height * 3];
-            Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
-
-            unsafe
-            {
-                byte* pRed = (byte*)redPtr.ToPointer();
-                byte* pGreen = (byte*)greenPtr.ToPointer();
-                byte* pBlue = (byte*)bluePtr.ToPointer();
-
-                for (int i = 0; i < rgbBuffer.Length; i += 3)
+                catch 
                 {
-                    *pRed++ = rgbBuffer[i];     // R
-                    *pGreen++ = rgbBuffer[i + 1]; // G
-                    *pBlue++ = rgbBuffer[i + 2];  // B
+                
                 }
             }
-            return cogColorImage;
+            return myCamera;
         }
 
-        // 使用示例(在回调函数中调用)
-        private void ImageCallback(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo, IntPtr pUser)
-        {
-            ICogImage resultImage;
-            if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
-            {
-                resultImage = ConvertToCogImage(pData, ref pFrameInfo);
-            }
-            else
-            {
-                resultImage = ConvertToColorCogImage(pData, ref pFrameInfo);
-            }
-
 
-            Image = resultImage;
-        }
 
 
 
-        /// <summary>
-        /// 视觉处理
-        /// </summary>
-        /// <param name="data"></param>
-        private void CamVisionProCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
+        public void CloseCamera()
         {
-            try
-            {
-
-                cogToolBlock1.Inputs[0].Value = image;
-                cogToolBlock1.Run();
-                Image = (ICogImage)cogToolBlock1.Outputs[6].Value;
-            }
-            finally
-            {
-
-            }
+            CurrCamera?.StopGrabbing();
+            CurrCamera?.CloseDevice();
+            CurrCamera = null;
 
         }
 
-        /// <summary>
-        /// WriteableBitmap转Bitmap图像
-        /// </summary>
-        /// <param name="wBitmap"></param>
-        /// <returns></returns>
-        public static Bitmap SafeConvert(WriteableBitmap wb)
-        {
-            Bitmap bmp = new Bitmap(wb.PixelWidth, wb.PixelHeight);
-            using (var ms = new System.IO.MemoryStream())
-            {
-                var encoder = new PngBitmapEncoder();
-                encoder.Frames.Add(BitmapFrame.Create(wb));
-                encoder.Save(ms);
-                bmp = (Bitmap)System.Drawing.Image.FromStream(ms);
-            }
-            return bmp;
-        }
-
-        // 使用Windows API实现内存拷贝(支持重叠内存区域)
-        [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", SetLastError = false)]
-        private static extern void RtlMoveMemory(IntPtr dest, IntPtr src, uint length);
-
-        // 安全封装方法(带参数校验)
-        public static void SafeMemoryCopy(IntPtr dest, IntPtr src, int byteCount)
-        {
-            if (dest == IntPtr.Zero || src == IntPtr.Zero)
-                throw new ArgumentNullException("指针参数不能为null");
 
-            if (byteCount <= 0)
-                throw new ArgumentOutOfRangeException("字节数必须大于0");
+      
+
+        //    // 将海康相机帧数据转换为CogImage8Grey灰度图像
+        //    public static ICogImage ConvertToCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
+        //    {
+
+        //        // 验证像素格式(支持MONO8/RGB8转灰度)
+        //        if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8 &&
+        //            pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
+        //        {
+        //            throw new ArgumentException("Unsupported pixel format");
+        //        }
+
+        //        // 创建CogImage8Grey对象
+        //        CogImage8Grey cogImage = new CogImage8Grey();
+        //        int width = (int)pFrameInfo.nWidth;
+        //        int height = (int)pFrameInfo.nHeight;
+
+        //        // 分配内存并复制数据
+        //        cogImage.Allocate(width, height);
+
+        //        // 获取8位灰度图像像素内存区域
+        //        ICogImage8PixelMemory pixelMemory = (cogImage).Get8GreyPixelMemory(
+        //CogImageDataModeConstants.ReadWrite,
+        //0, 0,
+        //cogImage.Width, cogImage.Height);
+        //        IntPtr destPtr = pixelMemory.Scan0;  // 获取像素数据指针
+
+        //        // IntPtr destPtr = cogImage.GetPixelData(CogImageDataModeConstants.ReadWrite);
+
+        //        if (pFrameInfo.enPixelType == MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_Mono8)
+        //        {
+        //            // 直接拷贝MONO8数据
+        //            SafeMemoryCopy(destPtr, pData, width * height);
+        //        }
+        //        else // RGB转灰度
+        //        {
+        //            byte[] rgbBuffer = new byte[width * height * 3];
+        //            Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
+
+        //            unsafe
+        //            {
+        //                byte* pDest = (byte*)destPtr.ToPointer();
+        //                for (int i = 0; i < rgbBuffer.Length; i += 3)
+        //                {
+        //                    // RGB转灰度公式:0.299*R + 0.587*G + 0.114*B
+        //                    *pDest++ = (byte)(0.299 * rgbBuffer[i] +
+        //                                     0.587 * rgbBuffer[i + 1] +
+        //                                     0.114 * rgbBuffer[i + 2]);
+        //                }
+        //            }
+        //        }
+        //        return cogImage;
+        //    }
+
+        //    // 将海康相机帧数据转换为CogImage24PlanarColor彩色图像
+        //    public static ICogImage ConvertToColorCogImage(IntPtr pData, ref MyCamera.MV_FRAME_OUT_INFO_EX pFrameInfo)
+        //    {
+        //        if (pFrameInfo.enPixelType != MvCamCtrl.NET.MyCamera.MvGvspPixelType.PixelType_Gvsp_RGB8_Packed)
+        //        {
+        //            throw new ArgumentException("Only RGB8 format supported for color conversion");
+        //        }
+
+        //        CogImage24PlanarColor cogColorImage = new CogImage24PlanarColor();
+        //        int width = (int)pFrameInfo.nWidth;
+        //        int height = (int)pFrameInfo.nHeight;
+
+        //        // 分配内存
+        //        cogColorImage.Allocate(width, height);
+
+        //        // 获取三个颜色平面指针
+
+        //        CogImage8Grey red = cogColorImage.GetPlane(CogImagePlaneConstants.Red);
+        //        CogImage8Grey green = cogColorImage.GetPlane(CogImagePlaneConstants.Green);
+        //        CogImage8Grey blue = cogColorImage.GetPlane(CogImagePlaneConstants.Blue);
+
+
+
+        //        IntPtr redPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Red).Get8GreyPixelMemory(
+        //CogImageDataModeConstants.ReadWrite,
+        //0, 0,
+        //red.Width, red.Height).Scan0;  // 获取像素数据指针
+        //        IntPtr greenPtr = cogColorImage.GetPlane(CogImagePlaneConstants.Green).Get8GreyPixelMemory(
+        //CogImageDataModeConstants.ReadWrite,
+        //0, 0,
+        //red.Width, red.Height).Scan0; ;
+        //        IntPtr bluePtr = cogColorImage.GetPlane(CogImagePlaneConstants.Blue).Get8GreyPixelMemory(
+        //CogImageDataModeConstants.ReadWrite,
+        //0, 0,
+        //red.Width, red.Height).Scan0; ;
+
+        //        // 转换RGB数据到平面格式
+        //        byte[] rgbBuffer = new byte[width * height * 3];
+        //        Marshal.Copy(pData, rgbBuffer, 0, rgbBuffer.Length);
+
+        //        unsafe
+        //        {
+        //            byte* pRed = (byte*)redPtr.ToPointer();
+        //            byte* pGreen = (byte*)greenPtr.ToPointer();
+        //            byte* pBlue = (byte*)bluePtr.ToPointer();
+
+        //            for (int i = 0; i < rgbBuffer.Length; i += 3)
+        //            {
+        //                *pRed++ = rgbBuffer[i];     // R
+        //                *pGreen++ = rgbBuffer[i + 1]; // G
+        //                *pBlue++ = rgbBuffer[i + 2];  // B
+        //            }
+        //        }
+        //        return cogColorImage;
+        //    }
 
-            RtlMoveMemory(dest, src, (uint)byteCount);
-        }
-        /// <summary>
-        /// 将WriteableBitmap转换为CogImage8Grey(自动处理彩色转灰度)
-        /// </summary>
 
         public void OnSwitchToolBlock(int index)
         {
-            cogToolBlock1 = CamTemplateS[index];
+            cogToolBlock1 = VisionProManagers[index].CogToolBlock;
+            CurrCamera= VisionProManagers[ index ].Camera;
+            CurrCamConfig = VisionProManagers[ index ].CameraInfo;
+
             ToolBlockSwitched?.Invoke(index); // 触发事件,传递索引参数。
         }
 

+ 45 - 5
Core/VisionProManager.cs

@@ -3,6 +3,7 @@ using Cognex.VisionPro.ImageFile;
 using Cognex.VisionPro.QuickBuild;
 using Cognex.VisionPro.ToolBlock;
 using LampInspectionMachine.Cameralibs;
+using LampInspectionMachine.Interfaces;
 using LampInspectionMachine.Log4xml;
 using LampInspectionMachine.Model;
 using MvCamCtrl.NET;
@@ -25,13 +26,52 @@ namespace LampInspectionMachine.Core
     public class VisionProManager
     {
 
-        
-       
-       
-       
+        private ICamera _camera;
+
+        private CogToolBlock _cogToolBlock;
+
+        private  CameraInfo _cameraInfo;
+        private Management _management;
+
+        public ICamera Camera { get => _camera; set => _camera = value; }
+        public CogToolBlock CogToolBlock { get => _cogToolBlock; set => _cogToolBlock = value; }
+        public CameraInfo CameraInfo { get => _cameraInfo; set => _cameraInfo = value; }
+        public Management Management { get => _management; set => _management =  value ; }
+
+
+
+        /// <summary>
+        ///调试图像显示
+        /// </summary>
+        /// <param name="img"></param>
+        public void CamCallBack(ICogImage image, TimeSpan totaltime, string errormessage)
+        {
+            try
+            {
+                
+                if (Management!=null)Management.Image = image;
+            }
+            finally
+            {
+
+            }
+        }
+
+        /// <summary>
+        /// 运行视觉处理
+        /// </summary>
+        public void ImageCallback(ICogImage image)
+        {
+            if ( CogToolBlock != null )
+            {
+                CogToolBlock.Inputs[ 0 ].Value = image;
+                CogToolBlock.Run();
+            }
+           // Image = ( ICogImage ) cogToolBlock.Outputs[ 6 ].Value;
+        }
+
 
 
-     
     }
 
 

+ 1 - 1
LampInspectionMachine.csproj

@@ -119,7 +119,7 @@
     </Reference>
     <Reference Include="MvCameraControl.Net, Version=4.5.0.2, Culture=neutral, PublicKeyToken=a3c7c5e3a730cd12, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
-      <HintPath>Resources\MvCameraControl.Net.dll</HintPath>
+      <HintPath>bin\Debug\MvCameraControl.Net.dll</HintPath>
     </Reference>
     <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
       <HintPath>packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>

+ 8 - 1
Model/CameraInfo.cs

@@ -45,6 +45,7 @@ namespace LampInspectionMachine.Model
 
         private string _VppFileName;
 
+        private int _VppIndex=0;
 
         public bool TriggerMode { get => triggerMode; set { SetProperty(ref triggerMode, value); } }
         public TriggerSource TriggeSource { get => triggeSource; set { SetProperty(ref triggeSource, value); } }
@@ -57,6 +58,9 @@ namespace LampInspectionMachine.Model
 
         public string VppFileName { get => _VppFileName; set { SetProperty(ref _VppFileName, value); } }
 
+
+        public int VppIndex { get => _VppIndex; set { SetProperty(ref _VppIndex, value); } }
+
         private string _CameraName;
         /// <summary>
         /// 相机名称
@@ -114,6 +118,8 @@ namespace LampInspectionMachine.Model
             set { SetProperty(ref _CameraIp, value); }
         }
 
+
+
         public CameraInfo Copy()
         {
 
@@ -134,7 +140,8 @@ namespace LampInspectionMachine.Model
                 ManufacturerName = this.ManufacturerName,
                 CameraType = this.CameraType,
                 CameraBrand = this.CameraBrand,
-                CameraIp = this.CameraIp
+                CameraIp = this.CameraIp,
+                VppIndex = this.VppIndex,
             };
         }
 

+ 12 - 8
ViewModels/CameraViewModel.cs

@@ -20,6 +20,7 @@ using System.Windows.Forms.Integration;
 using System.Threading;
 using System.Windows.Interop;
 using LampInspectionMachine.Model;
+using System.Globalization;
 
 namespace LampInspectionMachine.ViewModels
 {
@@ -88,7 +89,7 @@ namespace LampInspectionMachine.ViewModels
         private void OnCameraInit()
         {
 
-            Management.InitCamera(Management.CurrCameraSn);
+            Management.InitCamera();
 
         }
         /// <summary>
@@ -101,12 +102,15 @@ namespace LampInspectionMachine.ViewModels
             if ( navigationContext.Parameters.ContainsKey("Index") )
             {
                  index= Convert.ToInt32(navigationContext.Parameters.GetValue<string>("Index"));
-                if ( Management.CameraList!=null )
+                if ( Management.VisionProManagers!=null )
                 {
-                    if( index < Management.CameraList.Count )
-                    Management.CurrCameraSn = Management.CameraList[ index ];
-                    if ( index < Management.CamConfigs.Count )
-                        Management.CurrCamConfig = Management.CamConfigs[ index ].Copy() ;
+                    if ( index < Management.VisionProManagers.Count )
+                    {
+                        Management.CurrCamera = Management.VisionProManagers[ index ].Camera;
+                        Management.CurrCamConfig = Management.VisionProManagers[ index ].CameraInfo;
+                        Management.CurrCameraSn = Management.CurrCamConfig.SerialNumber;
+                        Management.Currvision=Management.VisionProManagers[ index ];
+                    }
                 }
             }
         }
@@ -119,9 +123,9 @@ namespace LampInspectionMachine.ViewModels
 
         public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
         {
-            if ( Management.CurrCamConfig != null ) 
+            if ( Management.CurrCamConfig != null )
             {
-                Management.CamConfigs[ index ]= Management.CurrCamConfig.Copy();
+                Management.CurrCamConfig.SerialNumber = Management.CurrCameraSn;   
             }
             continuationCallback(true);
         }

+ 1 - 1
ViewModels/MainWindowViewModel.cs

@@ -69,7 +69,7 @@ namespace LampInspectionMachine.ViewModels
         {
 
             TipService tipService = new TipService();
-            Task.Run(() => { management.InitTemplates(tipService); });
+            Task.Run(() => { management.InitTemplates(tipService,management); });
         }
 
         private void OnClose()

+ 1 - 1
Views/VisionProView.xaml.cs

@@ -34,7 +34,7 @@ namespace LampInspectionMachine.Views
 
         private void Management_ToolBlockSwitched(int obj)
         {
-            cogToolBlock.Subject = management.CamTemplateS[ obj ];
+            cogToolBlock.Subject = management.VisionProManagers[ obj ].CogToolBlock;
         }
     }
 }