增加判断亮灭

This commit is contained in:
zqm
2026-03-27 11:01:55 +08:00
parent 3148da02dd
commit ef02d13445
5 changed files with 200 additions and 23 deletions

View File

@@ -23,7 +23,7 @@ namespace Camera
private const string PASSWD = "Yexian.net.168";
// 调试模式
private const Boolean IsDebug = false;
private const Boolean IsDebug = true;
// 配置文件目录
private string _configPath;
@@ -34,6 +34,22 @@ namespace Camera
private ConcurrentDictionary<int, Color> _ledZoneColors = new ConcurrentDictionary<int, Color>();
private ConcurrentDictionary<int, string> _ledZoneDetectionResults = new ConcurrentDictionary<int, string>();
private LedDetector _ledDetector = new LedDetector();
public void SetLedDetectorParams(int brightLimit, int satLimit)
{
_ledDetector.BrightLimit = brightLimit;
_ledDetector.SatLimit = satLimit;
}
public int GetBrightLimit()
{
return _ledDetector.BrightLimit;
}
public int GetSatLimit()
{
return _ledDetector.SatLimit;
}
private Color _detectionZoneColor = Color.Black;
// 检测状态
@@ -53,23 +69,13 @@ namespace Camera
public event EventHandler<ImageEventArgs> ImageCaptured;
/// <summary>
/// 根据区域编号获取颜色
/// 根据区域编号获取检测结果
/// </summary>
/// <param name="AreaNum">区域编号</param>
/// <returns>对应区域的颜色</returns>
public Color GetColor(int AreaNum)
/// <returns>检测结果字符串</returns>
public string GetColor(int AreaNum)
{
switch (AreaNum)
{
case 1:
return Color.Red;
case 2:
return Color.Green;
case 3:
return Color.Blue;
default:
return Color.Gray;
}
return GetLedZoneDetectionResult(AreaNum);
}
/// <summary>
@@ -460,6 +466,9 @@ namespace Camera
string colorStr = ColorTranslator.ToHtml(ledColor);
writer.WriteLine(string.Format("{0},{1},{2},{3},{4},{5}", index, ledZone.X, ledZone.Y, ledZone.Width, ledZone.Height, colorStr));
}
writer.WriteLine();
writer.WriteLine(string.Format("亮灭阈值,{0},{1}", _ledDetector.BrightLimit, _ledDetector.SatLimit));
}
}
catch { }
@@ -486,6 +495,7 @@ namespace Camera
{
string line;
bool isDetectionZone = true;
bool isReadingLedThresholds = false;
while ((line = reader.ReadLine()) != null)
{
if (string.IsNullOrWhiteSpace(line))
@@ -495,6 +505,15 @@ namespace Camera
}
string[] parts = line.Split(',');
if (parts.Length >= 2 && parts[0] == "亮灭阈值")
{
if (int.TryParse(parts[1], out int brightLimit))
_ledDetector.BrightLimit = brightLimit;
if (parts.Length >= 3 && int.TryParse(parts[2], out int satLimit))
_ledDetector.SatLimit = satLimit;
continue;
}
if (parts.Length >= 4)
{
if (isDetectionZone)

View File

@@ -9,8 +9,20 @@ public enum LedColor { Unknown, Red, Green, Blue }
public class LedDetector
{
private const int BRIGHT_LIMIT = 110;
private const int SAT_LIMIT = 35;
private int _brightLimit = 110;
private int _satLimit = 35;
public int BrightLimit
{
get { return _brightLimit; }
set { _brightLimit = value; }
}
public int SatLimit
{
get { return _satLimit; }
set { _satLimit = value; }
}
public Tuple<LedState, LedColor> Detect(Image<Bgr, byte> image, Rectangle roi)
{
@@ -29,7 +41,8 @@ public class LedDetector
S.Dispose();
V.Dispose();
bool isOn = avgV > BRIGHT_LIMIT && avgS < SAT_LIMIT;
//bool isOn = avgV > _brightLimit;
bool isOn = avgV > _brightLimit && avgS > _satLimit;
if (!isOn)
{
@@ -37,11 +50,11 @@ public class LedDetector
}
LedColor color = LedColor.Unknown;
if ((avgH >= 0 && avgH <= 10) || (avgH >= 170 && avgH <= 180))
if ((avgH >= 60 && avgH < 75))
color = LedColor.Red;
else if (avgH >= 35 && avgH <= 75)
else if (avgH >= 30 && avgH < 60)
color = LedColor.Green;
else if (avgH >= 90 && avgH <= 130)
else if (avgH >= 90 && avgH < 130)
color = LedColor.Blue;
return new Tuple<LedState, LedColor>(LedState.On, color);

View File

@@ -27,6 +27,11 @@ namespace Camera
this.toolStripButton4 = new System.Windows.Forms.ToolStripButton();
this.toolStripTextBox1 = new System.Windows.Forms.ToolStripTextBox();
this.toolStrip2 = new System.Windows.Forms.ToolStrip();
this.toolStrip3 = new System.Windows.Forms.ToolStrip();
this.toolStripLabel5 = new System.Windows.Forms.ToolStripLabel();
this.toolStripNumericUpDown5 = new ToolStripNumericUpDown();
this.toolStripLabel6 = new System.Windows.Forms.ToolStripLabel();
this.toolStripNumericUpDown6 = new ToolStripNumericUpDown();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.toolStripNumericUpDown1 = new ToolStripNumericUpDown();
this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
@@ -43,6 +48,7 @@ namespace Camera
((System.ComponentModel.ISupportInitialize)(this.picBoxCamera)).BeginInit();
this.toolStrip1.SuspendLayout();
this.toolStrip2.SuspendLayout();
this.toolStrip3.SuspendLayout();
this.toolStripContainer1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
this.SuspendLayout();
@@ -93,6 +99,7 @@ namespace Camera
this.toolStripContainer1.TopToolStripPanel.Padding = new System.Windows.Forms.Padding(0);
this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip1);
this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip2);
this.toolStripContainer1.TopToolStripPanel.Controls.Add(this.toolStrip3);
//
// toolStripContainer1.ContentPanel
//
@@ -181,6 +188,89 @@ namespace Camera
this.toolStrip2.Size = new System.Drawing.Size(559, 30);
this.toolStrip2.TabIndex = 1;
//
// toolStrip3
//
this.toolStrip3.Dock = System.Windows.Forms.DockStyle.Top;
this.toolStrip3.Location = new System.Drawing.Point(0, 55);
this.toolStrip3.ImageScalingSize = new System.Drawing.Size(32, 32);
this.toolStrip3.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripLabel5,
this.toolStripNumericUpDown5,
this.toolStripLabel6,
this.toolStripNumericUpDown6});
this.toolStrip3.Name = "toolStrip3";
this.toolStrip3.Size = new System.Drawing.Size(559, 30);
this.toolStrip3.TabIndex = 2;
this.toolStrip3.Visible = true;
//
// toolStripLabel5
//
this.toolStripLabel5.Name = "toolStripLabel5";
this.toolStripLabel5.Size = new System.Drawing.Size(56, 27);
this.toolStripLabel5.Text = "亮度:";
//
// toolStripNumericUpDown5
//
this.toolStripNumericUpDown5.AutoSize = false;
this.toolStripNumericUpDown5.DecimalPlaces = 0;
this.toolStripNumericUpDown5.Increment = new decimal(new int[] {
1,
0,
0,
0});
this.toolStripNumericUpDown5.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.toolStripNumericUpDown5.Minimum = new decimal(new int[] {
0,
0,
0,
0});
this.toolStripNumericUpDown5.Name = "toolStripNumericUpDown5";
this.toolStripNumericUpDown5.Size = new System.Drawing.Size(60, 27);
this.toolStripNumericUpDown5.ToolTipText = "亮度阈值";
this.toolStripNumericUpDown5.Value = new decimal(new int[] {
110,
0,
0,
0});
//
// toolStripLabel6
//
this.toolStripLabel6.Name = "toolStripLabel6";
this.toolStripLabel6.Size = new System.Drawing.Size(44, 27);
this.toolStripLabel6.Text = "饱和度:";
//
// toolStripNumericUpDown6
//
this.toolStripNumericUpDown6.AutoSize = false;
this.toolStripNumericUpDown6.DecimalPlaces = 0;
this.toolStripNumericUpDown6.Increment = new decimal(new int[] {
1,
0,
0,
0});
this.toolStripNumericUpDown6.Maximum = new decimal(new int[] {
255,
0,
0,
0});
this.toolStripNumericUpDown6.Minimum = new decimal(new int[] {
0,
0,
0,
0});
this.toolStripNumericUpDown6.Name = "toolStripNumericUpDown6";
this.toolStripNumericUpDown6.Size = new System.Drawing.Size(60, 27);
this.toolStripNumericUpDown6.ToolTipText = "饱和度阈值";
this.toolStripNumericUpDown6.Value = new decimal(new int[] {
35,
0,
0,
0});
//
// toolStripLabel1
//
this.toolStripLabel1.Name = "toolStripLabel1";
@@ -320,6 +410,8 @@ namespace Camera
0,
0});
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);
//
// dataGridView1
//
@@ -359,6 +451,8 @@ namespace Camera
this.toolStrip1.PerformLayout();
this.toolStrip2.ResumeLayout(false);
this.toolStrip2.PerformLayout();
this.toolStrip3.ResumeLayout(false);
this.toolStrip3.PerformLayout();
this.toolStripContainer1.ResumeLayout(false);
this.toolStripContainer1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit();
@@ -386,6 +480,11 @@ namespace Camera
private ToolStripNumericUpDown toolStripNumericUpDown3;
private System.Windows.Forms.ToolStripLabel toolStripLabel4;
private ToolStripNumericUpDown toolStripNumericUpDown4;
private System.Windows.Forms.ToolStrip toolStrip3;
private System.Windows.Forms.ToolStripLabel toolStripLabel5;
private ToolStripNumericUpDown toolStripNumericUpDown5;
private System.Windows.Forms.ToolStripLabel toolStripLabel6;
private ToolStripNumericUpDown toolStripNumericUpDown6;
private System.Windows.Forms.DataGridView dataGridView1;
}
}

