作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道 OpenCV 类型 CV_32F 和 CV_32FC1 之间是否有任何区别?我已经知道 32F 代表“32 位浮点”,C1 代表“单 channel ”,但我们将不胜感激。
如果是,它们有何不同/在哪些特定情况下我应该使用哪一个?您可能知道,openCV 类型可能会变得非常棘手......
提前感谢大家的帮助!
最佳答案
CV_32F
和 CV_32FC1
的值都是 5
(见下面的解释),所以数值上没有区别。
但是:
CV_32F
定义了矩阵每个元素的深度,而 CV_32FC1
定义了每个元素的深度和 channel 数。几个例子...
许多功能,例如Sobel或 convertTo ,需要目标深度(并且不是 channel 数),因此您可以这样做:
Sobel(src, dst, CV_32F, 1, 0);
src.convertTo(dst, CV_32F);
但是,例如在创建矩阵时,还必须指定 channel 数,因此:
Mat m(rows, cols, CV_32FC1);
基本上,每次您还应该指定 channel 数时,使用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;
}
关于c++ - OpenCV 类型 CV_32F 和 CV_32FC1 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37530368/
我对函数的 OpenCV CV_* 常量有一些烦人的问题。我知道 OpenCV 最近摆脱了很多常量的 CV_,但是我找不到任何更新的文档。并且所有退出它的文档仍然显示旧常量。 例如,CV_BGR2GR
我是一名优秀的程序员,十分优秀!