2016-11-09 14 views
1

私はC++とOpenCVを使用しています。今度は、Matタイプ(CV_32FC3など)を自分のコードで多くのMatsが使用するように定義したいと思います。これを実現するためにOpenCV#Mat Typeの定義タイプ

、私が試した:

#define FLOW_TYPE CV_32FC3; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, FLOW_TYPE); 
} 

をしかし、これはAと予想エラー

を起こし ')'

は、その後、私は試した表現

を期待しました、

#define FLOW_TYPE CV_32FC3; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    int test = FLOW_TYPE; 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, test); 
} 

私の意見ではうまくいくが、これは醜い。

なぜ、どのように動作するのか、なぜ最初のスニペットでエラーが発生するのかわかりません。私はC + +の専門家ではないので、どんな助けもありがとうございます。

答えて

2

あなたの間違いは、定義の最後に;です。あなたのコードがなければなりません:

#define FLOW_TYPE CV_32FC3 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, FLOW_TYPE); 
} 

あなたはこのように定義するすべてで削除した場合の素敵な詳細:

constexpr auto FLOW_TYPE = CV_32FC3; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, FLOW_TYPE); 
} 
+0

素晴らしい!それはそれを修正する。なぜ 'constexpr auto'が' #define'を使うよりも良いのか説明できますか? –

+0

また、 'int test = FLOW_TYPE;'をローカル変数として使うのはなぜですか? –

+1

@WouterFlorijnそれは 'int test = CV_32FC3 ;;'に二重のセミコロンで展開されるので、エラーではありません。 'cv :: Mat flow = cv :: Mat(frame1.rows、frame1.cols、CV_32FC3;);は代わりにエラーです(' CV_32FC3'の後のセミコロンに注意してください)。 – Miki

1

それはエラーが発生し

cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, CV_32FC3;); 

に展開するため、これはエラーを持っています(CV_32FC3の後のセミコロンに注意してください)。ローカル変数で ではなく、それは次のように拡張されますダブルセミコロンで

int test = CV_32FC3;; 

、それはエラーではありません。

セミコロンなしで定義し、これを修正することができます。

#define FLOW_TYPE CV_32FC3 

それはおそらく簡単に直接使用するマトリックスの種類を定義し、簡単にアクセスMat_<Tp>を使用するだろう(そうでありません要素にアクセスする.at<Tp>(...)を使用する必要があるが、ちょうど括弧):

using FlowMat = cv::Mat3f; 

cv::Mat BaoOpticalFlow::initialize(cv::Mat & frame1, cv::Mat & frame2) 
{ 
    FlowMat flow(frame1.rows, frame1.cols); 

    // or, to zero initialize 
    // FlowMat flow = FlowMat::zeros(frame1.rows, frame1.cols); 

} 

または:

using FlowType = cv::Vec3f; 
using FlowMat = cv::Mat_<FlowType>; 

void foo(cv::Mat& frame1, cv::Mat& frame2) 
{ 
    FlowMat flow = FlowMat::zeros(frame1.rows, frame1.cols); 

    flow(2, 3) = FlowType(1, 2, 3); 
    FlowType value = flow(2, 3); 

    // ... 
} 
関連する問題