Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/02/11 (土)

PCカメラキャプチャー Ver.2 だよ!

| 00:18 | PCカメラキャプチャー Ver.2 だよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - PCカメラキャプチャー Ver.2 だよ! - 雪乃☆雫のなでしこ日和 PCカメラキャプチャー Ver.2 だよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 フルスクリーンのモードについては、レターボックスも、縦横比固定で拡大するのも、特に問題も無くカンタンに実装出来ました。

 とゆうわけで、スペースキーでフルスクリーン表示とウィンドウ表示をトグルするようにした他、右クリックメニューを付けて、モードの変更ができるようにしました。

 このくらいできたら、単に画面にカメラの映像を出して、「おぉ!♪」とか言ってるくらいの、ワタシなんかの実用には十分なんじゃないですかね?

 旧版のなでしこでは、枠なしのフルスクリーンも問題なく動くようなので、これで実行ファイル化しておこうっと。

 珍しく、実用の物を作った気がする(爆)

 いや~、おかげさまでカメラでは、ずいぶん遊んで、まただいぶ賢くなったね☆

#-----------------------------------------------------------------------
# なでしこでノート内蔵カメラをキャプチャ ver.2.00
#-----------------------------------------------------------------------
#☆ver.1.00
#・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー)
#・Enterキーでキャプチャ画像を保存(勝手にデスクトップの日時でファイル作ります)
#-----------------------------------------------------------------------
#☆ver.2.00
#・[F5]キーでキャプチャ動画を保存([Esc]キーか、マウスボタンを押すことで保存終了)
#・[Space]キーで、フルスクリーン表示とウィンドウ表示切り替え。
#・右クリックメニュー追加。各機能の他、フルスクリーンモードが変えられます。
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#-----宣言--------------------------------------------------
枠無フルスクリーンとは整数オフ  #古いなでしこならオンで動きます(1.5332で確認)

CW幅とは整数=640。CW高さとは整数=480。
CWハンドルとは整数=-1  #キャプチャーウィンドウのハンドル。

!WS_VISIBLEとは整数=$10000000  #(初期状態)
!WS_CHILDとは整数=$40000000   #(子ウィンドウ)
CWスタイルとは整数=WS_VISIBLE+WS_CHILD  #キャプチャーウィンドウのスタイル

カメラ接続状態とは整数オフ。
フレームレートとは整数=60      #ミリ秒単位
フルスクリーン表示フラグとは整数オフ。
フルスクリーンモードとは整数=1
#(0=デスクトップに合わせて引き延ばす、1=レターボックス、2=縦横比固定でズーム)

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

#-----母艦設計----------------------------------------------
#---ポップアップメニュー----
右クリックメニューとはポップアップメニュー
右クリックメニューに『#親部品名,部品名,テキスト,ショートカット,オプション,イベント
 -,フルスクリーンメニュー,フルスクリーンモード,,,
 --,フルスクリーン0,ノーマル,,,0にフルスクリーンモード変更
 --,フルスクリーン1,レターボックス(縦横比固定),,チェック,1にフルスクリーンモード変更
 --,フルスクリーン2,ズーム(縦横比固定),,,2にフルスクリーンモード変更
 -,ウィンドウメニュー,ウィンドウ表示,,,ウィンドウ表示
 -,-,,,,
 -,静止画保存メニュー,スクリーンショット保存,,,静止画保存。
 -,-,,,,
 -,動画保存メニュー,キャプチャ動画保存,,,動画保存。
 -,動画保存コメント, (終了は[Esc]かマウスクリック),,,
 -,-,,,,
 -,ヘルプメニュー,操作説明,,,操作説明。
 -,バージョンメニュー,バージョン情報,,,バージョン。
 -,-,,,,
 -,メニュー閉,メニューを閉じる,,,
 -,-,,,,
 -,終了メニュー,終了,,,終了処理。
』をポップアップメニュー一括作成

*フルスクリーンモード変更(Aに)
  もし、A=1ならば、
    フルスクリーンモード=1。
    フルスクリーン0のチェックオフ。フルスクリーン1のチェックオン。フルスクリーン2のチェックオフ。
  違えばもし、A=2ならば、
    フルスクリーンモード=2。
    フルスクリーン0のチェックオフ。フルスクリーン1のチェックオフ。フルスクリーン2のチェックオン。
  違えば、
    フルスクリーンモード=0。
    フルスクリーン0のチェックオン。フルスクリーン1のチェックオフ。フルスクリーン2のチェックオフ。
  フルスクリーン表示フラグ=オフ。
  フルスクリーン表示。

*ウィンドウ表示
  フルスクリーン表示フラグ=オン。
  フルスクリーン表示。

#---母艦-----
母艦について
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  オフに最小化ボタン有効変更。
  タイトルは「PCカメラキャプチャー」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。
  ポップアップメニューは右クリックメニュー。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、静止画保存。  # Enter
    違えばもし、押された仮想キー=116ならば、動画保存。  # F5
    違えばもし、押された仮想キー=32ならば、フルスクリーン表示。  # Space
    違えばもし、押された仮想キー=112ならば、操作説明。  # F1
    違えばもし、押された仮想キー=113ならばバージョン。  # F2
母艦黒色画面クリア母艦中央移動。
#-----------------------------------------------------------

#-----メイン------------------------------------------------
母艦の可視はオン
カメラ起動

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

*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルを処理用へ窓内側キャプチャ。
  処理用をファイル名へ画像保存。

