代码之家  ›  专栏  ›  技术社区  ›  Dat Chu

在运行时构造OpenCV元素类型

  •  3
  • Dat Chu  · 技术社区  · 14 年前

    在opencv中,当我需要创建一个cv::mat时,我需要沿着

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

    如果我只知道我需要元素为float或double+,那么运行时是否需要1/2/3通道,会发生什么?

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

    1 回复  |  直到 14 年前
        1
  •  5
  •   Reinderien    14 年前

    阅读源代码 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糟糕的类型安全。