質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

4070閲覧

opencvのプログラムがwin32APIで実行できる理由。

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/02/12 19:32

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2018/02/12 20:32

コード読めばいいじゃない。「さんざんコード追いかけてみたけどWin32-APIに到達できなかった」ってことですか?
episteme

2018/02/12 22:35 編集

もう何度も何度も書いたけどVideoCaptureにウィンドウサイズを変える力はありませんってば! あとVideoCaptureは関数じゃない。
carnage0216

2018/02/13 03:03

はい。void imshow(const string& winname, const Mat& image)からwin32apiに到達できていません...。
episteme

2018/02/13 08:53

imshowがキモだとわかってて、なんでいまだにVideoCaptureがどーしたこーした言うてるんよ?
carnage0216

2018/02/13 09:15

本当にすいません。言い訳のように聞こえますが、前に答えて頂いた質問でVideoCaptureの印象が強く残ったせいかわけのわからない事ばかり質問していました。 win32apiにはasmさんと過去に質問した解答などをもとにやっと到達出来ました。
guest

回答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

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/02/13 09:06

ソースコード、どうもありがとうございます。 ちなみに、どうやってcv::imshowがWindow.cppに書いてあるとわかったのでしょうか? また、なぜresizeWindowからwindow_w32.cppにcvResizeWindowがあると導けたのでしょうか?
asm

2018/02/13 09:51 編集

気合と根性で検索です MSVC使ってるなら定義へ移動で一発じゃないの?
episteme

2018/02/13 09:36

あと「経験に裏打ちされた勘」な。
carnage0216

2018/04/15 16:26

asmさん、過去の質問からで申し訳ありません。 Opencvに含まれるライブラリのopencv_worldxxx.libに関してなのですが、opencv_worldxxx.libの基になったⅭソースコードを探してもなかったのですが、これはライブラリとしてしか配布されていないのでしょうか? できればopencv_worldxxx.libの基になったⅭソースコードを見てみたかったのですが、残念です。githubでも探してみましたが見つかりませんでした。
asm

2018/04/15 16:53

強いて言えばOpenCVのライブラリ一式全部ですね
carnage0216

2018/04/15 17:06

!?通りで見つからないわけです。 流石に全て載せてコンパイルはきついのでおとなしくライブラリを使います。 どうもありがとうございました。
carnage0216

2018/04/17 08:35

あの、opencv_worldxxx.libはすべてのopencvのソースコードをコンパイルしたバイナリの塊ですが、なぜ必要なのかわかりません。 そのライブラリがなくてもビルドしてコンパイルして得られたソースコードのバイナリさえあれば良いのではないのでしょうか?
asm

2018/04/17 08:49

おっしゃる通り、別に必要なものじゃありませんね ただ、「opencv_coreとopencv_highguiとopencv_...が必要です」よりは「opencvが必要です」の方が楽でしょ だから、自分でビルドして日常的にopencvを利用したソースを書いてる人なんかは 全部盛りを作って楽してる人もいる ってだけ 正規の奴が分散してる理由は知らんがビルド時間が長いとかCUDA/OpenCL有効にするとアホみたいにデカいとかじゃね?
carnage0216

2018/04/17 09:03

迅速な回答ありがとうございます。 ビルドと聞いて思いついたのがcmakeです。cmakeは便利なツールなようですが、 私個人からするとmakefileを作ってすべてのソースコードをコンパイルして、ライブラリを作り、目的のソースコードをビルドする際の手間を省くのも良いかもしれません。
episteme

2018/04/17 12:58

↑ある程度の規模になったらフツーにそうする。
carnage0216

2018/04/17 13:00

そ、そうだったのですか。勉強不足でした。
asm

2018/04/18 00:42

ある程度の規模(ソースが分割されているor複数人かつコンパイルオプションが必要)になるとMakefileが欲しくなり さらに大きくなる(複数の環境を想定している事が多い)とconfigureやcmakeが必要になる. MSVCの場合ソリューションやプロジェクトがMakefileの代替になっている
carnage0216

2018/04/18 10:00

すごくわかりやすいです。 どうもありがとうございます。
guest

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

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/02/13 02:16

しっかり理解できていないまま質問してしまいすいませんでした。
carnage0216

2018/02/13 02:20

