Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017/01/27 (金)

なでしこでノートPCのカメラを使うよ!

| 17:32 | なでしこでノートPCのカメラを使うよ! - 雪乃☆雫のなでしこ日和 を含むブックマーク はてなブックマーク - なでしこでノートPCのカメラを使うよ! - 雪乃☆雫のなでしこ日和 なでしこでノートPCのカメラを使うよ! - 雪乃☆雫のなでしこ日和 のブックマークコメント

 めだかさんから頂戴した課題です。

 課題を解決するのは、好きだよ☆

 もっとも、当初、ワタシの知恵では、到底ムリだろうと思われた、難題でしたが――

 色々調べてみた結果、capCreateCaptureWindowと、SendMessageの組み合わせで、出来そう感が出てきたので、ちょっとやってみました。

 元ネタは、こちら。

http://magayengineer.hatenablog.com/entry/2016/06/13/224309

 しかし、VBのコードが分かるわけでもなく(20年くらい前にちょこっと、本や雑誌のをまるっと打ち込んで「動いた~(喜)」とかしてただけなんで;)イメージで! 目的のAPIを使ってるトコをやっつけで!!(爆)

 んな、てきとーな感じなのに・・・

 ふつうだったら、もっとなんてことの無い簡単なモノでも、大体些細なことにはまりまくって何日も過ごしたりするもんなんだけど・・・


 ・・・あれれれれ??

 でっ、できたかも・・・?!?!


 上記のよーな感じなもので、もしかすると、不足のところがあるかも知れませんが、一応カメラの映像が画面に出て、スナップショットをファイルに保存出来るようになりました。


 APIは、3つ。(本家では4つ使われていますが、なんかよく分かんないので、割愛されています(えっ;))

・まずは、「capCreateCaptureWindow」で、キャプチャーウィンドウを作成します。

 ウィンドウ識別子がなんなのか、全く分かんないケド、0で良いようです;

 ウィンドウ名は、母艦の子ウィンドウとするため設定していません。

 ウィンドウスタイルは・・・とっ、とにかくコレで、母艦の中にキャプチャーウィンドウが入ります;

 あとは、見たとうりの感じ。

・「DestroyWindow」は、最後、作ったウィンドウは、ちゃんと破棄して終了すれってこってしょう。

して、「SendMessage」で、なんか色々送ることによって、VFW?が使えるとゆうことのようなんですが・・・とりあえず、数値を拾っただけです。

 他にも沢山種類があって、出来ることは色々ありそうではあるんですが・・・よくわからん。だって、英語なんだもん!(*_*)

 しかも、なぜだか「WM_CAP_FILE_SAVEDIBA」が、うまく出来ませんでした(?_?)

 でも、なでしこには窓キャプチャ画像保存の命令があるから、いいんだい!

 直で、pngでも保存できるもね~。

・ちなみに、割愛した「getTickCount」は、システムを起動した後の経過時を、ミリ秒(ms)単位で取得…するヤツで、カメラが準備できるまで少し待つ…場面で使われていましたが、よく分かんないので、待ちゃーいいんだろ?とばかりに、秒待つ命令をぶち込みましたが、動いたのでOK;;;


 さてさて、んなこんなで、こんな感じ。

#-----------------------------------------------------------------------
# なでしこでノート内蔵カメラをキャプチャ
#・ノートPCの内蔵カメラを起動してキャプチャ(プレビュー)
#・Enterキーでキャプチャ画像を保存(勝手にデスクトップの日時でファイル作ります)
#-----------------------------------------------------------------------
#※元ネタはこちら
#http://magayengineer.hatenablog.com/entry/2016/06/13/224309
#(VB.NETが分からんもので、正確な移植では無いです。なんか不備があったらゴメン)
#-----------------------------------------------------------------------
!母艦設計=「母艦の可視はオフ」

#-----母艦設計----------------------------------------------
母艦について
  位置は「0,0」
  クライアント幅は640。
  クライアント高さは480。
  閉じた時は~
    終了処理。
  キー押した時は~
    もし、押された仮想キー=13ならば、画面キャプチャ。
#-----------------------------------------------------------

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

カメラ接続とは整数=$400+10     # WM_CAP_DRIVER_CONNECT
カメラ切断とは整数=$400+11     # WM_CAP_DRIVER_DISCONNECT
カメラ接続状態とは整数オフ。

プレビューとは整数=$400+50     # WM_CAP_SET_PREVIEW
プレビューレートとは整数=$400+52  # WM_CAP_SET_PREVIEWRATE
フレームレートとは整数=60      #ミリ秒単位

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

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

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

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

*終了処理
  メッセージ送信(CWハンドル,カメラ切断,0,0)
  ウィンドウ破棄(CWハンドル)
#-----------------------------------------------------------

#-----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,       // メッセージ
WPARAM wParam,  // メッセージの最初のパラメータ
LPARAM lParam   // メッセージの 2 番目のパラメータ
)")

#https://msdn.microsoft.com/ja-jp/library/cc410763.aspx
●ウィンドウ破棄(hWnd) =DLL("user32.dll",
"BOOL DestroyWindow(
HWND hWnd   // 破棄するウィンドウのハンドル
)")
#-----------------------------------------------------------

 しっかし、テストするたびに、ワタシの抜けた顔が画面に映るから、テンション下がるわ~(爆)

 鏡代わりに使うには、いささか画像が粗いしね~w

めだかめだか2017/01/29 00:28ありがとうございます。とてもうれしいです。

私が持ち出したことに、わざわざ貴重な時間を割いて頂き....雪乃さんに相談して、間違いではなかったと思っております。(初めからそうでしたが(笑

ですが、時間が無く、今すぐに詳しくすることができないのが、残念で残念で・・・

ですが、今、動作確認してみたところ無事に動きました・・・!お見事です!

私一人では到底無理だと思っていた今回の件ですが、雪乃さんのご尽力もあり、無事、解決できました!有り難うございます!


雪乃さんが組んで組んでくださいました、コードをしっかりと理解したのち、そちらのコードを元に、こちらで手を加えながら、自分が目指すものに近づけれるコードを組んでいきたいと思っています。

また、失礼ながら、雪乃さんにはこれからも、バシバシ質問をさせてもらいます・・・(笑

それでは、今回の件については、雪乃さんの活躍のみで一件落着ということにさせてもらいます。
本当に有り難うございました!



追記;おそらく、数時間後にはもう既に質問をさせてもらっていると思います...(笑
その時は、また宜しくお願いします。

雪乃☆雫雪乃☆雫2017/01/29 17:44 いえいえ~。お役に立てて良かった❤
 これはもう、たまたまおあつらえ向きのコードが載ってるトコを発見出来たのが良かったです♪
 是非、頑張って下さい~☆

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