私はプログラムで画像認識を使用してきましたが、アプリケーションの実際の画像認識コードに問題があると考え続けていました。深く調べてみると、スクリーンショットを作成するために使用するコード (画面全体と画面の部分的な四角形の両方) がぼやけた画像を作成していることに気付きました。画像はぼやけており、ピクセル化されています。
私は通常、画像認識でチェックするためにメモリ内のビットマップを使用するだけで、画像を保存しません。これらのスクリーンショットを複数の形式で保存した後、問題を確認できます。
スクリーンショットを生成するために使用するコードは次のとおりです。最初の関数は完全なスクリーンショットを作成し、2 番目の関数は画面上の座標からスクリーンショットを作成します。
Public Shared Function GetScreen() As Bitmap
Dim screenSize As Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
Dim screenGrab As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
Using g As Graphics = Graphics.FromImage(screenGrab)
g.CopyFromScreen(New Point(0, 0), New Point(0, 0), screenSize)
Return screenGrab
End Using
End Function
Public Shared Function
GetScreenXY(TopLeft As Point, BottomRight As Point) As Bitmap
Dim w As Integer = BottomRight.X - TopLeft.X
Dim h As Integer = BottomRight.Y - TopLeft.Y
Dim screenGrab As New Bitmap(w, h) 'width and height of the rectangle you want to grab
Using g As Graphics = Graphics.FromImage(screenGrab)
g.CopyFromScreen(TopLeft, New Point(0, 0), screenGrab.Size)
Return screenGrab
End Using
End Function
私のアプリケーションには、最近追加したスクリーンショット ツールもあります。サイズを変更できるフォームがあり、スクリーンショットを撮って保存できます。これらもぼやけて出てきます。2 番目の関数を使用します。
Visible = False
Dim screenShot As Bitmap = ImageFinder.GetScreenXY(New Point(Left, Top), New Point(Right, Bottom))
Dim sfd As New SaveFileDialog
sfd.Filter = "Jpeg image (*.jpg)|*.jpg|Bitmap image (*.bmp)|*.bmp| PNG image (*.png)|*.png"
sfd.Title = "Save image"
If sfd.ShowDialog() = DialogResult.OK Then
If sfd.FileName <> String.Empty Then
'Set to Jpeg by default.
Dim MyImageFormat As System.Drawing.Imaging.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
If sfd.FileName.ToString.ToUpper.EndsWith("JPG") Then
MyImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg
ElseIf sfd.FileName.ToString.ToUpper.EndsWith("BMP") Then
MyImageFormat = System.Drawing.Imaging.ImageFormat.Bmp
ElseIf sfd.FileName.ToString.ToUpper.EndsWith("PNG") Then
MyImageFormat = System.Drawing.Imaging.ImageFormat.Png
End If
screenShot.Save(sfd.FileName, MyImageFormat)