我正在使用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 ++专家,所以感谢任何帮助。
答案 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);
// ...
}