Windows (全般)

Windows OS 全般に関する話題を扱うフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11全般)
Windowsカメラ バッチファイルでの物体認識について
投稿日時: 23/06/12 16:50:54
投稿者: joegillian

VバッチファイルにてWindowsカメラを使用して、カメラ外に出た場合画面をロックして画面の前に人がいる場合は起動し続けるツールを作成したいのですが、コードが思いつきません。
どのように組めばよろしいでしょうか?
また、参考になるコード等もあれば教えてください。

投稿日時: 23/06/12 16:51:30
投稿者: joegillian

Vはミスタイピングです。
バッチファイルにて、の認識でお願いします。

回答
投稿日時: 23/06/12 17:24:32
投稿者: taitani
投稿者のウェブサイトに移動

以下のどちらかでしょうか。
1.PythonとOpenCVを使用する方法
2.WindowsのPowerShellスクリプトを使用する方法
 
あと、別の 「VBAorバッチファイルでのカメラを使った画面ロックのやり方」でもそうですが、
Excel の VBA を使い理由も知りたいです。
※Excel VBA だと、Excelをずっと起動して、永久ループしてないといけない見解。
 
そして、自分ではどこまでプログラミングしてみたんでしょうか。
XXX は調べたとか、〇〇はだめだったとか何もないと丸投げしてる感があります。

投稿日時: 23/06/12 17:51:01
投稿者: joegillian

回答ありがとうございます。
2. WindowsのPowerShellスクリプトを使用する方法 に該当します。
Excel の VBA を使用したい理由としては明確な理由はありませんがVBA、バッチファイルの両方で組み方を調べた際にVBAの方が多くヒットしそちらの方が再現性があるのではと考えたためです。
 
こちらの記事” https://excel-ubara.com/excelvba4/EXCEL_VBA_432.html
を参照し、カメラの起動までは出来ましたがそれとWindowsの画面ロック機能の結びつけ方がわかりません。
また、それらの機能のうち物体認識を再現できるのかがウェブで調べてもヒットせず、再現出来るのかが不明なため質問した次第です。

回答
投稿日時: 23/06/12 18:48:24
投稿者: taitani
投稿者のウェブサイトに移動

PowerShell 画面ロック とかで色々出てくると思います。
https://paso-kake.com/it/command/17148/
 
ただ、カメラの起動、物体認識 (他の人が座っても?)など、色々な難しいコードを書かないといけませんね。
’---------------------
以下のような、、、(外枠だけ)

Add-Type -TypeDefinition @"
    using System;
    using System.Runtime.InteropServices;

    public static class User32 {
        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern bool LockWorkStation();
    }
"@

Add-Type -TypeDefinition @"
    using System;
    using System.Threading;

    public static class CameraMonitor {
        public static void StartMonitoring() {
            var cameraIndex = 0; // カメラのインデックス(必要に応じて変更してください)
            var checkInterval = TimeSpan.FromSeconds(2); // 監視の間隔(必要に応じて変更してください)

            while (true) {
                if (IsPersonDetected(cameraIndex)) {
                    // 人が検出された場合の処理
                    // 何らかのアクションを実行する(例: ロック解除)
                    // ここではLockWorkStation関数を使用して画面のロックを解除します
                    [User32]::LockWorkStation();
                } else {
                    // 人が検出されなかった場合の処理
                    // 何らかのアクションを実行する(例: 画面ロック)
                    // ここではLockWorkStation関数を使用して画面をロックします
                    [User32]::LockWorkStation();
                }

                Thread.Sleep(checkInterval);
            }
        }

        private static bool IsPersonDetected(int cameraIndex) {
            // カメラからの映像を取得し、人の検出を行う処理を実装する
            // 例: OpenCVやその他の顔検出ライブラリを使用する

            // ここでは常に人が検出されたとして処理を行う
            return true;
        }
    }
"@

[CameraMonitor]::StartMonitoring()

 
これ以上は有料です(笑い)

投稿日時: 23/06/12 21:09:35
投稿者: joegillian

そうですよね….物体認識ぐらいになると複雑なコードが必要になってきますよね….
 
ありがとうございます!!!十分これだけで有料級です!!!
とても参考になります、バッチファイルについてまだ学び始めたばかりで正直わからないところもありますが、
書いていただいたコードを元に試行錯誤したいと思います。
もう少し見せてください...!!って言いたいところですが自分で頑張ってみたいと思います。
もし進めていく途中でどうしても分からない不明点あればまたフォーラムにあげたいと思います。
お礼出来ずすみません、とても助かります、ありがとうございます。

