OpenCVタイプCV_32FとCV_32FC1に違いがあるかどうか知りたいのですが? 32Fは「32ビット浮動小数点」を表し、C1は「単一チャネル」を表すことは既に知っていますが、さらなる説明が必要です。
はいの場合、それらはどのように異なるか/どの特定のケースでどれを使用する必要がありますか?ご存知かもしれませんが、openCV型は非常に扱いにくいことがあります...
ご協力ありがとうございます!
CV_32F
とCV_32FC1
の両方の値は5
(以下の説明を参照)であるため、数値的には違いはありません。
しかしながら:
CV_32F
は、マトリックスの各要素の深さを定義しますが、CV_32FC1
は、各要素の深さとチャネル数の両方を定義します。いくつかの例...
多くの機能、例えば Sobel または convertTo 、宛先の深さが必要(およびnotチャンネル数)あなたがやる:
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;
}