首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV #为Mat定义类型

OpenCV #为Mat定义类型
EN

Stack Overflow用户
提问于 2016-11-09 11:00:38
回答 2查看 608关注 0票数 1

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

为了达到这个目的,我试着:

代码语言:javascript
运行
复制
#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‘) 期望表达

然后我试了一下

代码语言:javascript
运行
复制
#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++专家,所以任何帮助都是值得感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-09 11:06:22

您的错误出现在定义末尾的;中。您的代码必须是:

代码语言:javascript
运行
复制
#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);
}

如果您完全删除了这样的定义,会更好:

代码语言:javascript
运行
复制
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);
}
票数 2
EN

Stack Overflow用户

发布于 2016-11-09 12:02:36

您有一个错误,因为它扩展为

代码语言:javascript
运行
复制
cv::Mat flow = cv::Mat(frame1.rows, frame1.cols, CV_32FC3;); 

这将导致错误(注意CV_32FC3后面的分号)。使用局部变量,它扩展为:

代码语言:javascript
运行
复制
int test = CV_32FC3;; 

用双分号,但这不是错误。

您可以在不使用分号的情况下纠正此定义:

代码语言:javascript
运行
复制
#define FLOW_TYPE CV_32FC3

直接定义您想要使用的矩阵类型,使用Mat_<Tp>进行更容易的访问(您不需要使用.at<Tp>(...)来访问元素,而只需要使用括号),这可能更容易:

代码语言:javascript
运行
复制
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); 

}

或者:

代码语言:javascript
运行
复制
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);

    // ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40505369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档