OpenCV类型CV_32F和CV_32FC1之间的区别

mln*_*thr 15 c++ opencv computer-vision

我想知道OpenCV类型CV_32F和CV_32FC1之间是否有任何区别?我已经知道32F代表"32位浮点"而C1代表"单通道",但进一步的解释将是值得赞赏的.

如果是的话,它们在特定情况下应该如何区别?您可能知道openCV类型会变得非常棘手......

提前谢谢大家的帮助!

Mik*_*iki 36

两者的值CV_32FCV_32FC15(见下面的说明),所以数值没有差别.

然而:

  • CV_32F 定义矩阵的每个元素的深度,同时
  • CV_32FC1 定义每个元素的深度和通道数.

几个例子......

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

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

src.convertTo(dst, CV_32F);
Run Code Online (Sandbox Code Playgroud)

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

Mat m(rows, cols, CV_32FC1);
Run Code Online (Sandbox Code Playgroud)

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


CV_32F 定义为:

 #define CV_32F  5
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

评估为5.

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果答案解决了您的问题。通过检查绿色勾来接受它。 (3认同)