OpenCV类型CV_32F和CV_32FC1的区别

21
我想知道OpenCV类型CV_32F和CV_32FC1之间是否有区别?我已经知道32F代表“32位浮点数”,C1代表“单通道”,但希望能够得到更深入的解释。
如果有区别,它们有什么不同/在哪些特定情况下应该使用哪一个?正如你所知道的,OpenCV类型可能会变得非常棘手...
提前感谢大家的帮助!
1个回答

54

对于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;
}


1
非常感谢您提供这个详细的回答,现在更清楚了 :) - mlnthr
3
如果答案解决了您的问题,请通过勾选绿色复选标记接受它。 - sagar suri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接