diff --git a/Windows/CS/Framework4.0/Camera/Camera/Camera.cs b/Windows/CS/Framework4.0/Camera/Camera/Camera.cs index 3be679c..98da549 100644 --- a/Windows/CS/Framework4.0/Camera/Camera/Camera.cs +++ b/Windows/CS/Framework4.0/Camera/Camera/Camera.cs @@ -51,6 +51,24 @@ namespace Camera { return _ledDetector.SatLimit; } + + public void SetColorThresholds(int redMin, int redMax, int greenMin, int greenMax, int blueMin, int blueMax) + { + _ledDetector.RedMin = redMin; + _ledDetector.RedMax = redMax; + _ledDetector.GreenMin = greenMin; + _ledDetector.GreenMax = greenMax; + _ledDetector.BlueMin = blueMin; + _ledDetector.BlueMax = blueMax; + } + + public int GetRedMin() { return _ledDetector.RedMin; } + public int GetRedMax() { return _ledDetector.RedMax; } + public int GetGreenMin() { return _ledDetector.GreenMin; } + public int GetGreenMax() { return _ledDetector.GreenMax; } + public int GetBlueMin() { return _ledDetector.BlueMin; } + public int GetBlueMax() { return _ledDetector.BlueMax; } + private Color _detectionZoneColor = Color.Black; // 检测状态 @@ -488,6 +506,9 @@ namespace Camera writer.WriteLine(); writer.WriteLine(string.Format("亮灭阈值,{0},{1}", _ledDetector.BrightLimit, _ledDetector.SatLimit)); + writer.WriteLine(string.Format("红阈值,{0},{1}", _ledDetector.RedMin, _ledDetector.RedMax)); + writer.WriteLine(string.Format("绿阈值,{0},{1}", _ledDetector.GreenMin, _ledDetector.GreenMax)); + writer.WriteLine(string.Format("蓝阈值,{0},{1}", _ledDetector.BlueMin, _ledDetector.BlueMax)); } } catch { } @@ -532,6 +553,33 @@ namespace Camera continue; } + if (parts.Length >= 3 && parts[0] == "红阈值") + { + if (int.TryParse(parts[1], out int redMin)) + _ledDetector.RedMin = redMin; + if (int.TryParse(parts[2], out int redMax)) + _ledDetector.RedMax = redMax; + continue; + } + + if (parts.Length >= 3 && parts[0] == "绿阈值") + { + if (int.TryParse(parts[1], out int greenMin)) + _ledDetector.GreenMin = greenMin; + if (int.TryParse(parts[2], out int greenMax)) + _ledDetector.GreenMax = greenMax; + continue; + } + + if (parts.Length >= 3 && parts[0] == "蓝阈值") + { + if (int.TryParse(parts[1], out int blueMin)) + _ledDetector.BlueMin = blueMin; + if (int.TryParse(parts[2], out int blueMax)) + _ledDetector.BlueMax = blueMax; + continue; + } + if (parts.Length >= 4) { if (isDetectionZone) diff --git a/Windows/CS/Framework4.0/Camera/Camera/LedDetector.cs b/Windows/CS/Framework4.0/Camera/Camera/LedDetector.cs index 10e863b..e95ab64 100644 --- a/Windows/CS/Framework4.0/Camera/Camera/LedDetector.cs +++ b/Windows/CS/Framework4.0/Camera/Camera/LedDetector.cs @@ -12,6 +12,13 @@ public class LedDetector private int _brightLimit = 110; private int _satLimit = 35; + private int _redMin = 60; + private int _redMax = 75; + private int _greenMin = 30; + private int _greenMax = 60; + private int _blueMin = 90; + private int _blueMax = 130; + public int BrightLimit { get { return _brightLimit; } @@ -24,6 +31,42 @@ public class LedDetector set { _satLimit = value; } } + public int RedMin + { + get { return _redMin; } + set { _redMin = value; } + } + + public int RedMax + { + get { return _redMax; } + set { _redMax = value; } + } + + public int GreenMin + { + get { return _greenMin; } + set { _greenMin = value; } + } + + public int GreenMax + { + get { return _greenMax; } + set { _greenMax = value; } + } + + public int BlueMin + { + get { return _blueMin; } + set { _blueMin = value; } + } + + public int BlueMax + { + get { return _blueMax; } + set { _blueMax = value; } + } + public Tuple Detect(Image image, Rectangle roi) { using (Image subImg = image.GetSubRect(roi)) @@ -41,7 +84,7 @@ public class LedDetector S.Dispose(); V.Dispose(); - bool isOn = avgV > _brightLimit && avgS > _satLimit; + bool isOn = avgV > _brightLimit && avgS < _satLimit; if (!isOn) { @@ -49,11 +92,11 @@ public class LedDetector } LedColor color = LedColor.Unknown; - if ((avgH >= 60 && avgH < 75)) + if ((avgH >= _redMin && avgH < _redMax)) color = LedColor.Red; - else if (avgH >= 30 && avgH < 60) + else if (avgH >= _greenMin && avgH < _greenMax) color = LedColor.Green; - else if (avgH >= 90 && avgH < 130) + else if (avgH >= _blueMin && avgH < _blueMax) color = LedColor.Blue; return new Tuple(LedState.On, color, avgH, avgS, avgV); diff --git a/Windows/CS/Framework4.0/Camera/Camera/Setting.Designer.cs b/Windows/CS/Framework4.0/Camera/Camera/Setting.Designer.cs index 737afdb..663eabd 100644 --- a/Windows/CS/Framework4.0/Camera/Camera/Setting.Designer.cs +++ b/Windows/CS/Framework4.0/Camera/Camera/Setting.Designer.cs @@ -40,6 +40,16 @@ namespace Camera this.toolStripNumericUpDown3 = new ToolStripNumericUpDown(); this.toolStripLabel4 = new System.Windows.Forms.ToolStripLabel(); this.toolStripNumericUpDown4 = new ToolStripNumericUpDown(); + this.toolStrip4 = new System.Windows.Forms.ToolStrip(); + this.toolStripLabel7 = new System.Windows.Forms.ToolStripLabel(); + this.toolStripNumericUpDown7 = new ToolStripNumericUpDown(); + this.toolStripNumericUpDown8 = new ToolStripNumericUpDown(); + this.toolStripLabel9 = new System.Windows.Forms.ToolStripLabel(); + this.toolStripNumericUpDown9 = new ToolStripNumericUpDown(); + this.toolStripNumericUpDown10 = new ToolStripNumericUpDown(); + this.toolStripLabel11 = new System.Windows.Forms.ToolStripLabel(); + this.toolStripNumericUpDown11 = new ToolStripNumericUpDown(); + this.toolStripNumericUpDown12 = new ToolStripNumericUpDown(); this.splitContainer2 = new System.Windows.Forms.SplitContainer(); this.dataGridView1 = new System.Windows.Forms.DataGridView(); this.dataGridView2 = new System.Windows.Forms.DataGridView(); @@ -51,6 +61,7 @@ namespace Camera this.toolStrip1.SuspendLayout(); this.toolStrip2.SuspendLayout(); this.toolStrip3.SuspendLayout(); + this.toolStrip4.SuspendLayout(); this.toolStripContainer1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); this.splitContainer2.Panel1.SuspendLayout(); @@ -107,6 +118,7 @@ namespace Camera this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip1); this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip2); this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip3); + this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip4); // // toolStripContainer1.ContentPanel // @@ -210,6 +222,25 @@ namespace Camera this.toolStrip3.TabIndex = 2; this.toolStrip3.Visible = true; // + // toolStrip4 + // + this.toolStrip4.Dock = System.Windows.Forms.DockStyle.Top; + this.toolStrip4.ImageScalingSize = new System.Drawing.Size(32, 32); + this.toolStrip4.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripLabel7, + this.toolStripNumericUpDown7, + this.toolStripNumericUpDown8, + this.toolStripLabel9, + this.toolStripNumericUpDown9, + this.toolStripNumericUpDown10, + this.toolStripLabel11, + this.toolStripNumericUpDown11, + this.toolStripNumericUpDown12}); + this.toolStrip4.Location = new System.Drawing.Point(0, 85); + this.toolStrip4.Name = "toolStrip4"; + this.toolStrip4.Size = new System.Drawing.Size(559, 30); + this.toolStrip4.TabIndex = 3; + // // toolStripLabel5 // this.toolStripLabel5.Name = "toolStripLabel5"; @@ -278,6 +309,159 @@ namespace Camera 0, 0}); // + // toolStripLabel7 + // + this.toolStripLabel7.Name = "toolStripLabel7"; + this.toolStripLabel7.Size = new System.Drawing.Size(32, 27); + this.toolStripLabel7.Text = "红"; + // + // toolStripNumericUpDown7 + // + this.toolStripNumericUpDown7.AutoSize = false; + this.toolStripNumericUpDown7.DecimalPlaces = 0; + this.toolStripNumericUpDown7.Increment = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.toolStripNumericUpDown7.Maximum = new decimal(new int[] { + 180, + 0, + 0, + 0}); + this.toolStripNumericUpDown7.Minimum = new decimal(new int[] { + 0, + 0, + 0, + 0}); + this.toolStripNumericUpDown7.Name = "toolStripNumericUpDown7"; + this.toolStripNumericUpDown7.Size = new System.Drawing.Size(60, 27); + this.toolStripNumericUpDown7.Value = new decimal(new int[] { + 60, + 0, + 0, + 0}); + // + // toolStripLabel9 + // + this.toolStripLabel9.Name = "toolStripLabel9"; + this.toolStripLabel9.Size = new System.Drawing.Size(32, 27); + this.toolStripLabel9.Text = "绿"; + // + // toolStripNumericUpDown9 + // + this.toolStripNumericUpDown9.AutoSize = false; + this.toolStripNumericUpDown9.DecimalPlaces = 0; + this.toolStripNumericUpDown9.Increment = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.toolStripNumericUpDown9.Maximum = new decimal(new int[] { + 180, + 0, + 0, + 0}); + this.toolStripNumericUpDown9.Minimum = new decimal(new int[] { + 0, + 0, + 0, + 0}); + this.toolStripNumericUpDown9.Name = "toolStripNumericUpDown9"; + this.toolStripNumericUpDown9.Size = new System.Drawing.Size(60, 27); + this.toolStripNumericUpDown9.Value = new decimal(new int[] { + 30, + 0, + 0, + 0}); + // + // toolStripNumericUpDown10 + // + this.toolStripNumericUpDown10.AutoSize = false; + this.toolStripNumericUpDown10.DecimalPlaces = 0; + this.toolStripNumericUpDown10.Increment = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.toolStripNumericUpDown10.Maximum = new decimal(new int[] { + 180, + 0, + 0, + 0}); + this.toolStripNumericUpDown10.Minimum = new decimal(new int[] { + 0, + 0, + 0, + 0}); + this.toolStripNumericUpDown10.Name = "toolStripNumericUpDown10"; + this.toolStripNumericUpDown10.Size = new System.Drawing.Size(60, 27); + this.toolStripNumericUpDown10.Value = new decimal(new int[] { + 60, + 0, + 0, + 0}); + // + // toolStripLabel11 + // + this.toolStripLabel11.Name = "toolStripLabel11"; + this.toolStripLabel11.Size = new System.Drawing.Size(32, 27); + this.toolStripLabel11.Text = "蓝"; + // + // toolStripNumericUpDown11 + // + this.toolStripNumericUpDown11.AutoSize = false; + this.toolStripNumericUpDown11.DecimalPlaces = 0; + this.toolStripNumericUpDown11.Increment = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.toolStripNumericUpDown11.Maximum = new decimal(new int[] { + 180, + 0, + 0, + 0}); + this.toolStripNumericUpDown11.Minimum = new decimal(new int[] { + 0, + 0, + 0, + 0}); + this.toolStripNumericUpDown11.Name = "toolStripNumericUpDown11"; + this.toolStripNumericUpDown11.Size = new System.Drawing.Size(60, 27); + this.toolStripNumericUpDown11.Value = new decimal(new int[] { + 90, + 0, + 0, + 0}); + // + // toolStripNumericUpDown12 + // + this.toolStripNumericUpDown12.AutoSize = false; + this.toolStripNumericUpDown12.DecimalPlaces = 0; + this.toolStripNumericUpDown12.Increment = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.toolStripNumericUpDown12.Maximum = new decimal(new int[] { + 180, + 0, + 0, + 0}); + this.toolStripNumericUpDown12.Minimum = new decimal(new int[] { + 0, + 0, + 0, + 0}); + this.toolStripNumericUpDown12.Name = "toolStripNumericUpDown12"; + this.toolStripNumericUpDown12.Size = new System.Drawing.Size(60, 27); + this.toolStripNumericUpDown12.Value = new decimal(new int[] { + 130, + 0, + 0, + 0}); + // // toolStripLabel1 // this.toolStripLabel1.Name = "toolStripLabel1"; @@ -419,6 +603,12 @@ namespace Camera this.toolStripNumericUpDown4.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown4_ValueChanged); this.toolStripNumericUpDown5.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown5_ValueChanged); this.toolStripNumericUpDown6.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown6_ValueChanged); + this.toolStripNumericUpDown7.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown7_ValueChanged); + this.toolStripNumericUpDown8.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown8_ValueChanged); + this.toolStripNumericUpDown9.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown9_ValueChanged); + this.toolStripNumericUpDown10.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown10_ValueChanged); + this.toolStripNumericUpDown11.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown11_ValueChanged); + this.toolStripNumericUpDown12.ValueChanged += new System.EventHandler(this.ToolStripNumericUpDown12_ValueChanged); // // dataGridView1 // @@ -497,6 +687,8 @@ namespace Camera this.toolStrip2.PerformLayout(); this.toolStrip3.ResumeLayout(false); this.toolStrip3.PerformLayout(); + this.toolStrip4.ResumeLayout(false); + this.toolStrip4.PerformLayout(); this.toolStripContainer1.ResumeLayout(false); this.toolStripContainer1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); @@ -531,6 +723,16 @@ namespace Camera private ToolStripNumericUpDown toolStripNumericUpDown5; private System.Windows.Forms.ToolStripLabel toolStripLabel6; private ToolStripNumericUpDown toolStripNumericUpDown6; + private System.Windows.Forms.ToolStrip toolStrip4; + private System.Windows.Forms.ToolStripLabel toolStripLabel7; + private ToolStripNumericUpDown toolStripNumericUpDown7; + private ToolStripNumericUpDown toolStripNumericUpDown8; + private System.Windows.Forms.ToolStripLabel toolStripLabel9; + private ToolStripNumericUpDown toolStripNumericUpDown9; + private ToolStripNumericUpDown toolStripNumericUpDown10; + private System.Windows.Forms.ToolStripLabel toolStripLabel11; + private ToolStripNumericUpDown toolStripNumericUpDown11; + private ToolStripNumericUpDown toolStripNumericUpDown12; private System.Windows.Forms.DataGridView dataGridView1; private System.Windows.Forms.SplitContainer splitContainer2; private System.Windows.Forms.DataGridView dataGridView2; diff --git a/Windows/CS/Framework4.0/Camera/Camera/Setting.cs b/Windows/CS/Framework4.0/Camera/Camera/Setting.cs index f8d3735..316fcb4 100644 --- a/Windows/CS/Framework4.0/Camera/Camera/Setting.cs +++ b/Windows/CS/Framework4.0/Camera/Camera/Setting.cs @@ -223,6 +223,12 @@ namespace Camera _ledZoneColors = _camera.GetLedZoneColors(); toolStripNumericUpDown5.Value = _camera.GetBrightLimit(); toolStripNumericUpDown6.Value = _camera.GetSatLimit(); + toolStripNumericUpDown7.Value = _camera.GetRedMin(); + toolStripNumericUpDown8.Value = _camera.GetRedMax(); + toolStripNumericUpDown9.Value = _camera.GetGreenMin(); + toolStripNumericUpDown10.Value = _camera.GetGreenMax(); + toolStripNumericUpDown11.Value = _camera.GetBlueMin(); + toolStripNumericUpDown12.Value = _camera.GetBlueMax(); } picBoxCamera.BackColor = Color.Gray; splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2; @@ -1495,6 +1501,7 @@ namespace Camera toolStripTextBox1.Visible = false; toolStripTextBox1.Text = ""; toolStrip3.Visible = true; + toolStrip4.Visible = true; // 如果有LED区域则显示位置和宽高设置框 if (_camera != null && _camera.GetLedZoneCount() > 0) { @@ -1531,6 +1538,7 @@ namespace Camera // 不显示位置和宽高设置框 toolStrip2.Visible = false; toolStrip3.Visible = false; + toolStrip4.Visible = false; break; case 2: // 绘制状态 toolStripButton2.Visible = true; @@ -1540,6 +1548,7 @@ namespace Camera toolStripTextBox1.Text = ""; toolStrip2.Visible = false; toolStrip3.Visible = false; + toolStrip4.Visible = false; break; } } @@ -1695,5 +1704,53 @@ namespace Camera int satLimit = (int)toolStripNumericUpDown6.Value; _camera.SetLedDetectorParams(brightLimit, satLimit); } + + // 红绿蓝阈值事件 + private void ToolStripNumericUpDown7_ValueChanged(object sender, EventArgs e) + { + if (_camera == null) return; + UpdateColorThresholds(); + } + + private void ToolStripNumericUpDown8_ValueChanged(object sender, EventArgs e) + { + if (_camera == null) return; + UpdateColorThresholds(); + } + + private void ToolStripNumericUpDown9_ValueChanged(object sender, EventArgs e) + { + if (_camera == null) return; + UpdateColorThresholds(); + } + + private void ToolStripNumericUpDown10_ValueChanged(object sender, EventArgs e) + { + if (_camera == null) return; + UpdateColorThresholds(); + } + + private void ToolStripNumericUpDown11_ValueChanged(object sender, EventArgs e) + { + if (_camera == null) return; + UpdateColorThresholds(); + } + + private void ToolStripNumericUpDown12_ValueChanged(object sender, EventArgs e) + { + if (_camera == null) return; + UpdateColorThresholds(); + } + + private void UpdateColorThresholds() + { + int redMin = (int)toolStripNumericUpDown7.Value; + int redMax = (int)toolStripNumericUpDown8.Value; + int greenMin = (int)toolStripNumericUpDown9.Value; + int greenMax = (int)toolStripNumericUpDown10.Value; + int blueMin = (int)toolStripNumericUpDown11.Value; + int blueMax = (int)toolStripNumericUpDown12.Value; + _camera.SetColorThresholds(redMin, redMax, greenMin, greenMax, blueMin, blueMax); + } } }