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

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

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

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

Q&A

0回答

435閲覧

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

KEN1115

総合スコア21

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ページで確認できます。

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.69%

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

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

質問する

同じタグがついた質問を見る

PowerShell

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