web-dev-qa-db-fra.com

Que représentent CV_8UC3 et les autres types dans OpenCV?

J'ai été surpris de ne rien trouver dans la documentation OpenCV décrivant - avec des mots - ce que signifient les différents types, et googler ne m'a pas beaucoup aidé non plus. Je sais que CV_8UC1 est en niveaux de gris, mais que signifie CV_8UC3? Est-ce RVB? Ou YUV?

De plus, qu'en est-il des autres définitions de types_c.h (elles manquent également de commentaires). Existe-t-il un modèle dans la convention de dénomination? Puis-je interpréter à partir de leurs noms en quelles sont leurs caractéristiques, comme les couleurs, etc.?

#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
#define CV_8UC(n) CV_MAKETYPE(CV_8U,(n))

#define CV_8SC1 CV_MAKETYPE(CV_8S,1)
#define CV_8SC2 CV_MAKETYPE(CV_8S,2)
#define CV_8SC3 CV_MAKETYPE(CV_8S,3)
#define CV_8SC4 CV_MAKETYPE(CV_8S,4)
#define CV_8SC(n) CV_MAKETYPE(CV_8S,(n))

#define CV_16UC1 CV_MAKETYPE(CV_16U,1)
#define CV_16UC2 CV_MAKETYPE(CV_16U,2)
#define CV_16UC3 CV_MAKETYPE(CV_16U,3)
#define CV_16UC4 CV_MAKETYPE(CV_16U,4)
#define CV_16UC(n) CV_MAKETYPE(CV_16U,(n))

#define CV_16SC1 CV_MAKETYPE(CV_16S,1)
#define CV_16SC2 CV_MAKETYPE(CV_16S,2)
#define CV_16SC3 CV_MAKETYPE(CV_16S,3)
#define CV_16SC4 CV_MAKETYPE(CV_16S,4)
#define CV_16SC(n) CV_MAKETYPE(CV_16S,(n))

#define CV_32SC1 CV_MAKETYPE(CV_32S,1)
#define CV_32SC2 CV_MAKETYPE(CV_32S,2)
#define CV_32SC3 CV_MAKETYPE(CV_32S,3)
#define CV_32SC4 CV_MAKETYPE(CV_32S,4)
#define CV_32SC(n) CV_MAKETYPE(CV_32S,(n))

#define CV_32FC1 CV_MAKETYPE(CV_32F,1)
#define CV_32FC2 CV_MAKETYPE(CV_32F,2)
#define CV_32FC3 CV_MAKETYPE(CV_32F,3)
#define CV_32FC4 CV_MAKETYPE(CV_32F,4)
#define CV_32FC(n) CV_MAKETYPE(CV_32F,(n))

#define CV_64FC1 CV_MAKETYPE(CV_64F,1)
#define CV_64FC2 CV_MAKETYPE(CV_64F,2)
#define CV_64FC3 CV_MAKETYPE(CV_64F,3)
#define CV_64FC4 CV_MAKETYPE(CV_64F,4)
#define CV_64FC(n) CV_MAKETYPE(CV_64F,(n))
28
sashoalm

Comme indiqué dans la documentation

Tout type de primitive de la liste peut être défini par un identifiant dans la forme CV_<bit-depth>{U|S|F}C(<number_of_channels>)

où U est un type entier non signé, S est un type entier signé et F est un type flottant.

so CV_8UC3 est une matrice/image entière non signée sur 8 bits avec 3 canaux . Bien qu'il soit très courant que cela signifie une image RVB (ou en fait BGR), cela ne l'exige pas . Cela signifie simplement qu'il Il existe trois canaux, et leur utilisation dépend de vous.

41
Hannes Ovrén

Le modèle de dénomination décrit comment les données sont réellement placées dans la mémoire du PC et ne sont pas directement liées au type d'image . En fait, la présentation des données et le type d'image sont découplés.

Vous avez probablement découvert la signification du modèle CV_XX (c'est-à-dire disposition des données).

Si vous demandez à OpenCV de charger une image sous la forme d'une image color image, OpenCV la chargera sous la forme d'une image BGR et affichera ses données sous la forme CV_8UC3 . choses à prendre en compte:

  • oui, l'ordre des canaux par défaut est BGR et non pas RGB. Cet ordre est hérité du fait que les flux vidéo numériques des webcams semblaient suivre cet ordre lorsque OpenCV 1.xx était en développement;
  • vous pouvez utiliser les fonctions de conversion de type du module imgproc, à savoir cv::cvtColor(). Toutes les dispositions de données et tous les types d’image ne sont pas compatibles, cochez la case doc ;
  • le canal alpha est généralement ignoré. En ignorant, je veux dire que cv::imwrite() écrira une image à 3 canaux sans alpha par exemple. La plupart des fonctions de traitement seront soit spécifiques à des images à canal unique, soit appliqueront le même traitement à tous les canaux de manière égale;
  • lorsqu'une fonction accepte un masque (alpha), il s'agit généralement d'un paramètre facultatif de type CV_8UC1 dont la valeur par défaut est une matrice vide.
11
sansuiso

8UC3 vous aide à accéder aux données RVB. Et cela ne se limite pas aux images. Vous pouvez également l'utiliser pour accéder aux données RVB dans les nuages ​​de points. Si vous transmettez la valeur RVB en tant que matrice de type 8UC3, vous pouvez ensuite afficher cette valeur en tant que couleur dans le module viz et afficher un nuage de points RVB. 

1
Giant Cloud