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!
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 queCV_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;
}