古今中外文史赏析

C#:霍夫圆检测参数配置化的实现方案

2025-03-15  本文已影响0人  大龙10

一、步骤

  1. 创建一个配置类或使用现有配置机制来存储霍夫圆检测的参数。

  2. 从配置文件中读取这些参数,并提供默认值以防配置缺失。

  3. 在霍夫圆检测的代码中使用这些配置参数,替换原来的硬编码值。

  4. 测试配置化后的代码,确保功能正常,并且参数调整生效。

二、实现方案

1、添加配置类(HoughConfig.cs)

public class HoughConfig
{
    // 默认参数值
    public double Dp { get; set; } = 1.0;
    public double MinDist { get; set; } = 50;
    public double Param1 { get; set; } = 80;
    public double Param2 { get; set; } = 30;
    public int MinRadius { get; set; } = 40;
    public int MaxRadius { get; set; } = 62;
    
    // 从配置文件加载
    public static HoughConfig LoadFromConfig()
    {
        return new HoughConfig
        {
            Dp = GetConfigValue("Hough.DP", 1.0),
            MinDist = GetConfigValue("Hough.MinDist", 50.0),
            Param1 = GetConfigValue("Hough.Param1", 80.0),
            Param2 = GetConfigValue("Hough.Param2", 30.0),
            MinRadius = GetConfigValue("Hough.MinRadius", 40),
            MaxRadius = GetConfigValue("Hough.MaxRadius", 62)
        };
    }

    private static T GetConfigValue<T>(string key, T defaultValue)
    {
        var value = ConfigurationManager.AppSettings[key];
        if (string.IsNullOrEmpty(value)) return defaultValue;
        
        try
        {
            return (T)Convert.ChangeType(value, typeof(T));
        }
        catch
        {
            return defaultValue;
        }
    }
}

2. 修改app.config配置文件

<configuration>
  <appSettings>
    <!-- 霍夫圆检测参数 -->
    <add key="Hough.DP" value="1.0"/>
    <add key="Hough.MinDist" value="50"/>
    <add key="Hough.Param1" value="80"/>
    <add key="Hough.Param2" value="30"/>
    <add key="Hough.MinRadius" value="40"/>
    <add key="Hough.MaxRadius" value="62"/>
  </appSettings>
</configuration>

3. 修改检测代码

// 在类成员变量中添加配置对象
private readonly HoughConfig _houghConfig = HoughConfig.LoadFromConfig();

// 修改霍夫圆检测调用部分
CircleSegment[] cs = Cv2.HoughCircles(
    m8, 
    HoughMethods.Gradient,
    _houghConfig.Dp,
    _houghConfig.MinDist,
    _houghConfig.Param1,
    _houghConfig.Param2,
    _houghConfig.MinRadius,
    _houghConfig.MaxRadius
);

4. 动态重载配置

如果需要运行时动态更新参数,可以添加配置监控:

public class HoughConfig
{
    // 添加文件监控(需要引用System.Configuration)
    private static FileSystemWatcher _configWatcher;

    public static void EnableAutoReload()
    {
        _configWatcher = new FileSystemWatcher
        {
            Path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location),
            Filter = "*.exe.config",
            NotifyFilter = NotifyFilters.LastWrite
        };

        _configWatcher.Changed += (s, e) => 
        {
            ConfigurationManager.RefreshSection("appSettings");
        };
        _configWatcher.EnableRaisingEvents = true;
    }
}

// 在程序启动时调用
HoughConfig.EnableAutoReload();

三、优化点说明:

四、使用建议:

1、参数调整建议范围:

/* 霍夫圆参数说明
DP:       建议 1-2 (图像分辨率比例)
MinDist:  圆之间的最小距离(像素)
Param1:   Canny边缘检测阈值(50-150)
Param2:   累加器阈值(20-50)
MinRadius: 最小半径(根据实际图像调整)
MaxRadius: 最大半径(根据实际图像调整)
*/

2、创建参数校验方法:

public bool Validate()
{
    var errors = new List<string>();
    if (Dp <= 0) errors.Add("DP必须大于0");
    if (MinDist <= 0) errors.Add("MinDist必须大于0");
    if (MinRadius >= MaxRadius) errors.Add("最小半径不能大于最大半径");
    return errors.Count == 0;
}

3、添加日志记录配置加载:

public static HoughConfig LoadFromConfig()
{
    var config = new HoughConfig();
    LogHelper.WriteLog($"加载霍夫参数: {JsonConvert.SerializeObject(config)}");
    return config;
}

五、总结

此方案实现了:

可以根据实际需求扩展为JSON配置文件方案,使用类似逻辑从JSON文件加载参数。

上一篇 下一篇

猜你喜欢

热点阅读