Maison >Périphériques technologiques >IA >Comprendre la signification de divers paramètres de CvType dans OpenCV et les méthodes associées
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
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 :
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.
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.
Nous pouvons donc le comprendre en fonction de la définition :
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.
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.
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 valeursde 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.
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
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.
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.
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!