Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/04/18 (火)

監視カメラ的な?

| 16:55 | 監視カメラ的な? - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - 監視カメラ的な? - 雪乃☆雫のなでしこ日和 監視カメラ的な? - 雪乃☆雫のなでしこ日和 のブックマークコメント

 昨日の続きです。

 とりあえずコレもお試しだけど、なんかこんな感じ?

 感度値は、値が大きい方が感度が高そうな気がしてしまうけど、実際はが少ない方が感度が良いというわけで、知恵の足りないワタシはいちいちコンランしまくり(バカ;)・・・のため、0~100で設定できるよーにした(爆)


 んなコトはさておき、精度は10でも5でも、侵入者wを発見して撮影することはできた。

 でも結局、いちいち静止画保存されるのも実際のところはめーわくなので、BEEPにしてあるwww

 こんな精度だと、侵入者は発見できても、まばたきなんかは全く検出しないと思ってたんだけど、日中だと太陽光効果か(屋内だけど)結構検出できるみたい。

 自然って素晴らしい!(違;)


 ちなみにこれまで、静止画保存ようの画像を取得するイメージ部品を「処理用」としてましたが、「保存用」に変更。

 処理用は、動いたピクセルを点描画するために使用することに。

#監視カメラ的な?

#-----宣言--------------------------------------------------
CW幅とは整数=640。CW高さとは整数=480。
CWハンドルとは整数=-1  #キャプチャーウィンドウのハンドル。
#---ウィンドウスタイル定数-----
!WS_VISIBLEとは整数=$10000000  #(初期状態)
!WS_CHILDとは整数=$40000000   #(子ウィンドウ)
CWスタイルとは整数=WS_VISIBLE||WS_CHILD  #キャプチャーウィンドウのスタイル

カメラ接続状態とは整数オフ。
フレームレートとは整数=60      #ミリ秒単位

精度=10
精度=精度/100
感度値=80
感度値=(255/100*(100-感度値))を切り下げ
閾値=50
閾値=(CW幅*精度*CW高さ*精度)/1000*閾値を切り下げ

#---GUI-----
保存用とはイメージの可視はオフ。

Tとはタイマーの値はフレームレート。
の時満ちた時は~画像比較。

動体検知モニターとはフォームこれについて
  可視はオン。
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  タイトルは「動体検知的な?」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。

処理用とはイメージこれについて
  可視はオフ。
  幅はCW幅*精度。
  高さはCW高さ*精度。

裏画面とはイメージこれについて
  可視はオフ。
  幅はCW幅。
  高さはCW高さ。

表示用とはイメージこれについて
  可視はオン。
  親部品は動体検知モニター。
  幅はCW幅。
  高さはCW高さ。
  位置は「0,0」
表示用を黒色画面クリア。

2
  比較用[回数-1]をイメージとして作成。
  比較用[回数-1]→可視はオフ。
  比較用[回数-1]→位置は「0,0」
  比較用[回数-1]→幅はCW幅。
  比較用[回数-1]→高さはCW高さ。

#---母艦-----
母艦について
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  タイトルは「PCカメラキャプチャー」
  位置は「10,10」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、動体検知モニターの可視はオン。  # Enter
母艦黒色画面クリア。
動体検知モニターの位置は母艦の右側。
#-----------------------------------------------------------

#-----メイン------------------------------------------------
カメラ起動。
C=-1。Tを開始。
#-----------------------------------------------------------
*カメラ起動
  キャプチャーウィンドウ作成("",CWスタイル,0,0,CW幅,CW高さ,母艦のハンドル,0)
  CWハンドルはそれ。1秒待つ。
  5
    CWハンドルにカメラ接続。
    1秒待つ。
    もしそれはいならば、カメラ接続状態はオン抜ける。
  もし、カメラ接続状態がオフならば、
    CWハンドルをウィンドウ破棄。
    「カメラに接続出来ませんでした」と言う。
    終わる。
  CWハンドルをフレームレートにプレビューレート設定。
  CWハンドルをオンにプレビューモード設定。

*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルをクリップボードコピー。
  保存用の画像は「クリップボード」
  保存用をファイル名へ画像保存。

*終了処理
  CWハンドルからカメラ切断。
  CWハンドルをウィンドウ破棄。
  終わる。