*動画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.avi」
  CWハンドルをファイル名にキャプチャファイル設定。
  CWハンドルをキャプチャ開始。

*フルスクリーン表示
  もし、フルスクリーン表示フラグ=オフならば、
    フルスクリーン表示フラグ=オン
    母艦のクライアント幅はデスクトップW母艦のクライアント高さはデスクトップH。
    もし、枠無フルスクリーン=オンならば、
      母艦のスタイルは「枠なし」
      母艦の位置は「0,0」
    違えば、
      母艦中央移動。
    もし、フルスクリーンモード=1ならば、
      CWハンドルに(母艦のクライアント幅-(母艦のクライアント高さ*CW幅/CW高さ))/2,0,(母艦のクライアント高さ*CW幅/CW高さ),母艦のクライアント高さを窓ハンドル位置サイズ設定。
    違えばもし、フルスクリーンモード=2ならば、
      CWハンドルに0,(母艦のクライアント高さ-(母艦のクライアント幅*CW高さ/CW幅))/2,母艦のクライアント幅,(母艦のクライアント幅*CW高さ/CW幅)を窓ハンドル位置サイズ設定。
    違えば、
      CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
    母艦最前面
  違えば、
    フルスクリーン表示フラグ=オフ
    母艦のスタイルは「枠固定」
    母艦のクライアント幅はCW幅。母艦のクライアント高さはCW高さ。
    母艦中央移動。
    CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
  処理用を母艦のクライアント幅,母艦のクライアント高さで画像リサイズ。
  CWハンドルをフルスクリーン表示フラグにスケーリングフラグ設定。

*終了処理
  CWハンドルからカメラ切断。
  CWハンドルをウィンドウ破棄。
  終わる。
#-----------------------------------------------------------
*操作説明
  ダイアログタイトルは「操作説明」
  「◆[Enter]キーでキャプチャ画面のスナップショットを保存。
  
◆[F5]キーでキャプチャ動画を保存。
 [Esc]キーか、マウスボタンを押すことで保存終了となります。
 ※終了させない限り、録画し続けます。
 
◆[Space]キーで、フルスクリーン表示。
 フルスクリーン表示時に[Space]キーで、ウィンドウ表示戻る。
 
◎フルスクリーンモードは、右クリックメニューで変更できます。
 ・ノーマル(デスクトップに合わせて映像を引き延ばします)
 ・レターボックス(縦横比固定。左右に黒枠が入ります)
 ・ズーム(縦横比固定。上下を切ってデスクトップ一杯に表示)
 ※設定ファイルは作ってないので、毎初期値に戻ります。」と言う
#------------------------------------------------------------
*バージョン
  ダイアログタイトルは「バージョン情報」
  「{二重カッコ}PCカメラキャプチャー{二重カッコ閉じ}{改行}   Version 2.00{改行}{改行}   by 雪乃☆雫」と言う。
#-----------------------------------------------------------

#-----ビデオキャプチャー------------------------------------
#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    # ビデオキャプチャに使用されるファイルの名前を指定します。
#-----------------------------------------------------------
●カメラ接続(ハンドルに{数値=0}Noの)
  メッセージ送信(ハンドル,WM_CAP_DRIVER_CONNECT,No,0)  # カメラが1台ならNoは0で省略可。

●カメラ切断(ハンドルから)
  メッセージ送信(ハンドル,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=オンオフ
#-----------------------------------------------------------

#-----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   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------
#https://msdn.microsoft.com/ja-jp/library/cc411206.aspx
●SetWindowPos(hWnd,hWndInsertAfter,X,Y,cx,cy,uFlags) =DLL("user32.dll",
"BOOL SetWindowPos(
HWND hWnd,             // ウィンドウのハンドル
HWND hWndInsertAfter,  // 配置順序のハンドル…?
int X,                 // 横方向の位置
int Y,                 // 縦方向の位置
int cx,                // 幅
int cy,                // 高さ
UINT uFlags            // ウィンドウ位置のオプション
)")

●窓ハンドル位置サイズ設定(ハンドルにX,Y,W,Hを)
  SetWindowPos(ハンドル,0,X,Y,W,H,0)
#-----------------------------------------------------------

めだかめだか 2017/02/12 02:09 ご無沙汰しております。

開いてびっくり!謎のコードがびっしりw
さすがです・・・!
自分で組んだコードでも、後から見返した時に何を書いているのかさっぱりなのに、人様が書いたコードとなるともうさっぱりですねw

ですが、なんとなく理解は...しているつもりですw


ところで、検出プログラムなんですが、なんとなくはできた・・・?のですが、その方法以外が思い浮かばないので、なんとも言えない状態です・・・w
さて、どうしませうか・・・

雪乃☆雫雪乃☆雫 2017/02/15 00:53  めだかさんこんにちは。遅くなりましてスミマセン;

 VFW関係のメッセージ送信を、全部関数にして書き換えましたw
 もちろんナゾの呪文は使わず、例の数値を直接指定しても動くんだけど、まさにその、時間が経ってから見返したりするコトを考えると、この呪文で検索するとMSDNとかにたどり着けるので、結局のところ可視性が上がるのかなあと思い、基本英語は見てるだけでダメな人なんですが、使っとくことにしました;;;

 顔検出なんて、その方法もどの方法も、考えたこともないもねー。すごいなあと感心するばかりですよ~。
 是非頑張ってくださいぃ~☆

ゲスト



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