2017-12-05 25 views
0

cv::VideoCaptureコンストラクタを条件付きで呼び出す必要があります。 argc == 2の場合、ユーザーはビデオファイルを指定しており、そのファイルをロードします。それ以外の場合は、デフォルトのカメラを使用します。条件付きでcv :: VideoCaptureコンストラクタを呼び出す

私がコンパイルし、それを

$ g++ -g -Wall -o main main.cpp `pkg-config opencv --cflags --libs` 
$ ./main 

を実行します。しかし、悲しいことに、動作するようには思えないと私は三項演算子は一つのケースでは、文字列と整数を返します

OpenCV: Couldn't read movie file "" 

を取得

#include <opencv2/opencv.hpp> 
#include <iostream> 

using namespace cv; 

int main(int argc, char* argv[]) 
{ 
    VideoCapture cap(argc == 2 ? argv[1] : 0); 

    return 0; 
} 

別の私は、これは私が気づいていないC++コンストラクタのいくつかの特質のためにはうまくいかないと思います。

私がしたいことを行う最もクリーンな方法は何ですか?私はnewを使わずにそれを行うことができるので、プログラムの終わりに自分自身でメモリを解放する必要はありませんか?

+1

あなたは二番目は、実際にあなたが期待する引数であることを確認するために、それぞれのarg throghルーピングしようとしたことがありますか?実行可能ファイルを実行するときにargsを解析しないと、2つのargsの合計が得られます。たぶん、args == 3とargs [2] – stav

+0

@stavを試してみました。プログラムを引数に渡さないと 'argc'が1になり、ファイル名を渡すと' 2'がチェックされます。私も 'argv'をループして、大丈夫です。 – faviouz

答えて

5

あなたはこれを過度に複雑にしています。 openを使用します。

2つのオペランド が同じ型でなければなりません三項演算子で
VideoCapture cap; 
if(argc == 2) { 
    cap.open(argv[1]); // calls: open(const String& filename) 
} else { 
    cap.open(0);  // calls: open(int index) 
} 

。詳細は、hereを参照してください。しかし、あなたのタイプはintchar*なので、コードがコンパイルされていても実行時にエラーが発生する可能性があります。

+0

ありがとう、それはうまくいきます!正直言って、私はちょうどこれを乗り越えたいと思っていました。あなたの答えは手元の根本的な問題を修正し、私の「ハック」よりも間違いなくクリーンです。 しかし、質問自体は、そのようなコンストラクタを呼び出すことがうまくいかない理由です。そして、私は実際に今なぜ好奇心が強いのですか。だから私はその答えを待つと思う。 – faviouz

+1

@faviouz編集をご覧ください – Miki

1

A ? B : Cの戻り型はBで、Cは暗黙的にBに変換可能である必要があります。コンパイラの中には(最適な動作)コンパイルされないものと、あるものがコンパイルしないものがあります。あなたの場合、B = char *C = int0は、アドレス0へのポインタ、または'\0'と等しいバイト、つまりCスタイルの文字列の終わりを示すヌル終了文字、つまり空の文字列と解釈されます。

あなたはワンライナーを主張する場合は、:

std::unique_ptr<VideoCapture> capture = (argc == 2 ? std::make_unique<VideoCapture>(argv[1]) : std::make_unique<VideoCapture>(0)); 
関連する問題