【问题标题】:How to pass the `type` of `cv::Mat` to a function?如何将`cv::Mat`的`type`传递给函数?
【发布时间】:2021-03-01 16:53:55
【问题描述】:

根据cv::Mat Class Reference,构造函数之一是:

    Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)

现在,我有 rs2::frame,我想将它们转换为 cv::Mat。所以,我定义了一个函数,在转换中,我想指定cv::Mat::type,即输出cv::Mat的类型是CV_8SC1还是CV_16SC1等等。

到目前为止,我的功能是这样的:

cv::Mat foo(rs2::frame fr, std::string mat_type) {
    .
    .
    .
}

对于mat_type,如上所示,我正在传递字符串,即"CV_8SC1""CV_16SC1"等,在函数体中,我手动比较字符串:

    .
    .
    if(mat_type == "CV_8SC1") {
        return cv::Mat(width, height, CV_8SC1, ...);
    } else if ...
    .
    .
    .
    else {
        
    }

但是,这不是很有效,对吧?假设将来,如果我需要另一种类型的 cv::Mat,那么我必须通过在 if... else... 语句中添加新条件来更新函数。

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

只是为了提前澄清:我的问题与这些问题不同:

  1. 传递 cv::Mats 的最佳做法是什么 - link
  2. 如何通过网络传递 cv::Mat? - link

【问题讨论】:

    标签: c++ opencv realsense


    【解决方案1】:

    注意类型是这样定义的:

    #define     CV_16S   3
    

    我认为你应该传递一个intor uint64_t 在 OpenCV 的源代码中):

    yourFunction(rs2::frame fr, int mat_type)
    

    然后调用和调用你的函数:

    yourFunction(fr, cv::CV_8SC1)
    

    你可以看到here的定义,还有一个很酷的易于使用的矩阵here

    然后,在你的函数中做一个 switch case:

    switch(mat_type) {
        case cv::CV_8SC1 : //Something
        case cv::CV_32S : //Something else
    .
    .
    .
    
    }
    

    无论如何,您都必须为每种类型做一个案例(这是正常的)。 并且不要忘记在您使用它的任何地方都可以访问cv

    【讨论】:

    • ...假设编译时的数据类型
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      • 2018-07-08
      • 2018-03-23
      相关资源
      最近更新 更多