質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

0回答

508閲覧

Powershellで特定画像と一致する画面位置をクリックしたい

KEN1115

総合スコア22

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2023/05/27 10:31

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問