using LB_SmartVisionCameraDevice.PHM6000; using LB_SmartVisionCommon; using LB_VisionControls; using LB_VisionProcesses.Cameras; using LB_VisionProcesses.Cameras.HikCameras; using LB_VisionProcesses.Cameras.HRCameras; using LB_VisionProcesses.Cameras.LBCameras; using LB_VisionProcesses.Cameras.LocalCameras; using LB_VisionProcesses.Cameras.MicroCameras; using LB_VisionProcesses.Cameras.MindCameras; using ReaLTaiizor.Forms; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Linq; using static System.Net.Mime.MediaTypeNames; using static System.Windows.Forms.VisualStyles.VisualStyleElement; namespace LB_SmartVision.Forms.Pages.CameraPage { public partial class CameraForm : Form { BaseCamera camera { get; set; } UserPictureBox onlinePictureBox { get; set; } public CameraForm() { InitializeComponent(); } public CameraForm(BaseCamera camera) { InitializeComponent(); // 使用 LINQ 获取所有枚举值并打印 var brands = Enum.GetValues(typeof(CameraBrand)).Cast(); foreach (var brand in brands) { uiComboBoxBrand.Items.Add(brand.ToString()); } if (camera == null) { return; } this.camera = camera; this.Text = camera.SN; //设置品牌 if (camera is HRCamera) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(HRCamera).Name); } else if (camera is LBCamera) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(LBCamera).Name); } else if (camera is LocalCamera) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(LocalCamera).Name); } else if (camera is HikCamera) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(HikCamera).Name); } else if (camera is HikCodeReader) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(HikCodeReader).Name); } else if (camera is MindCamera) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(MindCamera).Name); } else if (camera is MicroCamera) { uiComboBoxBrand.SelectedIndex = uiComboBoxBrand.FindString(typeof(MicroCamera).Name); } onlinePictureBox = new UserPictureBox(uiGroupBoxImage); this.uiGroupBoxImage.Controls.Clear(); this.uiGroupBoxImage.Controls.Add(onlinePictureBox); onlinePictureBox.Dock = DockStyle.Fill; //设置触发 camera.GetTriggerMode(out TriggerMode triggerMode, out TriggerSource triggerSource); if (triggerSource == TriggerSource.Software) { uiRadioButtonSoftTrigger.Checked = true; } else { uiRadioButtonHardTrigger.Checked = true; } uiButtonGrabOnce.Enabled = uiRadioButtonSoftTrigger.Checked; uiButtonStartSoftGrab.Enabled = uiRadioButtonSoftTrigger.Checked; uiButtonCloseSoftGrab.Enabled = uiRadioButtonSoftTrigger.Checked; uiButtonStartHardGrab.Enabled = !uiRadioButtonSoftTrigger.Checked; //设置曝光和增益 camera.GetExpouseTime(out double exp); uiTextBoxExp.Text = exp.ToString(); camera.GetGain(out double gain); uiTextBoxGain.Text = gain.ToString(); //加载回调函数 Subscribe(); uiButtonStartHardGrab.ForeColor = Color.White; } private void CameraForm_FormClosing(object sender, FormClosingEventArgs e) { if (camera == null) { return; } camera.StopGrabbing(); if (uiRadioButtonSoftTrigger.Checked) { camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software); } else { camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0); } // 注释掉自动启动采集逻辑,防止关闭窗体后相机自动连续采集 // 用户需要手动点击"启动采集"按钮才会启动相机 // camera.StartGrabbing(); Unsubscribe(); } public void Unsubscribe() { try { if (camera == null) { return; } //取消回调函数 camera.ImageGrabbed -= GetImageBllComplete; } catch (Exception ex) { // 记录错误信息 Debug.WriteLine($"错误: {ex.Message}"); } } public void Subscribe() { try { if (camera == null) { return; } //取消回调函数 camera.ImageGrabbed -= GetImageBllComplete; //加载回调函数 camera.ImageGrabbed += GetImageBllComplete; } catch (Exception ex) { // 记录错误信息 Debug.WriteLine($"错误: {ex.Message}"); } } private void uiRadioButtonSoftTrigger_CheckedChanged(object sender, EventArgs e) { uiButtonGrabOnce.Enabled = uiRadioButtonSoftTrigger.Checked; uiButtonStartSoftGrab.Enabled = uiRadioButtonSoftTrigger.Checked; uiButtonCloseSoftGrab.Enabled = uiRadioButtonSoftTrigger.Checked; uiButtonStartHardGrab.Enabled = !uiRadioButtonSoftTrigger.Checked; if (camera == null) { return; } if (uiRadioButtonSoftTrigger.Checked) { camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software); } else { camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0); } } private void uiButtonGrabOnce_Click(object sender, EventArgs e) { if (camera == null) { return; } Task.Factory.StartNew(() => { DateTime startTime = DateTime.Now; // 当前时间 camera.GetImageWithSoftTrigger(out Bitmap bitmap); this.BeginInvoke(new Action(() => { if (bitmap != null) { this.uiTextBoxGrabTime.Text = (DateTime.Now - startTime).TotalMilliseconds.ToString(); } else { this.uiTextBoxGrabTime.Text = "-1ms"; } })); }); } private void uiButtonStartSoftGrab_Click(object sender, EventArgs e) { if (camera == null) { return; } Task.Factory.StartNew(() => { camera.StopGrabbing(); camera.StartWith_SoftTriggerModel(); }); } private void uiButtonCloseSoftGrab_Click(object sender, EventArgs e) { if (camera == null) { return; } Task.Factory.StartNew(() => { camera.StopGrabbing(); camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software); //camera.StartGrabbing(); }); } private void uiButtonStartHardGrab_Click(object sender, EventArgs e) { if (camera == null) { return; } Task.Factory.StartNew(() => { camera.StopGrabbing(); camera.StartWith_HardTriggerModel(); }); } /// /// 相机回调运行 /// /// /// private void GetImageBllComplete(object sender, CameraEventArgs e) { if (e.Bitmap == null) { return; } lock (e.Bitmap) { if (this.InvokeRequired) // 检查是否需要在UI线程上调用 { this.Invoke(new Action(() => { onlinePictureBox.Image = e.Bitmap; })); // 递归调用自身,但这次在UI线程上 } else { onlinePictureBox.Image = e.Bitmap; } } } /// /// 读码回调运行 /// /// /// private void GetCodeImageBllComplete(object sender, HikCodeReaderEventArgs e) { if (e.Bitmap == null && e.Image == null) return; if (e.pixelType == HikCodeReaderEventArgs.PixelType.Mono8 && e.Bitmap != null) { lock (e.Bitmap) { onlinePictureBox.Image = e.Bitmap; } } else if (e.pixelType == HikCodeReaderEventArgs.PixelType.Jpeg && e.Image != null) { lock (e.Image) { ImageWidth = (ulong)e.Image.Width; ImageHeight = (ulong)e.Image.Height; onlinePictureBox.Image = new Bitmap(e.Image); } } } private ulong ImageWidth; private ulong ImageHeight; private Pen pen = new Pen(Color.Blue, 3f); private System.Drawing.Point[] stPointList = new System.Drawing.Point[4]; private void pictureBox_Paint(object sender, PaintEventArgs e) { if (!(camera is HikCodeReader)) return; #region 屏蔽 //for (int i = 0; i < ((HikCodeReader)camera).resultEx.nCodeNum; i++) //{ // for (int j = 0; j < 4; j++) // { // float num = (float)resultPictureBox.Size.Width / (float)ImageWidth; // float num2 = (float)resultPictureBox.Size.Height / (float)ImageHeight; // float num3 = Math.Min(num, num2); // if (num > num2) // { // stPointList[j].X = (int)((float)((HikCodeReader)camera).resultEx.stBcrInfoEx[i].pt[j].x * num3) // + (int)(((float)resultPictureBox.Size.Width - (float)ImageWidth * num3) / 2f); // stPointList[j].Y = (int)((float)((HikCodeReader)camera).resultEx.stBcrInfoEx[i].pt[j].y * num3); // } // else // { // stPointList[j].X = (int)((float)((HikCodeReader)camera).resultEx.stBcrInfoEx[i].pt[j].x * num3); // stPointList[j].Y = (int)((float)((HikCodeReader)camera).resultEx.stBcrInfoEx[i].pt[j].y * num3) // + (int)(((float)resultPictureBox.Size.Height - (float)ImageHeight * num3) / 2f); // } // } // e.Graphics.DrawPolygon(pen, stPointList); // Font font = new Font("微软雅黑", 10f, FontStyle.Bold); // Brush brush = new SolidBrush(Color.AntiqueWhite); // string strCode = Encoding.Default.GetString(((HikCodeReader)camera).resultEx.stBcrInfoEx[i].chCode).TrimEnd(default(char)); // e.Graphics.DrawString(strCode, font, brush, stPointList[3]); //} #endregion } private void uiTextBoxExp_TextChanged(object sender, EventArgs e) { if (camera == null) { return; } double exp = 1000; if (double.TryParse(uiTextBoxExp.Text.ToString(), out exp)) { camera.SetExpouseTime(exp); } } private void uiTextBoxGain_TextChanged(object sender, EventArgs e) { if (camera == null) { return; } double gain = 10; if (double.TryParse(uiTextBoxGain.Text.ToString(), out gain)) { camera.SetGain(gain); } } private void cob_Brand_SelectedIndexChanged(object sender, EventArgs e) { if (uiComboBoxBrand.Text == "MindCamera" || uiComboBoxBrand.Text == "LBCamera") { btnSetting.Visible = true; } else { btnSetting.Visible = false; } } private void btn_Setting_Click(object sender, EventArgs e) { if (uiComboBoxBrand.Text == "MindCamera" && camera != null && camera is MindCamera mindCamera) { mindCamera.SetSetting(); } else if (uiComboBoxBrand.Text == "LocalCamera" && camera != null && camera is LocalCamera localCamera) { localCamera.SetSetting(); } else { 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); //相机参数保存到本地 if (GlobalVar.allLBCameras.Keys.Contains(phmCamera.SN)) { GlobalVar.allLBCameras[phmCamera.SN] = (PHM6000SensorConfig)pg.SelectedObject; } else { GlobalVar.allLBCameras.TryAdd(phmCamera.SN, (PHM6000SensorConfig)pg.SelectedObject); } ConfigManager>.SaveConfig>(GlobalVar.allLBCameras, GlobalVar.allCamerasLBPath); }; } else { pg.SelectedObject = new CameraAdvancedSettings(camera); } editForm.Controls.Add(pg); editForm.ShowDialog(); } } } } }