public ImagePatternDigit LoadDigitEntry(XmlElement xmlElem) { ImagePatternDigit result = new ImagePatternDigit(-1, null); if (xmlElem != null && xmlElem.Name == "digit" && xmlElem.HasAttribute("type") && xmlElem.HasAttribute("value")) { string typeName = xmlElem.GetAttribute("type"); string hashValue = xmlElem.GetAttribute("value"); result = new ImagePatternDigit(int.Parse(typeName), ImageDataDigit.FromHexString(hashValue)); } return(result); }
public List <ImagePatternDigit> LoadDigitHashes(JsonParser.ArrayValue jsonArr) { List <ImagePatternDigit> list = new List <ImagePatternDigit>(); foreach (JsonParser.Value value in jsonArr.entries) { JsonParser.ObjectValue jsonOb = (JsonParser.ObjectValue)value; string hashValue = (JsonParser.StringValue)jsonOb["hash"]; ImagePatternDigit digitHash = new ImagePatternDigit((JsonParser.IntValue)jsonOb["id"], ImageDataDigit.FromHexString(hashValue)); list.Add(digitHash); } return(list); }
public ImagePatternDigit(int value, byte[] pixelMask) { PixelMask = pixelMask; Value = value; Hash = ImageDataDigit.ToHexString(PixelMask); }
public static int FindPatternMatch(FastBitmapHSV bitmap, Point pos, FastPixelMatch colorMatch, List <ImagePatternDigit> patterns, out ImageDataDigit digitData, bool bDebugMode = false) { int bestValue = 0; int bestValueExact = 0; float totalBestScore = 0; float totalBestScoreExact = 0; const int offsetSize = 5; const int cacheWidth = offsetSize + 10 + offsetSize; const int cacheHeight = offsetSize + 8 + offsetSize; byte[] PixelMatch = new byte[cacheWidth * cacheHeight]; int bestPatternMatchX = 0; int bestPatternExactX = 0; int bestPatternMatchY = 0; int bestPatternExactY = 0; foreach (ImagePatternDigit pattern in patterns) { float bestScore = 0; float bestScoreExact = 0; int bestPosX = 0; int bestPosXExact = 0; int bestPosY = 0; int bestPosYExact = 0; int ByteIdx = 0; for (int IdxY = 0; IdxY < cacheHeight; IdxY++) { for (int IdxX = 0; IdxX < cacheWidth; IdxX++) { FastPixelHSV testPx = bitmap.GetPixel(pos.X + IdxX - offsetSize, pos.Y + IdxY - offsetSize); PixelMatch[ByteIdx] = colorMatch.IsMatching(testPx) ? (byte)1 : (byte)0; ByteIdx++; } } /*if (bDebugMode) * { * bestPosX = 894; * bestPosY = 615; * bestScore = HasPatternMatch(PixelMatch, bestPosX - pos.X + offsetSize, bestPosY - pos.Y + offsetSize, cacheWidth, * pattern, pattern.Value == 3 || pattern.Value == 5 || pattern.Value == 8); * } * else*/ { for (int offsetX = -offsetSize; offsetX <= offsetSize; offsetX++) { for (int offsetY = -offsetSize; offsetY <= offsetSize; offsetY++) { float testScore = HasPatternMatch(PixelMatch, offsetX + offsetSize, offsetY + offsetSize, cacheWidth, false, pattern); if (testScore > bestScore) { bestPosX = pos.X + offsetX; bestPosY = pos.Y + offsetY; bestScore = testScore; } float testScoreExact = HasPatternMatch(PixelMatch, offsetX + offsetSize, offsetY + offsetSize, cacheWidth, true, pattern); if (testScoreExact > bestScoreExact) { bestPosXExact = pos.X + offsetX; bestPosYExact = pos.Y + offsetY; bestScoreExact = testScoreExact; } } } } if (bestScore > totalBestScore) { totalBestScore = bestScore; bestValue = pattern.Value; bestPatternMatchX = bestPosX - pos.X + offsetSize; bestPatternMatchY = bestPosY - pos.Y + offsetSize; } if (bestScoreExact > totalBestScoreExact) { totalBestScoreExact = bestScoreExact; bestValueExact = pattern.Value; bestPatternExactX = bestPosXExact - pos.X + offsetSize; bestPatternExactY = bestPosYExact - pos.Y + offsetSize; } if (bDebugMode) { Logger.WriteLine("FindPatternMatch: " + pattern.Value + " best at (" + bestPosX + ", " + bestPosY + ") = " + (int)(100 * bestScore) + "%," + " exact at (" + bestPosXExact + ", " + bestPosYExact + ") = " + (int)(100 * bestScoreExact) + "%"); } } { byte[] digitDataPixels = new byte[10]; for (int IdxX = 0; IdxX < 10; IdxX++) { int Value = 0; int ByteIdx = (bestPatternMatchY * cacheWidth) + bestPatternMatchX + IdxX; for (int IdxY = 0; IdxY < 8; IdxY++) { Value |= (PixelMatch[ByteIdx + (IdxY * cacheWidth)] != 0) ? (1 << IdxY) : 0; } digitDataPixels[IdxX] = (byte)Value; } digitData = new ImageDataDigit(digitDataPixels); if (bDebugMode) { for (int IdxY = 0; IdxY < 8; IdxY++) { string debugDesc = ""; for (int IdxX = 0; IdxX < 10; IdxX++) { byte ColValue = digitDataPixels[IdxX]; byte RowMask = (byte)(1 << IdxY); debugDesc += ((ColValue & RowMask) != 0 ? "#" : ".") + " "; } Logger.WriteLine(debugDesc); } } } return((totalBestScoreExact > 0.95) ? bestValueExact : (totalBestScore > 0.8) ? bestValue : 0); }