Mat的OpenCV #define类型

时间:2016-11-09 11:00:38

标签: c++ opencv

我正在使用C ++和OpenCV。现在我想在我的代码中定义一些Mat类型(例如CV_32FC3)以供很多Mats使用。

为实现这一目标,我尝试了:

#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);
}

但是,这会导致错误

  

期待')'

     

期待一个表达

然后我试过了,

#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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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);

    // ...
}