我正在使用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);
}
但是,这会导致错误。
预期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++专家,所以任何帮助都是值得感谢的。
发布于 2016-11-09 11:06:22
您的错误出现在定义末尾的;
中。您的代码必须是:
#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);
}
发布于 2016-11-09 12:02:36
您有一个错误,因为它扩展为
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);
// ...
}
https://stackoverflow.com/questions/40505369
复制相似问题