web-dev-qa-db-fra.com

Différence entre le type OpenCV CV_32F et CV_32FC1

Je voudrais savoir s'il y a une différence entre les types OpenCV CV_32F et CV_32FC1? Je sais déjà que 32F représente un "32bits à virgule flottante" et C1 pour un "canal unique", mais d'autres explications seraient appréciées.

Si oui, en quoi sont-ils différents/lequel dois-je utiliser dans quels cas spécifiques? Comme vous le savez peut-être, les types openCV peuvent devenir très délicats ...

Merci à tous par avance pour votre aide!

14
mlnthr

La valeur pour les deux CV_32F et CV_32FC1 est 5 (voir l'explication ci-dessous), donc numériquement il n'y a pas de différence.

Pourtant:

  • CV_32F définit la profondeur de chaque élément de la matrice, tandis que
  • CV_32FC1 définit à la fois la profondeur de chaque élément et le nombre de canaux.

Quelques exemples ...

De nombreuses fonctions, par ex. Sobel ou convertTo , nécessite la profondeur de destination (et pas le nombre de canaux), donc tu fais:

Sobel(src, dst, CV_32F, 1, 0);

src.convertTo(dst, CV_32F);

Mais, lors de la création d'une matrice par exemple, vous devez également spécifier le nombre de canaux, donc:

Mat m(rows, cols, CV_32FC1);

Fondamentalement, chaque fois que vous devez également spécifier le nombre de canaux, utilisez CV_32FCx. Si vous avez juste besoin de la profondeur, utilisez CV_32F


CV_32F est défini comme:

 #define CV_32F  5

tandis que CV_32FC1 est défini comme:

#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)

qui correspond à 5.

Vous pouvez vérifier cela avec:

#include <opencv2\opencv.hpp>
#include <iostream>
int main()
{
    std::cout <<  CV_32F << std::endl;
    std::cout <<  CV_32FC1 << std::endl;

    return 0;
}

35
Miki