ちなみに、win32api へ反映されるopencvのウィンドウの幅と高さを制御するプログラムは以下のプログラムでしょうか? bool VideoCapture_DShow::setProperty(int propIdx, double propVal) { // image capture properties bool handled = false; switch (propIdx) { case CV_CAP_PROP_FRAME_WIDTH: m_width = cvRound(propVal); // ← 幅をセットしてる現場を目撃! handled = true; break; case CV_CAP_PROP_FRAME_HEIGHT: m_height = cvRound(propVal); ... いつもお世話になっているepistemeさんから送って頂いたプログラムです。
episteme

2018/02/13 02:35

ちがうってゆってんだろがー! VideoCaptureにはウィンドウをどーこーする能力がないと何度...
catsforepaw

2018/02/13 02:38

えーと、回答に『ウィンドウ制御のAPIを呼び出しているのはcv:imshow関数の中』と書いたのですが、意味が通じませんでしたか?
carnage0216

2018/02/13 02:45

すいません。 void imshow(const string& winname, const Mat& image) このプログラムがwin32apiに反映されるのですね。
episteme

2018/02/13 02:51

> このプログラムがwin32apiに反映されるのですね。 このプログラムが(win32apiを用いることにより)imageのサイズをウィンドウに反映"する"
carnage0216

2018/02/13 03:05

どうもありがとうございます。
catsforepaw

2018/02/13 05:18

epistemeさん、フォローありがとうございます。 carnage0216さん そろそろ気づいてほしいのですが、あなたがやっていること(OpenCVのソースを読むこと)は、かなり高度なスキルと広範囲な知識が要求されます。言葉の使い方もままならない状態でソースを読んだところで、何か意味のある成果が出せるとはとても思えません。あなたの質問に多くの人が回答していますが、前提となる知識が足りないので理解できていませんし、そもそも話が通じないのです。 最初から結果を求めようとはせず、まずは自分のやりたいことを整理して、何をやりたいのか、何を目標としているのかをはっきりさせて、そこに至るまでには何をどのように勉強すれば良いのかを問うてみてはどうでしょうか。 そうでもしないと、意味があるのかどうか判らないようなやりとりを、今後も延々と続けることになりますよ。
carnage0216

2018/02/13 17:12

ご迷惑をおかけして申し訳ありませんでした。
carnage0216

2018/02/13 17:20

以下のことは実装するつもりはなくあくまで好奇心での質問です。API関数に幅と高さを渡して呼び出すと、実際に出力ウィンウのサイズが変わるとのことでしたが、API関数そのものに幅と高さの情報を書き込むことは可能なのでしょうか?もちろんwin32APIは見れないですがこちらのサイトのようにhttp://sssslide.com/speakerdeck.com/taiko19xx/phpkarawin32apiwoizitutemita APIのSetWindowPos関数の幅と高さを決める部分に数値を書き込みことでいじることは可能でしょうか? どうかよろしくお願いいたします。
episteme

2018/02/13 23:27 編集

何訊いてるのかな...? imshowを辿った先でWin32-APIを呼び出してウィンドウいじってるのを確認したんでしょ? あなたの抱いた疑問がわからんのです。 「API関数に幅と高さを渡して呼び出す」と 「API関数そのものに幅と高さの情報を書き込む」の違いを説明してくれませんか。 「void f(int) があったとき、int x = 3; f(x); できるけど、直接 f(3) なんてできるんですか」 なんつー脱力質問じゃないよね? それとも「僕が書いてるプログラムの中で直接 Win32-API呼べるんですか」なの? もちろん呼べます。キホン #include <windows.h> しておくだけ. // cl beep.cpp user32.lib #include <windows.h> int main() { MessageBeep(-1); // Win32-API: ビープ音を鳴らす }
asm

2018/02/13 23:28

ワードサラダかな すべての思い込みを捨てた上でC言語の基礎から学びなおすことをオススメします
catsforepaw

2018/02/14 01:59

> API関数そのものに幅と高さの情報を書き込むことは可能なのでしょうか? 我々にはこれの意味が判らないのですよ。「API関数」という言葉で我々が一般的に理解しているものと、あなたが「想像している」ものとの乖離があまりにも大きいのです。 専門用語の独自解釈は、知識を得る際の障害となります。 書かれているURLのサイトも見てみましたが、それはPHPからWin32APIを使う話ですね。はっきり言ってC/C++にとっては何の役にも立たない情報です(Win32APIは最初からC言語向けに作られていますから)。基本的な知識がないので余計なことに振り回されるのです。 野球の話をするなら野球の知識が、医学の話をするなら医学の知識が、車の話をするなら車と知識が、そして、プログラミングの話をするならプログラミングの知識が必要です。 プログラミングの知識を身につけたいのなら、その手のスクールに通うのが一番手っ取り早いですが、独学で身につけたいのなら入門書などで体系的に勉強して練習問題などをこなし、自分でいろいろとプログラムを作って動かしてみることです。 最初のステップを疎かにしている限り「好奇心」を満たすことは無理でしょう。
guest

0

opencvなどのプログラムvideocaptureは出力ウィンドウのサイズを変える関数ですが、

VideoCaptureはビデオファイルやカメラからフレームをキャプチャする関数でウィンドウサイズとは無関係だと思います。

ウィンドウサイズはimshow()でVideoCaptureがキャプチャした画像のサイズにリサイズして表示しているに過ぎないのだと思います。

OpenCVのありがたみはOpenCVを使わずに同じ処理を作ってみれば理解できるのではないでしょうか。
ウィンドウに画像を表示するのは猫でもわかるプログラミングを一通り読めば実装できると思います。
カメラからの画像取り込みはdirectShowの理解が必要なので私では説明しきれません。

投稿2018/02/12 20:51

編集2018/02/12 21:09
TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2018/02/13 17:21

本の紹介、どうもありがとうございます。 書店に行って読んでみます。
TaroToyotomi

2018/02/15 12:52

本買わなくてもリンク先のWindowsSDK編にWIN32APIの使い方のってますよ。
carnage0216

2018/02/15 15:25

どうもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問