using OpenCvSharp; namespace BetterGenshinImpact.Test.Cv; public class ThresholdWindow { private Mat? _originalImage; private Mat? _grayImage; private int _currentThreshold = 160; public static void Test() { var window = new ThresholdWindow(); window.ShowThresholdAdjuster(@"E:\HuiTask\更好的原神\自动秘境\自动战斗\队伍识别\当前角色小三角\无法识别小三角2.png"); } public static void Save() { var image = Cv2.ImRead(@"E:\HuiTask\更好的原神\自动秘境\自动战斗\队伍识别\22.png"); var grayImage = new Mat(); Cv2.CvtColor(image, grayImage, ColorConversionCodes.BGR2GRAY); var thresholdImage = new Mat(); Cv2.Threshold(grayImage, thresholdImage, 200, 255, ThresholdTypes.Binary); Cv2.ImWrite(@"E:\HuiTask\更好的原神\自动秘境\自动战斗\队伍识别\22-threshold.png", thresholdImage); } /// /// 对指定图片进行二值化阈值拉条调整 /// /// 图片路径 public void ShowThresholdAdjuster(string imagePath) { // 加载原始图像 _originalImage = Cv2.ImRead(imagePath); if (_originalImage.Empty()) { throw new ArgumentException("无法加载图像文件"); } // 转换为灰度图像 _grayImage = new Mat(); Cv2.CvtColor(_originalImage, _grayImage, ColorConversionCodes.BGR2GRAY); // 创建窗口 const string windowName = "Threshold Adjuster"; const string trackbarName = "Threshold"; Cv2.NamedWindow(windowName, WindowFlags.AutoSize); // 创建拉条,范围0-255 Cv2.CreateTrackbar(trackbarName, windowName, ref _currentThreshold, 255, OnThresholdChanged); // 初始显示 UpdateThresholdImage(windowName); // 等待用户按键 Console.WriteLine("按任意键关闭窗口..."); Cv2.WaitKey(0); // 清理资源 Cv2.DestroyAllWindows(); _originalImage?.Dispose(); _grayImage?.Dispose(); } /// /// 阈值变化回调函数 /// /// 阈值 /// 用户数据指针(未使用) private void OnThresholdChanged(int value, IntPtr userdata) { _currentThreshold = value; UpdateThresholdImage("Threshold Adjuster"); } /// /// 更新二值化图像显示 /// /// 窗口名称 private void UpdateThresholdImage(string windowName) { if (_grayImage == null) return; using var thresholdImage = new Mat(); Cv2.Threshold(_grayImage, thresholdImage, _currentThreshold, 255, ThresholdTypes.Binary); Cv2.ImShow(windowName, thresholdImage); } }