#-----------------------------------------------------------
*画像比較
  C=C+1。D=0。I=0。
  CWハンドルをクリップボードコピー。
  比較用[C%2]→画像は「クリップボード」。
  比較用[C%2]を画像グレイスケール。
  比較用[C%2]をCW幅*精度,CW高さ*精度へ画像高速リサイズ。
  yで0からCW高さ*精度-1まで繰り返す。
    xで0からCW幅*精度-1まで繰り返す。
      比較用[C%2]のx,yから画像色取得。
      P¥(C%2),D=それ/$10000を切り下げ。
      もし、C=0でなければ、
        もし、((P\0,D)-(P\1,D))の絶対値>感度値ならば、
          I=I+1。
          処理用のx,yへ赤色点描画。
      D=D+1。
  もし、I>閾値ならばBEEP。//静止画保存。
  もし、動体検知モニターの可視=オンならば、モニター表示。

*モニター表示
  裏画面の画像は「クリップボード」
  処理用をCW幅,CW高さへ画像高速リサイズ。
  処理用を裏画面の0,0へ画像合成。
  表示用の画像は「裏画面」
  処理用をCW幅*精度,CW高さ*精度へ画像高速リサイズ。
  処理用を黒色画面クリア。
#-----------------------------------------------------------

#-----ビデオキャプチャー------------------------------------
#https://msdn.microsoft.com/en-us/library/windows/desktop/dd757696(v=vs.85).aspx
#---VFW定数-----
!WM_CAP_DRIVER_CONNECTとは整数=$400+10           # キャプチャウィンドウをキャプチャドライバに接続します。
!WM_CAP_DRIVER_DISCONNECTとは整数=$400+11        # キャプチャウィンドウからキャプチャドライバを切断します。
!WM_CAP_SET_PREVIEWとは整数=$400+50              # プレビューモード(オンオフ)
!WM_CAP_SET_PREVIEWRATEとは整数=$400+52          # プレビューモードのフレーム表示レート(ミリ秒)
!WM_CAP_SET_SCALEとは整数=$400+53                # 画像をキャプチャーウィンドウに合わせて拡縮(オンオフ)
!WM_CAP_SEQUENCEとは整数=$400+62                 # ストリーミングビデオおよびオーディオキャプチャをファイルに開始します。
!WM_CAP_FILE_SET_CAPTURE_FILEとは整数=$400+20    # ビデオキャプチャに使用されるファイルの名前を指定します。
!WM_CAP_EDIT_COPY=$400+30                        # 画面をクリップボードコピー。
#-----------------------------------------------------------
●カメラ接続(ハンドルに{数値=0}Noの)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0)  # カメラが1台ならNoは0でOK

●カメラ切断(ハンドルから)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_DISCONNECT,0,0)

●プレビューレート設定(ハンドルをmsに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEWRATE,ms,0)  # ms=ミリ秒単位

●プレビューモード設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_PREVIEW,f,0)     # f=オンオフ

●キャプチャ開始(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_SEQUENCE,0,0)

●キャプチャファイル設定(ハンドルをaviファイル名に)
  メッセージ送信(ハンドル,WM_CAP_FILE_SET_CAPTURE_FILE,0,aviファイル名)

●スケーリングフラグ設定(ハンドルをfに)
  メッセージ送信(ハンドル,WM_CAP_SET_SCALE,f,0)      # f=オンオフクリップボードコピー(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_EDIT_COPY,0,0)
#-----------------------------------------------------------