投稿日時: 23/06/13 11:59:59
投稿者: joegillian

初歩的な質問になります。
以下のコマンドはPowerShellで動作するコマンドであっていますでしょうか。
 
 

taitani さんの引用:
PowerShell 画面ロック とかで色々出てくると思います。
https://paso-kake.com/it/command/17148/
 
ただ、カメラの起動、物体認識 (他の人が座っても?)など、色々な難しいコードを書かないといけませんね。
’---------------------
以下のような、、、(外枠だけ)
Add-Type -TypeDefinition @"
    using System;
    using System.Runtime.InteropServices;

    public static class User32 {
        [DllImport("user32.dll", CharSet=CharSet.Auto)]
        public static extern bool LockWorkStation();
    }
"@

Add-Type -TypeDefinition @"
    using System;
    using System.Threading;

    public static class CameraMonitor {
        public static void StartMonitoring() {
            var cameraIndex = 0; // カメラのインデックス(必要に応じて変更してください)
            var checkInterval = TimeSpan.FromSeconds(2); // 監視の間隔(必要に応じて変更してください)

            while (true) {
                if (IsPersonDetected(cameraIndex)) {
                    // 人が検出された場合の処理
                    // 何らかのアクションを実行する(例: ロック解除)
                    // ここではLockWorkStation関数を使用して画面のロックを解除します
                    [User32]::LockWorkStation();
                } else {
                    // 人が検出されなかった場合の処理
                    // 何らかのアクションを実行する(例: 画面ロック)
                    // ここではLockWorkStation関数を使用して画面をロックします
                    [User32]::LockWorkStation();
                }

                Thread.Sleep(checkInterval);
            }
        }

        private static bool IsPersonDetected(int cameraIndex) {
            // カメラからの映像を取得し、人の検出を行う処理を実装する
            // 例: OpenCVやその他の顔検出ライブラリを使用する

            // ここでは常に人が検出されたとして処理を行う
            return true;
        }
    }
"@

[CameraMonitor]::StartMonitoring()

 
これ以上は有料です(笑い)

回答
投稿日時: 23/06/15 10:01:26
投稿者: taitani
投稿者のウェブサイトに移動

はい、PowerShell です。
https://learn.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-7.3
 
Microsoft 公式の資料などで色々勉強してみてくださいー

回答
投稿日時: 23/06/15 11:46:17
投稿者: QooApp

引用:
>>taitaniさん
1.PythonとOpenCVを使用する方法

 
個人的にはPythonベースで作ってしまう方が楽ではあると思います。
理由は、PythonでもExcelでも開発自体はそのPCに環境(Python3やExcel application)が必要ですが、実行環境に必ずそれら環境があるとは限らないためです。あと私は顔認識がpython以外書ける実績がないのもありますが・・・。
 
Pythonは【pyinstaller】コマンドで.pyファイルから.exe形式に書き出すことが可能です。
.exeにする際に「--onefile」コマンドでpythonアプリケーションを起動するのに必要なライブラリをすべてexeに組み込むことが可能です。組み込み済みのアプリケーションはPython環境が無いパソコンでも動作するので実行試験するパソコンに同じ環境を複製する手間がありません。
 
pythonで開発する場合、「--exclude pandas」についても調べておく必要があります。
これを怠るとただiに10回インクリメント処理するだけの簡単なプログラムでもexe化した際にファイル容量が1GBを超える恐れがあります。ファイル軽量化に必要なコマンドです。
 
------------------
 
pythonで顔認識するプログラムは下記のようなサイトが参考プログラムを公開しています。
https://note.nkmk.me/python-opencv-face-detection-haar-cascade/
 
無償で教えられる範囲で回答するならば、これらサンプルプログラムにおける「画面内に顔があって、目があるとき」という条件時に目の輪郭部分をトレースするプログラム部分を削除し、powershellリクエストするなりで画面ロックしてしまえばよいかと。
 
解除は手動のほうが良いと思います。
誰でも自動解除されたらセキュリティ的には完全に反面教師です。
 
アプリケーションを起動しっぱなしにしつつ、他PC作業を行い、顔がPCカメラの範囲外に出た瞬間にPCロックがかかる動作を想定します。
上記サイトでも記載ある通り、ESCキーでプログラムの強制終了ができるので立ち上げっぱなしで動作するでしょう。

トピックに返信