C++ 如何将'cv::Mat'的'type'传递给函数?

C++ 如何将'cv::Mat'的'type'传递给函数?,c++,opencv,realsense,C++,Opencv,Realsense,根据,其中一个构造函数是: Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP) 现在,我有,我想把它们转换成cv::Mat。因此,我定义了一个函数,在转换中,我想指定输出cv::Mat的类型是cv_8SC1还是cv_16SC1等等 现在,我的函数是这样的: cv::Mat foo(rs2::frame fr, std::string mat_type) { . . . }

根据,其中一个构造函数是:

    Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
现在,我有,我想把它们转换成
cv::Mat
。因此,我定义了一个函数,在转换中,我想指定输出
cv::Mat
的类型是
cv_8SC1
还是
cv_16SC1
等等

现在,我的函数是这样的:

cv::Mat foo(rs2::frame fr, std::string mat_type) {
    .
    .
    .
}
#define     CV_16S   3
对于
mat_类型
,如上所示,我传递字符串,即
“CV_8SC1”
“CV_16SC1”
,在函数体中,我手动比较字符串:

    .
    .
    if(mat_type == "CV_8SC1") {
        return cv::Mat(width, height, CV_8SC1, ...);
    } else if ...
    .
    .
    .
    else {
        
    }
但是,这不是很有效,对吗?比如说,在将来,如果我需要另一种类型的
cv::Mat
,那么我必须通过在
中添加一个新条件来更新函数,如果。。。否则语句

那么,我怎样才能避免这种情况,做一些更有效的事情呢?我的意思是,有没有办法直接传递
cv::Mat::type
,而不是传递一个等价的字符串,然后在函数体中进行比较

先澄清一下:我的问题与这些问题不同:

  • 传递cv::Mats的最佳实践是什么-
  • 如何通过网络传递cv::Mat?-
    请注意,类型的定义如下:

    cv::Mat foo(rs2::frame fr, std::string mat_type) {
        .
        .
        .
    }
    
    #define     CV_16S   3
    
    我认为您应该传递一个
    int
    或uint64\u t
    ,就像在OpenCV的源代码中一样):

    然后调用函数并调用函数,如下所示:

    yourFunction(fr, cv::CV_8SC1)
    
    你可以看到定义,还有一个很酷的易于使用的矩阵

    然后,在您的功能中执行一个切换情况:

    switch(mat_type) {
        case cv::CV_8SC1 : //Something
        case cv::CV_32S : //Something else
    .
    .
    .
    
    }
    
    无论如何,你必须为每种类型做一个案例(这是正常的)。 不要忘了访问
    cv
    的必要性,无论你在哪里使用它

    如果你的问题是“你不认为运行时类型检查有点不切实际,并且在处理越来越多的类型时不能很好地扩展吗?”那么答案是肯定的,但当你使用诸如cv::Mat之类的类型擦除对象时,这就是你的签名


    仅供参考,OpenCV中有一个
    cv::Mat
    类型,您可以使用它,以防在编译时知道数据类型,并且不想丢失该信息。

    。。。在编译时分析数据类型