#-----API---------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc428606.aspx
●キャプチャーウィンドウ作成(lpszWindowName,dwStyle,x,y,nWidth,nHeight,hWnd,nID) =DLL("avicap32.dll",
"HWND capCreateCaptureWindowA(
LPCSTR lpszWindowName,  // ウィンドウ名
DWORD dwStyle,          // ウィンドウスタイル
int x,                  // X
int y,                  // Y
int nWidth,             // W
int nHeight,            // H
HWND hWnd,              // 親ウィンドウのハンドル
int nID                 // ウィンドウ識別子…ってなんすか;
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411022.aspx
●メッセージ送信(hWnd,Msg,wParam,lParam) =DLL("user32.dll",
"LRESULT SendMessageA(
HWND hWnd,      // 送信先ウィンドウのハンドル
UINT Msg,       // メッセージ
SHORT wParam,  // メッセージの最初のパラメータ
LPCSTR lParam   // メッセージの 2 番目のパラメータ
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc410763.aspx
●ウィンドウ破棄(hWndを) =DLL("user32.dll",
"BOOL DestroyWindow(
HWND hWnd   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------

 うーん、この監視機能と、こないだのダイアログを加えて、あと、やっぱり現行のなでしこでもちゃんとフルスクリーンするようにAPIに直して、バージョン3かなぁ~♪

めだかめだか 2017/04/24 01:17 お久しゅう振りですw
なんか私より進んでません!?
私は、最近忙しすぎて出来てないんですよw


このプログラムを見る限り、私の野望の方が大きいです(笑
組んでるプログラム自体は、私の方がもっと簡単ですけどw

ところで、複数の検出は、速度やプログラム的にも可能だと思いますか?
複数の検出というのが、ただ、値以上を塗るではなく、ある程度の塊(背景誤差を検出しないものとする)での検出です。要は、両手を出して、両手とも上手いこと検出するかな?ですw
で、これなんですが、あまり深くは考えてないですが、ひょっとして不可能なのでは?と薄々思っています。

もし、可能でも、速度はとてもではないですが、実用的なものにはならないなと思っています。
そもそも、なでしこはGUI関連に弱いため、なでしこの高速は他言語で言うところの普通ぐらいでしょう...

これはあくまで、現段階の私の組んでいるプログラムをもとに考えたことなので一概には言えませんが、どう思いますか?

雪乃☆雫雪乃☆雫 2017/04/24 17:01  めだかさん、こんにちは☆
 いや、まったく進んでません!w
 一番当初のお話しが顔認識・・・とゆうことだったので、こんなこっちゃぁないんだろうなってのは端から分かっていたのですが、なにぶんワタシの知恵ではこの程度;
 前に、画像はどの程度縮小して出来るか・・・というお話をしたので、速度的にはどんなもんだかを、実際お試ししてみようと思いついてちょっとやってみた結果、なんとかかんとかこーなったのですが・・・こりゃー予想通りとゆーかなんとゆーか、なかなか厳しくて参ったね>< と言う結果となりました。

 というわけで(?)現状ワタシの理解がまずここまでのレベルなもんで、どのようにも考えようがないんですけれどもねー;;;
 しかし、複数の検出とゆうのは、たとえば顔認識で言えば、複数人物がいた場合には、当然人数分検出しなけりゃならん、というようなことですよね・・??
 世の中にそのようなプログラムがある以上、速度のことは取りあえず置くとすれば、なでしこでも不可能ってことはあるまいと思ったり思わなかったりするところなのですが・・・何しろその方法が分かりませぬ~(@_@)

 しかし、とにかく最大の問題は速度なんですよね。
 他言語の普通というのがどのくらいなもんなのかも、ワタシにはちょっと分かりません。
 がっ・・・これは、なでしこのGUIが・・・とかいう以前の問題のように思います。
 なんにもせよ、画像色取得では、どうにも・・・ヽ(;´Д`)ノ

めだかめだか 2017/04/24 21:26 こにゃにゃちわ~

今日!久々にPC起動ですw

ほんとですよねぇ・・・やはり「速度」が問題ですね・・・それに、PC自体もスペックはいい方ではないので、そこからつまずきです・・・
とは、言えど、プログラムの可能性は無限大ですので、何かしらの解決策があるはず・・・!だと、思っていますw

そですね。
http://nonbiri-tereka.hatenablog.com/entry/2015/05/13/063713
「顔 検出 複数」での検索結果で1番上に来たやつが思っている奴が具現化されたものだったので、URLを載せておきます。こんな感じです。

他言語では、0.5秒以下の実行速度だったかな?そんぐらいは出しておかないと普通とは言えないとかいう話です・・・恐ろしい・・・

何か画像色取得以外の命令はないものか考え中です・・・

雪乃☆雫雪乃☆雫 2017/04/25 00:23 そうそうOpenCVですねー。
顔認識とかで検索すると、大体これ系ばかりヒットしてくるので、OpenCV自体がよくわからんもので、どうにもこうにも・・・(+_+)
画像の色を高速に取得するについては、ワタシが愚考するに、APIで直接ビットマップをどうにかしなきゃないと思うんだよね。
調べてないし、深くも考えてないし、可能かどうかすらよく分からんけど、やるとしたらおそらく、こーぞーたいで、ぽいんたぁで・・・うきゃぁぁヽ(;´Д`)ノ
・・・て感じかと思われます;;;

めだかめだか 2017/04/25 21:08 画像関連だと、OpenCVが一番有名というか、無難という感じですね(笑

私も他言語についてはさっぱりなので、もうやめて~状態ですTT

これ以上複雑なものはやだーって思ったのが一番です。てへへw

ゲスト



トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170418