【问题标题】:Construct OpenCV element type in runtime在运行时构造 OpenCV 元素类型
【发布时间】:2010-06-26 04:10:26
【问题描述】:

在 OpenCV 中,当我需要创建一个 cv::Mat 时,我需要按照以下方式做一些事情

cv::Mat new_mat(width, height, CV_32FC3)

如果我只知道我需要元素是浮点数还是双精度 + 在运行时是否需要 1/2/3 个通道,会发生什么?

换句话说,给定元素类型(float)和通道数(int),我该如何构造术语:CV_32FC3?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    阅读cxtypes.h 的源代码。它包含如下几行:

    #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
    #define CV_32FC2 CV_MAKETYPE(CV_32F,2)
    #define CV_32FC3 CV_MAKETYPE(CV_32F,3)
    #define CV_32FC4 CV_MAKETYPE(CV_32F,4)
    #define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))
    
    #define CV_64FC1 CV_MAKETYPE(CV_64F,1)
    #define CV_64FC2 CV_MAKETYPE(CV_64F,2)
    #define CV_64FC3 CV_MAKETYPE(CV_64F,3)
    #define CV_64FC4 CV_MAKETYPE(CV_64F,4)
    #define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
    

    CV_MAKETYPE 定义为:

    #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
    

    这建议使用以下代码:

    bool isdouble;
    int nchannels;
    // ...
    if (isdouble) typeflag = CV_64FC(nchannels);
    else typeflag = CV_32FC(nchannels);
    

    我没有测试过这个;让我知道它是否有效。另外:我讨厌 opencv 糟糕的类型安全性。

    【讨论】:

    • 我直接使用 CV_MAKETYPE 而不是简写。您的解决方案有效。
    • @Dat Chu:你如何找出只有每个元素的类型名的深度? (我正在尝试在模板方法中计算类型)。
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 2020-05-31
    • 1970-01-01
    • 2019-07-21
    • 2019-05-29
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多