実現したいこと
Powershellで特定画像と一致する画面位置をクリックしたい。
※目的が実現できれば後述のコード方式には拘らない
前提
Windows10、VSCODE
発生している問題・エラーメッセージ
Add-Type : c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(75) : 型 'System.Drawing.Bitmap' が参照されていないアセンブリで定義されています。アセンブリ 'System.Drawing.Common, Version=5.0.0.2, Culture=neutr al, PublicKeyToken=cc7b13ffcd2ddd51' への参照を追加してください。 c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(74) : using (var targetImg = Cv2.ImRead(targetPath)) c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(75) : >>> using (var img = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap)) c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(76) : using (var img3ch = img.CvtColor(ColorConversionCodes.BGRA2BGR)) 発生場所 J:\batch\h\guiauto\guiauto.ps1:140 文字:1 + Add-Type -TypeDefinition $source -ReferencedAssemblies $assemblies + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type]、Exception + FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand Add-Type : c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(75) : 'OpenCvSharp.Extensions.BitmapConverter.ToMat(System.Drawing.Bitmap)' に最も適しているオーバーロード メソッドには無効な引数がいくつか含まれています。 c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(74) : using (var targetImg = Cv2.ImRead(targetPath)) c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(75) : >>> using (var img = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap)) c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(76) : using (var img3ch = img.CvtColor(ColorConversionCodes.BGRA2BGR)) 発生場所 J:\batch\h\guiauto\guiauto.ps1:140 文字:1 + Add-Type -TypeDefinition $source -ReferencedAssemblies $assemblies + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type]、Exception + FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand Add-Type : c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(75) : 引数 1: 'System.Drawing.Bitmap [c:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f 11d50a3a\System.Drawing.dll]' から 'System.Drawing.Bitmap' に変換できません c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(74) : using (var targetImg = Cv2.ImRead(targetPath)) c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(75) : >>> using (var img = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap)) c:\Users\user\AppData\Local\Temp\upy02db0.0.cs(76) : using (var img3ch = img.CvtColor(ColorConversionCodes.BGRA2BGR)) 発生場所 J:\batch\h\guiauto\guiauto.ps1:140 文字:1 + Add-Type -TypeDefinition $source -ReferencedAssemblies $assemblies + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (Microsoft.Power...peCompilerError:AddTypeCompilerError) [Add-Type]、Exception + FullyQualifiedErrorId : SOURCE_CODE_ERROR,Microsoft.PowerShell.Commands.AddTypeCommand Add-Type : 型を追加できません。コンパイル エラーが発生しました。 発生場所 J:\batch\h\guiauto\guiauto.ps1:140 文字:1 + Add-Type -TypeDefinition $source -ReferencedAssemblies $assemblies + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Add-Type]、InvalidOperationException + FullyQualifiedErrorId : COMPILER_ERRORS,Microsoft.PowerShell.Commands.AddTypeCommand Add-Type : 要求された型のうち 1 つまたは複数を読み込めませんでした。詳細については、LoaderExceptions プロパティを取得してください。 発生場所 J:\batch\h\guiauto\guiauto.ps1:141 文字:1 + Add-Type -Path "$dllPath\OpenCVSharp.dll" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException + FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand Add-Type : 要求された型のうち 1 つまたは複数を読み込めませんでした。詳細については、LoaderExceptions プロパティを取得してください。 発生場所 J:\batch\h\guiauto\guiauto.ps1:142 文字:1 + Add-Type -Path "$dllPath\OpenCVSharp.Extensions.dll" + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [Add-Type], ReflectionTypeLoadException + FullyQualifiedErrorId : System.Reflection.ReflectionTypeLoadException,Microsoft.PowerShell.Commands.AddTypeCommand 型 [GuiAuto] が見つかりません。 発生場所 J:\batch\h\guiauto\guiauto.ps1:143 文字:1 + [GuiAuto]::ClickImg(0, "C:\dev\ps\opencv\target.bmp", 0.75) + ~~~~~~~~~ + CategoryInfo : InvalidOperation: (GuiAuto:TypeName) []、RuntimeException + FullyQualifiedErrorId : TypeNotFound``` ### 該当のソースコード ```Powershell $source = @" using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; public class GuiAuto { // https://culage.hatenablog.com/entry/20130611/1370876400 [DllImport("user32.dll")] extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); [StructLayout(LayoutKind.Sequential)] struct INPUT { public int type; public MOUSEINPUT mi; } [StructLayout(LayoutKind.Sequential)] struct MOUSEINPUT { public int dx; public int dy; public int mouseData; public int dwFlags; public int time; public IntPtr dwExtraInfo; } const int MOUSEEVENTF_LEFTDOWN = 0x0002; const int MOUSEEVENTF_LEFTUP = 0x0004; static public void Click() { //struct 配列の宣言 INPUT[] input = new INPUT[2]; //左ボタン Down input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; //左ボタン Up input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP; //イベントの一括生成 SendInput(2, input, Marshal.SizeOf(input[0])); } static public void Move(int x, int y) { var pt = new System.Drawing.Point(x, y); System.Windows.Forms.Cursor.Position = pt; } public class TemplateResult { public int TargetWidth { set; get; } public int TargetHeight { set; get; } public List<OpenCvSharp.Point> MatchList { set; get; } public TemplateResult() { this.MatchList = new List<OpenCvSharp.Point>(); } } static public TemplateResult MatchTemplate(int ScreenNo, string targetPath, double threshold) { TemplateResult result = new TemplateResult(); var screen = Screen.AllScreens[ScreenNo]; Bitmap bitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height); Graphics graphics = Graphics.FromImage(bitmap as Image); graphics.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, bitmap.Size); using (var targetImg = Cv2.ImRead(targetPath)) using (var img = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap)) using (var img3ch = img.CvtColor(ColorConversionCodes.BGRA2BGR)) { result.TargetWidth = targetImg.Width; result.TargetHeight = targetImg.Height; var tmplRet = img3ch.MatchTemplate(targetImg, TemplateMatchModes.CCoeffNormed); double minVal, maxVal; OpenCvSharp.Point minLoc, maxLoc; tmplRet.MinMaxLoc(out minVal, out maxVal, out minLoc, out maxLoc); Mat thresholdRet = tmplRet.Threshold(threshold, 1.0, ThresholdTypes.Tozero); while (true) { thresholdRet.MinMaxLoc(out minVal, out maxVal, out minLoc, out maxLoc); if (maxVal < threshold) { break; } result.MatchList.Add(maxLoc); thresholdRet.FloodFill(maxLoc, 0); } } return result; } static public bool ClickImg(int ScreenNo, string targetPath, double threshold, int offsetX, int offsetY) { TemplateResult tmplRet = MatchTemplate(ScreenNo, targetPath, threshold); if (tmplRet.MatchList.Count == 0) { return false; } var screen = Screen.AllScreens[ScreenNo]; Move(screen.Bounds.X + tmplRet.MatchList[0].X, screen.Bounds.Y + tmplRet.MatchList[0].Y); Click(); return true; } static public bool ClickImg(int ScreenNo, string targetPath, double threshold) { TemplateResult tmplRet = MatchTemplate(ScreenNo, targetPath, threshold); if (tmplRet.MatchList.Count == 0) { return false; } var screen = Screen.AllScreens[ScreenNo]; Move(screen.Bounds.X + tmplRet.MatchList[0].X + tmplRet.TargetWidth/ 2, screen.Bounds.Y + tmplRet.MatchList[0].Y + tmplRet.TargetHeight / 2); Click(); return true; } } "@ $dllPath = Split-Path $MyInvocation.MyCommand.Path Set-Item Env:Path "$Env:Path;$dllPath" Write-Host $currentDir $assemblies = @( "$dllPath\OpenCVSharp.dll", "$dllPath\OpenCvSharp.Extensions.dll", "System.Runtime", "System.Windows.Forms", "System.Drawing" ) Add-Type -TypeDefinition $source -ReferencedAssemblies $assemblies Add-Type -Path "$dllPath\OpenCVSharp.dll" Add-Type -Path "$dllPath\OpenCVSharp.Extensions.dll" [GuiAuto]::ClickImg(0, "C:\dev\ps\opencv\target.bmp", 0.75)
試したこと
後述URLを参考にソースコードの記述、およびDLLファイルなどを配置して実行(OpenCvSharp 4.7.0.20230114のDLLファイル)
C#やPowerShellで画面上の特定の画像の位置をクリックする方法
https://qiita.com/mima_ita/items/f7d2c38767bda8b35cbd
補足情報(FW/ツールのバージョンなど)
PS C:\Users\user> $PSVersionTable
Name Value
PSVersion 5.1.19041.1023
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.19041.1023
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1

あなたの回答
tips
プレビュー