none
OpenCV3.0で提供されているクラスの継承の仕方 RRS feed

  • 質問

  • お疲れ様です。

    VC++2012Expressを使用しております。

    Windowsアプリケーションにて、OpenCV3.0というものを使って

    USBカメラ画像の取込みをさせたいです。

    まずは、接続されているUSBカメラのリストを作成しておりますが

    OpenCV3.0にあるクラスを流用(継承)して作成できればと考えております。

    そこで、素人なので、他者の作成したクラスの継承の仕方がいまいちわかりません。

    #include "opencv2/opencv.hpp"

    "include "cap_dshow.hpp"

    class camsel :public videoInput{

    };

    としたいのですが、”クラスまたは構造体名ではありません”と怒られます。

    ど素人ですが、こんな単純には継承できないのでしょうか?

    どなたか教えてください。

    よろしくお願いします。


    2015年9月10日 0:29

回答

  • 失礼しました。補足します。

    videoInputはcap_dshow.cpp内に定義されているようですね。ただしcap_dshow.hppには定義されておらず「class videoInput;」と存在のみが宣言されています。この場合、外部から使用することができません。コピペすれば流用できなくもないですが、ヘッダーファイルから意図的に外されているということはコピペされることは想定されていないため、ハードルが高いものと思われます。

    以上が、OpenCVに関する話題で、それとは別にC++言語の一般論として補足します。

    「~videoInput();」のようにデストラクターにvirtualの指定がされていないクラスは外部から継承されることを想定されていません。具体的には扱い方を間違えると派生クラスで確保したリソースの解放漏れが発生する可能性が生じます。この観点からもvideoInputクラスを継承することはお勧めできません。

    • 回答としてマーク to1109 2015年9月10日 4:13
    2015年9月10日 2:22

すべての返信

  • videoInputとは何者でしょうか? OpenCV 3.0.0 Reference manualからは見つかりませんでした。
    2015年9月10日 0:48

  • ご確認頂きありがとうございます。

    外部に公開されていない部分で無理なことをしようとしているのでしょうか???

    \sources\modules\videoio\src\cap_dshow.cpp

    という箇所に書かれているクラスとなります。

    //////////////////////////////////////   VIDEO INPUT   /////////////////////////////////////
    class videoInput{
        public:
            videoInput();
            ~videoInput();

            //Functions in rough order they should be used.
            static int listDevices(bool silent = false);
    };

    int videoInput::listDevices(bool silent){
    }

    ここのクラスとなるのですが。

    無謀でしょうか?

    ソースが、ここまで公開されているのであれば、

    これをコピペして、流用するのが良いのでしょうか?

    情報として大事な箇所もわかりません。

    ご教示お願いします。よろしくお願いします。

    2015年9月10日 1:39
  • 失礼しました。補足します。

    videoInputはcap_dshow.cpp内に定義されているようですね。ただしcap_dshow.hppには定義されておらず「class videoInput;」と存在のみが宣言されています。この場合、外部から使用することができません。コピペすれば流用できなくもないですが、ヘッダーファイルから意図的に外されているということはコピペされることは想定されていないため、ハードルが高いものと思われます。

    以上が、OpenCVに関する話題で、それとは別にC++言語の一般論として補足します。

    「~videoInput();」のようにデストラクターにvirtualの指定がされていないクラスは外部から継承されることを想定されていません。具体的には扱い方を間違えると派生クラスで確保したリソースの解放漏れが発生する可能性が生じます。この観点からもvideoInputクラスを継承することはお勧めできません。

    • 回答としてマーク to1109 2015年9月10日 4:13
    2015年9月10日 2:22
  • ご回答ありがとうございました。

    C++というかコーディング自体の経験も特になく

    メリットデメリットもよくわからないで継承とかが正しいハズという思いで考えておりました。

    回答頂きすっきりしました。

    DirectShowで別にコーディングする方法で進みたいと思います。

    ありがとうございました。

    ただ、opencvと、directshowのインクルードがかぶってしまいますけど。。。

    どう対処すればよろしかったでしょうか?

    すいません。お題が変わってしまいました。

    • 回答としてマーク to1109 2015年9月10日 4:13
    • 回答としてマークされていない to1109 2015年9月10日 4:13
    2015年9月10日 2:45
  • 当初の質問とは関連性がありませんので、本スレッドは解決済みとし、新たに質問していただいたほうがいいです。

    その際、.NET Frameworkフォーラムとは無関係ですので、Visual C++ Express Editionフォーラムを選択された方が適切です。

    2015年9月10日 3:55
  • ありがとうございます。

    Visual C++ Express Editionフォーラムが見当たらなくて。。。。

    探してみます。

    2015年9月10日 4:15