View File

@@ -30,6 +30,9 @@ namespace Camera
// 设置NumericUpDown的基本属性
_numericUpDown.Size = new Size(60, 22);
_numericUpDown.TextAlign = HorizontalAlignment.Right;
// 转发ValueChanged事件
_numericUpDown.ValueChanged += (s, e) => ValueChanged?.Invoke(s, e);
}
[System.ComponentModel.Browsable(false)]
@@ -205,6 +208,8 @@ namespace Camera
_camera.ImageCaptured += Camera_ImageCaptured;
_detectionZoneColor = _camera.GetDetectionZoneColor();
_ledZoneColors = _camera.GetLedZoneColors();
toolStripNumericUpDown5.Value = _camera.GetBrightLimit();
toolStripNumericUpDown6.Value = _camera.GetSatLimit();
}
picBoxCamera.BackColor = Color.Gray;
splitContainer1.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
@@ -1180,14 +1185,15 @@ namespace Camera
if (dataGridView1.SelectedRows.Count > 0)
{
int newSelectedZoneIndex = Convert.ToInt32(dataGridView1.SelectedRows[0].Cells["Index"].Value);
System.Diagnostics.Debug.WriteLine("列表选中索引: " + newSelectedZoneIndex);
if (newSelectedZoneIndex != _lastSelectedZoneIndex)
{
_lastSelectedZoneIndex = newSelectedZoneIndex;
_selectedZoneIndex = newSelectedZoneIndex;
// 更新位置和宽高值
if (_selectedZoneIndex >= 0 && _camera != null)
{
Rectangle zone = _camera.GetLedZone(_selectedZoneIndex);
System.Diagnostics.Debug.WriteLine("GetLedZone(" + _selectedZoneIndex + ") 返回: X=" + zone.X + ", Y=" + zone.Y + ", W=" + zone.Width + ", H=" + zone.Height);
toolStripNumericUpDown1.Value = zone.X;
toolStripNumericUpDown2.Value = zone.Y;
toolStripNumericUpDown3.Value = zone.Width;
@@ -1391,6 +1397,7 @@ namespace Camera
toolStripButton4.Visible = false;
toolStripTextBox1.Visible = false;
toolStripTextBox1.Text = "";
toolStrip3.Visible = true;
// 如果有LED区域则显示位置和宽高设置框
if (_camera != null && _camera.GetLedZoneCount() > 0)
{
@@ -1426,6 +1433,7 @@ namespace Camera
toolStripTextBox1.Text = _currentLedIndex.ToString();
// 不显示位置和宽高设置框
toolStrip2.Visible = false;
toolStrip3.Visible = false;
break;
case 2: // 绘制状态
toolStripButton2.Visible = true;
@@ -1434,6 +1442,7 @@ namespace Camera
toolStripTextBox1.Visible = false;
toolStripTextBox1.Text = "";
toolStrip2.Visible = false;
toolStrip3.Visible = false;
break;
}
}
@@ -1475,6 +1484,7 @@ namespace Camera
Rectangle zone = _camera.GetLedZone(index);
zone.X = x;
_camera.SetLedZone(index, zone);
UpdateDataGridViewRow(index, zone);
picBoxCamera.Invalidate();
}
@@ -1500,6 +1510,7 @@ namespace Camera
Rectangle zone = _camera.GetLedZone(index);
zone.Y = y;
_camera.SetLedZone(index, zone);
UpdateDataGridViewRow(index, zone);
picBoxCamera.Invalidate();
}
@@ -1525,9 +1536,25 @@ namespace Camera
Rectangle zone = _camera.GetLedZone(index);
zone.Width = width;
_camera.SetLedZone(index, zone);
UpdateDataGridViewRow(index, zone);
picBoxCamera.Invalidate();
}
private void UpdateDataGridViewRow(int index, Rectangle zone)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (Convert.ToInt32(row.Cells["Index"].Value) == index)
{
row.Cells["X"].Value = zone.X;
row.Cells["Y"].Value = zone.Y;
row.Cells["Width"].Value = zone.Width;
row.Cells["Height"].Value = zone.Height;
break;
}
}
}
// 高度相关事件
private void ToolStripNumericUpDown4_ValueChanged(object sender, EventArgs e)
{
@@ -1550,7 +1577,26 @@ namespace Camera
Rectangle zone = _camera.GetLedZone(index);
zone.Height = height;
_camera.SetLedZone(index, zone);
UpdateDataGridViewRow(index, zone);
picBoxCamera.Invalidate();
}
// 亮度阈值事件
private void ToolStripNumericUpDown5_ValueChanged(object sender, EventArgs e)
{
if (_camera == null) return;
int brightLimit = (int)toolStripNumericUpDown5.Value;
int satLimit = (int)toolStripNumericUpDown6.Value;
_camera.SetLedDetectorParams(brightLimit, satLimit);
}
// 饱和度阈值事件
private void ToolStripNumericUpDown6_ValueChanged(object sender, EventArgs e)
{
if (_camera == null) return;
int brightLimit = (int)toolStripNumericUpDown5.Value;
int satLimit = (int)toolStripNumericUpDown6.Value;
_camera.SetLedDetectorParams(brightLimit, satLimit);
}
}
}

View File

@@ -13,7 +13,7 @@
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>x86</PlatformTarget>
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>