Maison  >  Article  >  Périphériques technologiques  >  Comprendre la signification de divers paramètres de CvType dans OpenCV et les méthodes associées

Comprendre la signification de divers paramètres de CvType dans OpenCV et les méthodes associées

WBOY
WBOYavant
2023-04-14 13:13:031636parcourir

1. Préface

Cet article est basé sur l'environnement Java et présente le paramètre CvType passé lors de la création d'un objet Mat dans OpenCV 4.6.0v.

Si vous ne comprenez pas bien le rôle et la signification des paramètres tels que CvType.CV_8UCX, CvType.CV_8SCX, CvType.CV_16UCX, CvType.CV_16SCX, etc.

.

Ainsi, cet article peut vous aider à comprendre le rôle des canaux dans OpenCV Mat.

Le contenu suivant est basé sur OpenCV SDK 4.6.0v

2 CvType

Ce type est principalement utilisé pour définir le type de données dans Mat. Un scénario d'utilisation courant consiste à le définir lors de la création de Mat.

Alors quels paramètres seront définis par le type CvType ? Très simplement, il détermine les deux indicateurs de base des données d'image dans Mat :

  1. channels : Autrement dit, la valeur renvoyée par mat.channels() ne peut être que les trois paramètres 1~4.
  2. Profondeur : c'est-à-dire la plage de valeurs de stockage de chaque paramètre de pixel dans mat. La valeur est stockée dans un tableau byte[] dans chaque canal et la plage de valeurs dans chaque tableau est déterminée par la profondeur.

Concernant la notion de chaînes, je l'ai présentée dans un précédent article https://zinyan.com/?p=493. Si vous ne connaissez pas grand chose au concept de chaînes, vous pouvez lire l’article précédent.

2.1 Profondeur-profondeur

Nous pouvons voir dans le code source de CvType qu'OpenCV a défini 8 paramètres de profondeur :

public static final int
 CV_8U = 0,
 CV_8S = 1,
 CV_16U = 2,
 CV_16S = 3,
 CV_32S = 4,
 CV_32F = 5,
 CV_64F = 6,
 CV_16F = 7;

8U, 8S, 16U, 16S, 32S, 64F dans les noms ci-dessus, 16F , etc. Les chiffres devant représentent le nombre de bits

c'est à dire : 8bite, 16bite, 32bite, 64bite. Utilisées pour définir la plage de valeurs, les lettres suivantes U, S, F représentent le symbole et la précision.

  • U : entier non signé, entier non signé, c'est-à-dire entier positif
  • S : entier signé, entier signé, y compris les nombres négatifs et positifs, mais tous les entiers
  • F : float, type à virgule flottante simple précision, c'est-à-dire Avec point décimal. (PS : Le type Float lui-même prend en charge les nombres négatifs)

Nous pouvons donc le comprendre en fonction de la définition :

  • CV_8U : C'est un entier positif de 8 bits, représentant la plage de valeurs du paramètre 0 ~255
  • CV_8S : C'est un nombre positif et négatif de 8 bits, représentant la plage de valeurs du paramètre -128~127
  • CV_16U : C'est un nombre entier positif de 16 bits, représentant la plage de valeurs du paramètre 0~ 65535
  • CV_16S : C'est un nombre positif et négatif de 16 bits, représente la plage de valeurs du paramètre -32768~32767
  • CV_16F : est un nombre à virgule flottante de 16 bits, représente la plage de valeurs du paramètre -65504 ~ 65504
  • CV_32S : est un entier positif de 32 bits, représente la plage de valeurs du paramètre 2147483648 ~ 2147483647
  • CV_32F : Il s'agit d'un nombre à virgule flottante de 32 bits, représentant la plage de valeurs du paramètre 1,18x10^-38^~3,40. x10^38^
  • CV_64F : Il s'agit d'un nombre à virgule flottante de 64 bits, représentant la plage de valeurs du paramètre 2,23x10 ^-308^~1,79x10^308^

PS : concernant les problèmes de précision et de plage de la virgule flottante numéros, vous pouvez rechercher plus de détails. La plage de paramètres ci-dessus est obtenue grâce au résumé du réseau.

2.2 Canaux

Dans la définition OpenCV, le nombre maximum de canaux est de 4 et le minimum est de 1. Cela se reflète dans le code, qui est C1, C2, C3 et C4 définis dans la classe CvType.

  • C1 : représente un seul canal
  • C2 : représente un double canal
  • C3 : représente un tee à
  • C4 : représente quatre canaux

