using OpenCvSharp; using System.Diagnostics; namespace BetterGenshinImpact.Core.Recognition.OpenCv; public class OpenCvCommonHelper { /// /// 计算灰度图中某个颜色的像素个数 /// 快速遍历方法来自于: https://blog.csdn.net/TyroneKing/article/details/129108838 /// /// /// /// public static int CountGrayMatColor(Mat mat, byte color) { Debug.Assert(mat.Depth() == MatType.CV_8U); var channels = mat.Channels(); var nRows = mat.Rows; var nCols = mat.Cols * channels; if (mat.IsContinuous()) { nCols *= nRows; nRows = 1; } var sum = 0; unsafe { for (var i = 0; i < nRows; i++) { var p = mat.Ptr(i); var b = (byte*)p.ToPointer(); for (var j = 0; j < nCols; j++) if (b[j] == color) sum++; } } return sum; } public static int CountGrayMatColor(Mat mat, byte lowColor, byte highColor) { Debug.Assert(mat.Depth() == MatType.CV_8U); var channels = mat.Channels(); var nRows = mat.Rows; var nCols = mat.Cols * channels; if (mat.IsContinuous()) { nCols *= nRows; nRows = 1; } var sum = 0; unsafe { for (var i = 0; i < nRows; i++) { var p = mat.Ptr(i); var b = (byte*)p.ToPointer(); for (var j = 0; j < nCols; j++) if (b[j] >= lowColor && b[j] <= highColor) sum++; } } return sum; } public static Mat Threshold(Mat src, Scalar low, Scalar high) { using var mask = new Mat(); using var rgbMat = new Mat(); Cv2.CvtColor(src, rgbMat, ColorConversionCodes.BGR2RGB); Cv2.InRange(rgbMat, low, high, mask); Cv2.Threshold(mask, mask, 0, 255, ThresholdTypes.Binary); //二值化 return mask.Clone(); } public static Mat InRangeHsv(Mat src, Scalar low, Scalar high) { using var mask = new Mat(); using var rgbMat = new Mat(); Cv2.CvtColor(src, rgbMat, ColorConversionCodes.BGR2HSV); Cv2.InRange(rgbMat, low, high, mask); return mask.Clone(); } public static Mat Threshold(Mat src, Scalar s) { return Threshold(src, s, s); } /// /// 和二值化的颜色刚好相反 /// /// /// /// public static Mat CreateMask(Mat src, Scalar s) { var mask = new Mat(); Cv2.InRange(src, s, s, mask); return 255 - mask; } }