我想知道OpenCV类型CV_32F和CV_32FC1之间是否有任何区别? 我已经知道32F代表一个" 32位浮点"和#34;单通道",但进一步的解释将不胜感激。
如果是,那么它们在哪些特定情况下应该如何区别?您可能知道openCV类型会变得非常棘手......
提前感谢大家的帮助!
答案 0 :(得分:33)
CV_32F
和CV_32FC1
的值均为5
(请参阅下面的说明),因此在数字上没有区别。
然而:
CV_32F
定义矩阵中每个元素的深度,而CV_32FC1
定义每个元素的深度和通道数。一些例子......
许多功能,例如Sobel或convertTo需要目标深度(不>频道数),所以您可以:
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;
}