Dans OpenCV, la valeur de couleur d'un pixel utilise un tableau de points flottants double[] double précision stockage.

Le canal définit la longueur de ce tableau double[].

Par exemple, si l'image est une image couleur au format RVB, alors un pixel de l'image doit être mélangé avec trois valeurs​​de R, V et B pour déterminer la couleur spécifique.

Nous avons besoin d'un tableau de double[3] pour enregistrer les valeurs de R, G et B sous le pixel.

Cette image utilise donc trois canaux C3.

Et RVB est généralement un nombre entier compris entre 0 et 255.

OpenCV utilise la profondeur que nous avons introduite ci-dessus pour représenter la plage de valeurs de couleur.

La combinaison des deux est :

CvType.CV_8UC3 : représente trois canaux. La plage de valeurs des paramètres de chaque canal est un entier positif de 8 bits, soit 0~255

Enfin, nous avons combiné. la création Mat Pour comprendre les paramètres, c'est :

//zinyan:创建了一个4*4尺寸的图片。每个像素点存储了一个double[1]的数组,该数组中值的范围为0~255
Mat mat = new Mat(4, 4, CvType.CV_8UC1); //通常用来表示灰度图或黑白图

//zinyan:创建了一个5*5尺寸的图片。每个像素点存储了一个double[3]的数组,该数组中值的范围为0~255
Mat mat1 = new Mat(5, 5, CvType.CV_8UC3); //通常用来表示彩色图

//zinyan:创建了一个6*6尺寸的图片。每个像素点存储了一个double[3]的数组,该数组中值的范围为0~65535
Mat mat1 = new Mat(6, 6, CvType.CV_16UC3); //通常用来表示彩色图,颜色值范围更广。

En résumé, CvType définit le type de stockage des données dans Mat.

définit le nombre de valeurs de pixels que Mat stocke et quelle est la plage de chaque valeur de pixel.

Parce que divers algorithmes pour Mat traitent la valeur de chaque pixel. Pour traiter des valeurs numériques et effectuer des calculs, vous devez indiquer à l'algorithme quelle est la plage de valeurs de chaque valeur numérique.

3. Autres

Si Mat est transmis de l'extérieur. Comment déterminons-nous le nombre de canaux Mat et la plage de valeurs de chaque valeur ?

CvType fournit des méthodes de requête associées, qui nous permettent de convertir en valeurs de type correspondantes via le type de type.

Les exemples sont les suivants :

Mat mat = new Mat(4, 4, CvType.CV_8UC3);
int depth = CvType.depth(mat.type()); //输出结果值为 0 == CvType.CV_8U

Mat mat1 = new Mat(4, 4, CvType.CV_16SC1);
depth = CvType.depth(mat1.type()); //输出结果值为 3 == CvType.CV_16S

De plus, vous pouvez également interroger le nombre de chaînes.

Mat mat1 = new Mat(4, 4, CvType.CV_16SC1);
int channels = CvType.channels(mat1.type());//该值为1

3.1 CV_USRTYPE1 obsolète

La valeur de CvType.CV_USRTYPE1​ est déjà équivalente à CV_16F​. Ce paramètre est donc également marqué de l'annotation @deprecated. Représente qu'il a été abandonné

Il est recommandé de ne pas l'utiliser.

3.2 Méthode ELEM_SIZE

Les autres méthodes de CvType sont relativement faciles à comprendre. Enfin, il existe une méthode publique static final int ELEM_SIZE(int type)

Cette méthode transmet la valeur du type. Il s'agit de ce qu'on appelle CvType.CV_8UC1 et d'autres valeurs de paramètres.

Ensuite, ce qui est renvoyé est une variable int.

La variable renvoyée par cette méthode doit représenter le nombre d'octets de paramètres dans chaque canal. 1 octet représente 8 bits, soit 8 bits.

Donc, si nous sommes CV_8U, CV_8S, renvoyez simplement le numéro de chaîne directement.

S'il s'agit de données 16 bits, elles doivent renvoyer 2*canaux​, 32 bits ont besoin de 4*canaux​ et 64 bits ont besoin de 8*canaux.

4. Résumé

Ceci termine l'introduction à CvType dans OpenCV.

Si nous rencontrons une erreur liée à CvType lors de l'utilisation. Donc, dans la plupart des cas, cela est dû à notre méconnaissance de CvType.

Ou l'algorithme qui a des exigences en matière de canal et de profondeur est utilisé pour provoquer des erreurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer