From 5ddadba291ea2d9dba78259973594a4664b94f57 Mon Sep 17 00:00:00 2001
From: C3032 <C3032@BC3032>
Date: 星期四, 08 一月 2026 16:45:35 +0800
Subject: [PATCH] 简化相机逻辑,支持手动数据处理

---
 LB_VisionProcesses/Cameras/2DCameraForm.cs |  299 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 250 insertions(+), 49 deletions(-)

diff --git a/LB_VisionProcesses/Cameras/2DCameraForm.cs b/LB_VisionProcesses/Cameras/2DCameraForm.cs
index 1bbdd63..ec8d41b 100644
--- a/LB_VisionProcesses/Cameras/2DCameraForm.cs
+++ b/LB_VisionProcesses/Cameras/2DCameraForm.cs
@@ -1,5 +1,8 @@
 锘縰sing HalconDotNet;
+using LB_SmartVisionCameraDevice.PHM6000;
 using LB_VisionControl;
+using LB_VisionProcesses.Cameras.HRCameras;
+using LB_VisionProcesses.Cameras.LBCameras;
 using MVSDK_Net;
 using Newtonsoft.Json.Linq;
 using OpenCvSharp;
@@ -37,9 +40,9 @@
         {
             InitializeComponent();
             //浼犲叆鐩告満鍙ユ焺鍚庣鐢ㄨ繛鎺�/鏂紑鎸夐敭
-            this.btnOpen.Enabled = false;
-            this.btnClose.Enabled = false;
-            this.cmbBrand.Enabled = false;
+            //this.btnOpen.Enabled = false;
+            //this.btnClose.Enabled = false;
+            //this.cmbBrand.Enabled = false;
             this.panel_Picture.Controls.Clear();
 
             this.dicCameras = dicCameras;
@@ -107,6 +110,12 @@
                 cmbSN.Text = SN;
                 cmbSN.SelectedIndex = Index;
 
+                // 濡傛灉娌℃壘鍒扮储寮曪紙鍙兘鏄柊澧炵殑锛夛紝鎵嬪姩瑙﹀彂涓�娆¢�昏緫浠ユ洿鏂癠I
+                if (Index == -1)
+                {
+                    cmbSN_SelectedIndexChanged(null, null);
+                }
+
                 ckbLocalTest.Checked = Convert.ToBoolean(camConfig.Params.Inputs["鏄惁鏈湴鍙栧浘"].ToString());
                 ckbUpParams.Checked = Convert.ToBoolean(camConfig.Params.Inputs["鏄惁姣忔鍐欏叆鍙傛暟"].ToString());
                 ckbRegrab.Checked = Convert.ToBoolean(camConfig.Params.Inputs["鏄惁澶辫触閲嶆柊鍙栧浘"].ToString());
@@ -154,10 +163,10 @@
                 switch (brand)
                 {
                     case CameraBrand.HRCamera:
-                        //camera = new HRCamera();
+                        camera = new HRCamera();
                         break;
                     case CameraBrand.LBCamera:
-                        //camera = new LBCamera();
+                        camera = new LBCamera();
                         break;
                     default:
                         Debug.WriteLine("鏈煡鍝佺墝");
@@ -195,14 +204,26 @@
                 camera = dicCameras[cmbSN.Text];
 
             //璇存槑鐩告満宸茬粡鍒濆鍖栨垚鍔�
-            if (camera != null && camera.isGrabbing)
+            if (camera != null)
             {
-                camera.ImageGrabbed -= GetImageBllComplete;
-                camera.ImageGrabbed += GetImageBllComplete;
+                int Index = cmbBrand.FindString(camera.Brand.ToString());
+                if (Index >= 0)
+                {
+                    cmbBrand.Text = camera.Brand.ToString();
+                    cmbBrand.SelectedIndex = Index;
+                }
 
-                int Index = cmbBrand.FindString(camera.Brand.ToString()); ;
-                cmbBrand.Text = camera.Brand.ToString();
-                cmbBrand.SelectedIndex = Index;
+                if (camera.isGrabbing)
+                {
+                    camera.ImageGrabbed -= GetImageBllComplete;
+                    camera.ImageGrabbed += GetImageBllComplete;
+                    this.btnEdit.Enabled = true;
+                }
+                // 濡傛灉鐩告満瀛樺湪浜庡瓧鍏镐腑锛岃鏄庢槸宸茶繛鎺ョ殑璁惧锛屽厑璁哥紪杈�
+                else if (dicCameras != null && dicCameras.ContainsKey(camera.SN))
+                {
+                    this.btnEdit.Enabled = true;
+                }
             }
         }
 
@@ -221,21 +242,25 @@
                 switch (brand)
                 {
                     case CameraBrand.LBCamera:
-                        //camera = new LBCamera();
+                        camera = new LBCamera();
                         break;
                     case CameraBrand.HRCamera:
-                        //camera = new HRCamera();
+                        camera = new HRCamera();
                         break;
                     default:
                         Debug.WriteLine($"銆恵DateTime.Now:HH:mm:ss.fff}銆戞湭鐭ュ搧鐗�");
                         return;
                 }
 
-                if (cmbSN.Items.Count > 0 && camera.InitDevice(cmbSN.Text.ToString(), this.Handle))
+                IntPtr displayHandle = onlinePictureBox.Handle;
+                onlinePictureBox.Visible = true;
+
+                if (cmbSN.Items.Count > 0 && camera.InitDevice(cmbSN.Text.ToString(), displayHandle))
                 {
                     camera.ImageGrabbed -= GetImageBllComplete;
                     camera.ImageGrabbed += GetImageBllComplete;
                     MessageBox.Show(camera.SN + "鎵撳紑鎴愬姛");
+                    this.btnEdit.Enabled = true;
                 }
             }
             else
@@ -273,24 +298,103 @@
 
             if (camera.CloseDevice())
             {
+                onlinePictureBox.Visible = true;
                 MessageBox.Show(camera.SN + "鏂紑鎴愬姛");
                 this.panel_Picture.Controls.Clear();
+                this.panel_Picture.Controls.Add(onlinePictureBox);
             }
         }
 
         private void btnEdit_Click(object sender, EventArgs e)
         {
             if (camera == null)
+            {
                 return;
+            }
+            using (Form editForm = new Form())
+            {
+                editForm.Text = "楂樼骇鍙傛暟璁剧疆 - " + camera.SN;
+                editForm.Size = new System.Drawing.Size(400, 500);
+                editForm.StartPosition = FormStartPosition.CenterParent;
+                editForm.FormBorderStyle = FormBorderStyle.SizableToolWindow;
+
+                PropertyGrid pg = new PropertyGrid();
+                pg.Dock = DockStyle.Fill;
+
+                if (camera is LBCamera phmCamera)
+                {
+                    pg.SelectedObject = phmCamera.GetSensorConfig();
+                    pg.PropertyValueChanged += (s, ev) =>
+                    {
+                        phmCamera.UpdateSensorConfig((PHM6000SensorConfig)pg.SelectedObject);
+                    };
+                }
+                else
+                {
+                    pg.SelectedObject = new CameraAdvancedSettings(camera);
+                }
+
+                editForm.Controls.Add(pg);
+                editForm.ShowDialog();
+            }
+        }
+
+        /// <summary>
+        /// 鐩告満楂樼骇璁剧疆鍖呰绫�
+        /// </summary>
+        public class CameraAdvancedSettings
+        {
+            private BaseCamera _camera;
+            public CameraAdvancedSettings(BaseCamera camera)
+            {
+                _camera = camera;
+            }
+
+            [System.ComponentModel.Category("瑙﹀彂璁剧疆"), System.ComponentModel.Description("瑙﹀彂婧�")]
+            public TriggerSource TriggerSource
+            {
+                get { _camera.GetTriggerMode(out _, out TriggerSource s); return s; }
+                set { _camera.GetTriggerMode(out TriggerMode m, out _); _camera.SetTriggerMode(m, value); }
+            }
+
+            [System.ComponentModel.Category("瑙﹀彂璁剧疆"), System.ComponentModel.Description("瑙﹀彂鏋佹��")]
+            public TriggerPolarity TriggerPolarity
+            {
+                get { _camera.GetTriggerPolarity(out TriggerPolarity p); return p; }
+                set { _camera.SetTriggerPolarity(value); }
+            }
+
+            [System.ComponentModel.Category("瑙﹀彂璁剧疆"), System.ComponentModel.Description("瑙﹀彂寤舵椂(us)")]
+            public double TriggerDelay
+            {
+                get { _camera.GetTriggerDelay(out double d); return d; }
+                set { _camera.SetTriggerDelay(value); }
+            }
+
+            [System.ComponentModel.Category("瑙﹀彂璁剧疆"), System.ComponentModel.Description("瑙﹀彂婊ゆ尝(us)")]
+            public double TriggerFilter
+            {
+                get { _camera.GetTriggerFliter(out double f); return f; }
+                set { _camera.SetTriggerFliter(value); }
+            }
+
+            [System.ComponentModel.Category("鍥惧儚璁剧疆"), System.ComponentModel.Description("鑷姩鐧藉钩琛�")]
+            public void AutoBalanceWhite()
+            {
+                _camera.AutoBalanceWhite();
+            }
         }
 
         /// <summary>
         /// 鐩告満鍥炶皟杩愯
+        /// 娉ㄦ剰锛氬浜嶭BCamera锛�3D绾挎壂鐩告満锛夛紝浣跨敤SDK鑷姩鏄剧ず妯″紡
+        /// SDK浼氳嚜鍔ㄥ皢鍥惧儚鏄剧ず鍒板搴旂殑鎺т欢涓婏紝姝ゅ洖璋冨彧鐢ㄤ簬缁熻閲囬泦娆℃暟
         /// </summary>
         /// <param name="CCDName"></param>
         /// <param name="image"></param>
         private void GetImageBllComplete(object sender, CameraEventArgs e)
         {
+            // 瀵逛簬2D鐩告満锛堟墜鍔ㄥ鐞嗘ā寮忥級鍜岀幇鍦ㄧ殑LBCamera锛堟墜鍔ㄥ鐞嗘ā寮忥級
             if (e.Bitmap == null)
                 return;
 
@@ -308,7 +412,6 @@
                     onlinePictureBox.Image = e.Bitmap;
                 }
             }
-
             total.iImageCount++;
             try
             {
@@ -331,23 +434,79 @@
 
             Task.Factory.StartNew(() =>
             {
-                //camera.GetCamConfig(out CameraConfig OriCamConfig);
-
+                // 璁剧疆鏇濆厜鍜屽鐩�
                 camera.SetExpouseTime(Convert.ToDouble(txtExp.Text));
                 camera.SetGain(Convert.ToDouble(txtGain.Text));
 
-                camera.GetImageWithSoftTrigger(out Bitmap bitmap);
+                bool success = false;
+                Bitmap bitmap = null;
 
-                this.BeginInvoke(new Action(() =>
+                // 璋冪敤鍩虹被鎺ュ彛鐨勫崟娆¢噰闆嗘柟娉�
+                // LBCamera閲嶅啓浜哠tartSingleGrab鏂规硶锛屽叾浠栫浉鏈鸿皟鐢ㄨ繑鍥瀎alse
+                success = camera.StartSingleGrab();
+
+                if (success)
                 {
-                    if (bitmap != null)
-                        this.lblCapTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms";
-                    else
-                        this.lblCapTime.Text = "-1ms";
-                }));
+                    // 绛夊緟鍥惧儚鏁版嵁
+                    using (AutoResetEvent waitHandle = new AutoResetEvent(false))
+                    {
+                        Bitmap captured = null;
+                        EventHandler<CameraEventArgs> handler = (s, evt) =>
+                        {
+                            if (evt.Bitmap != null)
+                            {
+                                captured = evt.Bitmap.Clone() as Bitmap;
+                                waitHandle.Set();
+                            }
+                        };
 
-                //澶嶅師鍘熼�氳鍙h缃�
-                //camera.SetCamConfig(OriCamConfig);
+                        camera.ImageGrabbed += handler;
+                        try
+                        {
+                            // 绛夊緟5绉掕秴鏃�
+                            if (waitHandle.WaitOne(5000))
+                            {
+                                bitmap = captured;
+                            }
+                        }
+                        finally
+                        {
+                            camera.ImageGrabbed -= handler;
+                            camera.StopGrabbing();
+                        }
+                    }
+
+                    this.BeginInvoke(new Action(() =>
+                    {
+                        if (bitmap != null)
+                        {
+                            this.lblCapTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms";
+                            onlinePictureBox.Image = bitmap;
+                        }
+                        else
+                        {
+                            this.lblCapTime.Text = "-1ms";
+                        }
+                    }));
+                }
+                else
+                {
+                    // 濡傛灉StartSingleGrab澶辫触锛屽洖閫�鍒颁紶缁熺殑GetImageWithSoftTrigger
+                    camera.GetImageWithSoftTrigger(out bitmap);
+
+                    this.BeginInvoke(new Action(() =>
+                    {
+                        if (bitmap != null)
+                        {
+                            this.lblCapTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms";
+                            onlinePictureBox.Image = bitmap;
+                        }
+                        else
+                        {
+                            this.lblCapTime.Text = "-1ms";
+                        }
+                    }));
+                }
             });
         }
 
@@ -358,12 +517,12 @@
 
             total.Clear();
 
-            // 灏濊瘯灏嗚緭鍏ュ瓧绗︿覆杞崲涓烘灇涓惧��
-            if (Enum.TryParse(cmbBrand.Text, true, out CameraBrand brand))
-            {
-                camera.StopGrabbing();
-                camera.StartWith_HardTriggerModel();
-            }
+            // 鍋滄褰撳墠閲囬泦
+            camera.StopGrabbing();
+
+            // 璋冪敤鍩虹被鎺ュ彛鐨勮繛缁噰闆嗘柟娉�
+            // LBCamera浼氳皟鐢⊿tartContinuousGrab鏂规硶锛屽叾浠栫浉鏈轰娇鐢ㄥ師鏈夌殑StartWith_HardTriggerModel
+            camera.StartContinuousGrab();
 
             startGrabtime = DateTime.Now;
 
@@ -378,18 +537,15 @@
 
             total.Clear();
 
-            // 灏濊瘯灏嗚緭鍏ュ瓧绗︿覆杞崲涓烘灇涓惧��
-            if (Enum.TryParse(cmbBrand.Text, true, out CameraBrand brand))
-            {
-                Task.Factory.StartNew(() =>
-                {
-                    camera.StopGrabbing();
-                    camera.StartWith_SoftTriggerModel();
+            // 鍋滄褰撳墠閲囬泦
+            camera.StopGrabbing();
 
-                });
-            }
+            // 璋冪敤鍩虹被鎺ュ彛鐨勮繛缁噰闆嗘柟娉�
+            // LBCamera浼氳皟鐢⊿tartContinuousGrab鏂规硶锛屽叾浠栫浉鏈轰娇鐢ㄥ師鏈夌殑StartWith_SoftTriggerModel
+            camera.StartContinuousGrab();
 
             startGrabtime = DateTime.Now;
+
             cmbSN.Enabled = false;
             cmbBrand.Enabled = false;
         }
@@ -407,8 +563,11 @@
                     Task.Factory.StartNew(() =>
                     {
                         camera.StopGrabbing();
-                        camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software);
-                        camera.StartGrabbing();
+                        if (brand != CameraBrand.LBCamera)
+                        {
+                            camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software);
+                            camera.StartGrabbing();
+                        }
                     });
                 }
 
