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

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

ただいまの
回答率

90.51%

  • C

    4509questions

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

  • C++

    4414questions

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

  • Windows

    1705questions

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

  • Win32 API

    290questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,184

carnage0216

score 122

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関数にかいた幅と高さの数値が働くのでしょうか?

どうかよろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • carnage0216

    2018/02/13 12:03

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

    キャンセル

  • episteme

    2018/02/13 17:53

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

    キャンセル

  • carnage0216

    2018/02/13 18:15

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

    キャンセル

回答 3

checkベストアンサー

+3

void cv::imshow( const String& winname, InputArray _img )

void cv::imshow( const String& winname, InputArray _img )
{
    CV_TRACE_FUNCTION();
    const Size size = _img.size();
// 省略
        const double autoSize = getWindowProperty(winname, WND_PROP_AUTOSIZE);


        if (autoSize > 0)
        {
            resizeWindow(winname, size.width, size.height);
        }

winnameに関連付けられたwindowにAUTOSIZE属性がついている場合
cv::imshowはリサイズを行います。

(win32の場合の)
CV_IMPL void cvResizeWindow(const char* name, int width, int height )

CV_IMPL void cvResizeWindow(const char* name, int width, int height )
{
    CV_FUNCNAME( "cvResizeWindow" );


    __BEGIN__;


    int i;
    CvWindow* window;
    RECT rmw, rw, rect;


    if( !name )
        CV_ERROR( CV_StsNullPtr, "NULL name" );


    window = icvFindWindowByName(name);
    if(!window)
        EXIT;


    // Repeat two times because after the first resizing of the mainhWnd window
    // toolbar may resize too
    for(i = 0; i < (window->toolbar.toolbar ? 2 : 1); i++)
    {
        rw = icvCalcWindowRect(window);
        MoveWindow(window->hwnd, rw.left, rw.top,
            rw.right - rw.left + 1, rw.bottom - rw.top + 1, FALSE);
        GetClientRect(window->hwnd, &rw);
        GetWindowRect(window->frame, &rmw);
        // Resize the mainhWnd window in order to make the bitmap fit into the child window
        MoveWindow(window->frame, rmw.left, rmw.top,
            rmw.right - rmw.left + width - rw.right + rw.left,
            rmw.bottom  - rmw.top + height - rw.bottom + rw.top, TRUE);
    }


    rect = icvCalcWindowRect(window);
    MoveWindow(window->hwnd, rect.left, rect.top,
        rect.right - rect.left + 1, rect.bottom - rect.top + 1, TRUE);


    __END__;
}

まぁ普通にWin32APIを用いています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/13 18:06

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

    キャンセル

  • 2018/02/13 18:34 編集

    気合と根性で検索です

    MSVC使ってるなら定義へ移動で一発じゃないの?

    キャンセル

  • 2018/02/13 18:36

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

    キャンセル

  • 2018/04/16 01:26

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

    キャンセル

  • 2018/04/16 01:53

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

    キャンセル

  • 2018/04/16 02:06

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

    キャンセル

  • 2018/04/17 17:35

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

    キャンセル

  • 2018/04/17 17:49

    おっしゃる通り、別に必要なものじゃありませんね

    ただ、「opencv_coreとopencv_highguiとopencv_...が必要です」よりは「opencvが必要です」の方が楽でしょ

    だから、自分でビルドして日常的にopencvを利用したソースを書いてる人なんかは
    全部盛りを作って楽してる人もいる ってだけ

    正規の奴が分散してる理由は知らんがビルド時間が長いとかCUDA/OpenCL有効にするとアホみたいにデカいとかじゃね?

    キャンセル

  • 2018/04/17 18:03

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

    キャンセル

  • 2018/04/17 21:58

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

    キャンセル

  • 2018/04/17 22:00

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

    キャンセル

  • 2018/04/18 09:42

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

    MSVCの場合ソリューションやプロジェクトがMakefileの代替になっている

    キャンセル

  • 2018/04/18 19:00

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

    キャンセル

+2

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 11:16

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

    キャンセル

  • 2018/02/13 11: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さんから送って頂いたプログラムです。

    キャンセル

  • 2018/02/13 11:35

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

    キャンセル

  • 2018/02/13 11:38

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

    キャンセル

  • 2018/02/13 11:45

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

    キャンセル

  • 2018/02/13 11:51

    > このプログラムがwin32apiに反映されるのですね。

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

    キャンセル

  • 2018/02/13 12:05

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

    キャンセル

  • 2018/02/13 14:18

    epistemeさん、フォローありがとうございます。

    carnage0216さん

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

    キャンセル

  • 2018/02/14 02:12

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

    キャンセル

  • 2018/02/14 02:20

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

    キャンセル

  • 2018/02/14 04:01 編集

    何訊いてるのかな...?
    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: ビープ音を鳴らす
    }

    キャンセル

  • 2018/02/14 08:28

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

    キャンセル

  • 2018/02/14 10:59

    > API関数そのものに幅と高さの情報を書き込むことは可能なのでしょうか?

    我々にはこれの意味が判らないのですよ。「API関数」という言葉で我々が一般的に理解しているものと、あなたが「想像している」ものとの乖離があまりにも大きいのです。

    専門用語の独自解釈は、知識を得る際の障害となります。

    書かれているURLのサイトも見てみましたが、それはPHPからWin32APIを使う話ですね。はっきり言ってC/C++にとっては何の役にも立たない情報です(Win32APIは最初からC言語向けに作られていますから)。基本的な知識がないので余計なことに振り回されるのです。

    野球の話をするなら野球の知識が、医学の話をするなら医学の知識が、車の話をするなら車と知識が、そして、プログラミングの話をするならプログラミングの知識が必要です。
    プログラミングの知識を身につけたいのなら、その手のスクールに通うのが一番手っ取り早いですが、独学で身につけたいのなら入門書などで体系的に勉強して練習問題などをこなし、自分でいろいろとプログラムを作って動かしてみることです。
    最初のステップを疎かにしている限り「好奇心」を満たすことは無理でしょう。

    キャンセル

0

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/14 02:21

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

    キャンセル

  • 2018/02/15 21:52

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

    キャンセル

  • 2018/02/16 00:25

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

    キャンセル

同じタグがついた質問を見る

  • C

    4509questions

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

  • C++

    4414questions

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

  • Windows

    1705questions

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

  • Win32 API

    290questions

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