web-dev-qa-db-ja.com

OpenCVタイプCV_32FとCV_32FC1の違い

OpenCVタイプCV_32FとCV_32FC1に違いがあるかどうか知りたいのですが? 32Fは「32ビット浮動小数点」を表し、C1は「単一チャネル」を表すことは既に知っていますが、さらなる説明が必要です。

はいの場合、それらはどのように異なるか/どの特定のケースでどれを使用する必要がありますか?ご存知かもしれませんが、openCV型は非常に扱いにくいことがあります...

ご協力ありがとうございます!

14
mlnthr

CV_32FCV_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;
}

35
Miki