opencvなどのソフトを開発した人はWindowsでも使えるようにとwin32APIなどの使い方を勉強されたのでしょうか?
win32APIでは、例えば実行ファイルのウィンドウのサイズを大きくして出力したい場合、
BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル HWND hWndInsertAfter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uFlags // ウィンドウ位置のオプション );
などがあります。
そこで質問なのですが、
opencvなどのプログラムvideocaptureは出力ウィンドウのサイズを変える関数ですが、この関数に書いた幅と高さの数値がwin32APIに反映する事で、実際に出力ウィンウのサイズが変わるのでしょうか?
もし反映されないならば、win32APIとは違う何かにopencvのvideocapture関数にかいた幅と高さの数値が働くのでしょうか?
どうかよろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/12 22:35 編集
2018/02/13 03:03
2018/02/13 08:53
2018/02/13 09:15
回答3件
0
ベストアンサー
void cv::imshow( const String& winname, InputArray _img )
c++
1void cv::imshow( const String& winname, InputArray _img ) 2{ 3 CV_TRACE_FUNCTION(); 4 const Size size = _img.size(); 5// 省略 6 const double autoSize = getWindowProperty(winname, WND_PROP_AUTOSIZE); 7 8 9 if (autoSize > 0) 10 { 11 resizeWindow(winname, size.width, size.height); 12 } 13
winnameに関連付けられたwindowにAUTOSIZE属性がついている場合
cv::imshowはリサイズを行います。
(win32の場合の)
CV_IMPL void cvResizeWindow(const char* name, int width, int height )
c++
1CV_IMPL void cvResizeWindow(const char* name, int width, int height ) 2{ 3 CV_FUNCNAME( "cvResizeWindow" ); 4 5 6 __BEGIN__; 7 8 9 int i; 10 CvWindow* window; 11 RECT rmw, rw, rect; 12 13 14 if( !name ) 15 CV_ERROR( CV_StsNullPtr, "NULL name" ); 16 17 18 window = icvFindWindowByName(name); 19 if(!window) 20 EXIT; 21 22 23 // Repeat two times because after the first resizing of the mainhWnd window 24 // toolbar may resize too 25 for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++) 26 { 27 rw = icvCalcWindowRect(window); 28 MoveWindow(window->hwnd, rw.left, rw.top, 29 rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE); 30 GetClientRect(window->hwnd, &rw); 31 GetWindowRect(window->frame, &rmw); 32 // Resize the mainhWnd window in order to make the bitmap fit into the child window 33 MoveWindow(window->frame, rmw.left, rmw.top, 34 rmw.right - rmw.left + width - rw.right + rw.left, 35 rmw.bottom - rmw.top + height - rw.bottom + rw.top, TRUE); 36 } 37 38 39 rect = icvCalcWindowRect(window); 40 MoveWindow(window->hwnd, rect.left, rect.top, 41 rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE); 42 43 44 __END__; 45}
まぁ普通にWin32APIを用いています。
投稿2018/02/13 03:38
総合スコア15147
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/13 09:06
2018/02/13 09:51 編集
2018/02/13 09:36
2018/04/15 16:26
2018/04/15 16:53
2018/04/15 17:06
2018/04/17 08:35
2018/04/17 08:49
2018/04/17 09:03
2018/04/17 12:58
2018/04/17 13:00
2018/04/18 00:42
2018/04/18 10:00
0
opencvなどのソフトを開発した人はWindowsでも使えるようにとwin32APIなどの使い方を勉強されたのでしょうか?
当然です。
opencvなどのプログラムvideocaptureは出力ウィンドウのサイズを変える関数ですが、
違います。これまでの質問でも、何人のも回答者さんが「そうではない」と指摘したにも関わらず、まだ理解できていないようですね。VideoCaptureクラスがやっていることは、カメラやチューナーユニットのようなキャプチャーデバイスから送られてくる映像データからフレーム画像を取り出すことです。
キャプチャーする際に、取得したい画サイズを指定することでフレーム画像がその画サイズに設定されます。cv::imshow
関数はフレーム画像の画サイズに合わせてウィンドウを表示します。
つまり、ウィンドウ制御のAPIを呼び出しているのはcv:imshow
関数の中ということになります。
この関数に書いた幅と高さの数値がwin32APIに反映する事で、実際に出力ウィンウのサイズが変わるのでしょうか?
その通りです。APIを正しく呼び出せば、期待通りの結果が得られます。
ただ、言葉の使い方がちょっとおかしいです。この質問を正しく言い換えるなら『この関数に幅と高さを渡して呼び出すと、実際に出力ウィンウのサイズが変わるのでしょうか?』となります。APIとは何かを理解してください。
SetWindowPos
関数はWin32APIの一つなので、この文脈においては「関数=API」です。したがって、『このAPIに幅と高さを~』と言い換えることもできますし、より丁寧に『このAPI関数に幅と高さを~』と言うこともできます。
もし反映されないならば、win32APIとは違う何かにopencvのvideocapture関数にかいた幅と高さの数値が働くのでしょうか?
前述の通り、ちゃんと反映されますから。
質問は一つ一つクリアしてからしましょう。勝手に答えを想像して見当違いの質問をすることは問題を複雑にするだけですし、回答する側もいちいち否定しないといけないので面倒です。
投稿2018/02/13 01:39
総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/13 02:16
2018/02/13 02:20
2018/02/13 02:35
2018/02/13 02:38
2018/02/13 02:45
2018/02/13 02:51
2018/02/13 03:05
2018/02/13 05:18
2018/02/13 17:12
2018/02/13 17:20
2018/02/13 23:27 編集
2018/02/13 23:28
2018/02/14 01:59
0
opencvなどのプログラムvideocaptureは出力ウィンドウのサイズを変える関数ですが、
VideoCaptureはビデオファイルやカメラからフレームをキャプチャする関数でウィンドウサイズとは無関係だと思います。
ウィンドウサイズはimshow()でVideoCaptureがキャプチャした画像のサイズにリサイズして表示しているに過ぎないのだと思います。
OpenCVのありがたみはOpenCVを使わずに同じ処理を作ってみれば理解できるのではないでしょうか。
ウィンドウに画像を表示するのは猫でもわかるプログラミングを一通り読めば実装できると思います。
カメラからの画像取り込みはdirectShowの理解が必要なので私では説明しきれません。
投稿2018/02/12 20:51
編集2018/02/12 21:09総合スコア1430
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/13 17:21
2018/02/15 12:52
2018/02/15 15:25
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。