【问题标题】:Difference between OpenCV type CV_32F and CV_32FC1OpenCV 类型 CV_32F 和 CV_32FC1 的区别
【发布时间】:2016-09-28 13:28:05
【问题描述】:

我想知道 OpenCV 类型 CV_32F 和 CV_32FC1 之间是否有任何区别? 我已经知道 32F 代表“32 位浮点”,C1 代表“单通道”,但不胜感激。

如果是,它们有何不同/在哪些特定情况下我应该使用哪一个?您可能知道,openCV 类型可能会变得非常棘手......

提前感谢大家的帮助!

【问题讨论】:

    标签: c++ opencv computer-vision


    【解决方案1】:

    CV_32FCV_32FC1 的值都是5(请参阅下面的说明),因此在数值上没有区别。

    但是:

    • CV_32F定义了矩阵每个元素的深度,而
    • CV_32FC1 定义了每个元素的深度和通道数。

    几个例子...

    许多功能,例如SobelconvertTo,需要目标深度(并且不是通道数),因此您可以:

    Sobel(src, dst, CV_32F, 1, 0);
    
    src.convertTo(dst, CV_32F);
    

    但是,例如在创建矩阵时,还必须指定通道数,因此:

    Mat m(rows, cols, CV_32FC1);
    

    基本上,每次您还应该指定通道数时,使用CV_32FCx。如果您只需要深度,请使用CV_32F


    CV_32F 定义为:

     #define CV_32F  5
    

    CV_32FC1 定义为:

    #define CV_CN_SHIFT   3
    #define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)
    #define CV_MAT_DEPTH_MASK       (CV_DEPTH_MAX - 1)
    #define CV_MAT_DEPTH(flags)     ((flags) & CV_MAT_DEPTH_MASK)
    #define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
    
    #define CV_32FC1 CV_MAKETYPE(CV_32F,1)
    

    计算结果为5

    您可以通过以下方式检查:

    #include <opencv2\opencv.hpp>
    #include <iostream>
    int main()
    {
        std::cout <<  CV_32F << std::endl;
        std::cout <<  CV_32FC1 << std::endl;
    
        return 0;
    }
    

    【讨论】:

    • 非常感谢您的完整回答,现在更清楚了:)
    • 如果答案解决了您的问题。勾选绿色勾号接受它。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多