@@ -516,9 +675,25 @@
 
             if (res == DialogResult.Yes)  //淇濆瓨VPP
             {
+                TriggerSource actualSource = TriggerSource.Line0;
+                TriggerPolarity polarity = TriggerPolarity.RisingEdge;
+                double delay = 0;
+                double filter = 0;
+
+                if (camera != null)
+                {
+                    camera.GetTriggerMode(out _, out actualSource);
+                    camera.GetTriggerPolarity(out polarity);
+                    camera.GetTriggerDelay(out delay);
+                    camera.GetTriggerFliter(out filter);
+                }
+
                 camConfig.Params.Inputs.Add("鐩告満SN", cmbSN.Text);
                 camConfig.Params.Inputs.Add("瑙﹀彂妯″紡", TriggerMode.On);
-                camConfig.Params.Inputs.Add("瑙﹀彂鏂瑰紡", radioButtonSoft.Checked ? TriggerSource.Software : TriggerSource.Line0);
+                camConfig.Params.Inputs.Add("瑙﹀彂鏂瑰紡", radioButtonSoft.Checked ? TriggerSource.Software : actualSource);
+                camConfig.Params.Inputs.Add("瑙﹀彂鏋佹��", polarity);
+                camConfig.Params.Inputs.Add("瑙﹀彂寤舵椂", delay);
+                camConfig.Params.Inputs.Add("瑙﹀彂娑堟姈", filter);
                 camConfig.Params.Inputs.Add("鏄惁鏈湴鍙栧浘", ckbLocalTest.Checked);
                 camConfig.Params.Inputs.Add("鏈湴鍙栧浘璺緞", cmbImagesPath.Items.Cast<string>().ToList());
                 camConfig.Params.Inputs.Add("鏄惁澶辫触閲嶆柊鍙栧浘", ckbRegrab.Checked);
@@ -541,18 +716,28 @@
 
         private void CameraForm_FormClosed(object sender, FormClosedEventArgs e)
         {
+            onlinePictureBox.Visible = true;
+            this.panel_Picture.Controls.Clear();
+            this.panel_Picture.Controls.Add(onlinePictureBox);
+            
             this.onlinePictureBox.Image = null;
             if (camera != null)
             {
                 camera.ImageGrabbed -= GetImageBllComplete;
                 camera.StopGrabbing();
 
+                camera.GetTriggerMode(out _, out TriggerSource actualSource);
                 if (radioButtonSoft.Checked)
                     camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software);
                 else
-                    camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0);
+                    camera.SetTriggerMode(TriggerMode.On, actualSource);
 
-                camera.StartGrabbing();
+                // LBCamera鍦⊿tartGrabbing鏃朵細鐩存帴寮�鍚縺鍏夊拰閲囬泦锛屽洜姝ゅ叧闂獥鍙f椂涓嶅簲鑷姩閲嶅惎閲囬泦
+                // 鍏朵粬鐩告満(濡�2D鐩告満)閫氬父闇�瑕佷繚鎸丟rabbing鐘舵�佷互鎺ユ敹瑙﹀彂
+                if (camera.Brand != CameraBrand.LBCamera)
+                {
+                    camera.StartGrabbing();
+                }
             }
 
             //璺緞涓虹┖璇存槑涓烘祴璇曟ā寮忥紝闇�瑕侀噴鏀剧浉鏈�
@@ -620,10 +805,21 @@
 
             if (camera == null)
                 return;
+
+            camera.GetTriggerMode(out _, out TriggerSource currentSource);
+
             if (radioButtonSoft.Checked)
+            {
                 camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software);
+            }
             else
-                camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0);
+            {
+                // 濡傛灉褰撳墠宸茬粡鏄‖浠惰Е鍙戞簮锛屽垯淇濇寔锛涘惁鍒欓粯璁ine0
+                if (currentSource == TriggerSource.Software)
+                    camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0);
+                else
+                    camera.SetTriggerMode(TriggerMode.On, currentSource);
+            }
         }
 
         System.Windows.Forms.ToolTip ToolTip = new System.Windows.Forms.ToolTip();
@@ -649,12 +845,17 @@
 
         private void controlBox_2DCameraForm_Click(object sender, EventArgs e)
         {
-            
+
         }
 
         private void dungeonControlBox_2DCameraForm_Click(object sender, EventArgs e)
         {
-           // this.Close();
+            // this.Close();
+        }
+
+        private void theme_2DCameraForm_Click(object sender, EventArgs e)
+        {
+
         }
     }
 }

--
Gitblit v1.9.3