Heim  >  Artikel  >  Technologie-Peripheriegeräte  >  Verstehen Sie die Bedeutung verschiedener Parameter von CvType in OpenCV und verwandten Methoden

Verstehen Sie die Bedeutung verschiedener Parameter von CvType in OpenCV und verwandten Methoden

WBOY
WBOYnach vorne
2023-04-14 13:13:031597Durchsuche

1. Vorwort

Dieser Artikel basiert auf der Java-Umgebung und stellt den CvType-Parameter vor, der beim Erstellen eines Mat-Objekts in OpenCV 4.6.0v übergeben wird.

Wenn Sie die Rolle und Bedeutung von Parametern wie CvType.CV_8UCX, CvType.CV_8SCX, CvType.CV_16UCX, CvType.CV_16SCX usw. nicht ganz verstehen,

.

Dieser Artikel kann Ihnen also helfen, die Rolle von Kanälen in OpenCV Mat zu verstehen.

Der folgende Inhalt basiert auf OpenCV SDK 4.6.0v

2. CvType

Dieser Typ ist hauptsächlich Wird verwendet, um den Datentyp in Mat zu definieren. Ein häufiges Verwendungsszenario besteht darin, es beim Erstellen von Mat zu definieren.

Welche Parameter definiert der CvType-Typ? Es bestimmt ganz einfach die beiden Grundindikatoren der Bilddaten in Mat:

  1. Kanäle: Das heißt, die von mat.channels() zurückgegebenen Werte können nur 1 bis 4 sein . Parameter.
  2. Tiefentiefe: Das heißt, der Speicherwertbereich jedes Pixelparameters in mat. Der Wert wird in jedem Kanal in einem Byte[]-Array gespeichert, und der Wertebereich in jedem Array wird durch die Tiefe bestimmt.

Was das Konzept der Kanäle betrifft, habe ich es in einem Artikel https://zinyan.com/?p=493 vorgestellt. Wenn Sie nicht viel über das Konzept von Kanälen wissen, können Sie den vorherigen Artikel lesen.

2.1 Tiefentiefe

Wir können dem CvType-Quellcode entnehmen, dass OpenCV 8 Tiefenparameter definiert hat:

#🎜 🎜#
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;

Die Zahlen vor 8U, 8S, 16U, 16S, 32S, 64F, 16F usw. in den obigen Namen stellen die Anzahl der Bits dar# 🎜🎜 #

Das heißt: 8bite, 16bite, 32bite, 64bite. Die folgenden Buchstaben U, S, F dienen zur Definition des Wertebereichs und stellen das Symbol und die Genauigkeit dar.

U: vorzeichenloser Int, vorzeichenlose Ganzzahl, also positive Ganzzahl
  • S: vorzeichenbehafteter Int, vorzeichenbehaftete Ganzzahl, einschließlich negativer und positiver Zahlen, aber beide Ganzzahlen
  • F: Float, Gleitkommatyp mit einfacher Genauigkeit, dh mit einem Dezimalpunkt. (PS: Der Float-Typ selbst unterstützt negative Zahlen)

So können wir es verstehen, indem wir die Definition kombinieren:

# 🎜🎜 #

CV_8U: Es ist eine positive 8-Bit-Ganzzahl, die den Wertebereich des Parameters 0~255 darstellt

    CV_8S: Es ist eine positive 8-Bit-Ganzzahl negative Zahl, die den Wert des Parameters Bereich -128~127
  • CV_16U darstellt: Es ist eine positive 16-Bit-Ganzzahl, die den Wertebereich des Parameters 0~65535
  • #🎜🎜 darstellt #CV_16S: Es handelt sich um eine positive und negative 16-Bit-Zahl, die den Wertebereich des Parameters darstellt -32768~32767
  • CV_16F: Es handelt sich um eine 16-Bit-Gleitkommazahl, die den Wert darstellt Bereich des Parameters -65504 ~ 65504
  • CV_32S: Es ist eine positive 32-Bit-Ganzzahl, die den Wertebereich des Parameters 2147483648~2147483647
  • CV_32F: Es ist ein 32-Bit-Gleitkommazahl, die den Wertebereich des Parameters 1,18x10^-38^~3,40x10^38^#🎜🎜 #
  • CV_64F darstellt: Es handelt sich um eine 64-Bit-Gleitkommazahl, die den Wertebereich darstellt des Parameters 2,23x10^-308^~1,79x10^308^
  • PS: Bezüglich der Präzisions- und Bereichsprobleme von Gleitkommazahlen können Sie nach weiteren Details suchen . Der obige Parameterbereich wird durch Netzwerkzusammenfassung erhalten.
2.2 Kanäle-Kanäle

In der OpenCV-Definition beträgt die maximale Anzahl von Kanälen 4 und die minimale Anzahl 1. Dies spiegelt sich im Code wider, der ist in der CvType-Klasse C1, C2, C3, C4 definiert. Nr #C4: Stellt vier Kanäle dar

In OpenCV wird der Farbwert eines Pixels in einem Double[]-Gleitkomma-Array mit doppelter Genauigkeit gespeichert.

Der Kanal definiert die Länge dieses Double[]-Arrays.

  • Wenn das Bild beispielsweise ein Farbbild im RGB-Format ist, muss ein Pixel im Bild mit drei Werten von R, G gemischt werden und B, um die spezifische Farbe zu bestimmen.
  • Wir benötigen ein Array von double[3], um die Werte von R, G und B unter dem Pixel aufzuzeichnen.
  • Dieses Bild verwendet also drei C3-Kanäle.

Und RGB ist normalerweise eine Ganzzahl im Bereich von 0 bis 255.

OpenCV verwendet die oben eingeführte Tiefe, um den Bereich der Farbwerte darzustellen.

Die Kombination der beiden ist:

CvType.CV_8UC3: stellt drei Kanäle dar, und der Wertebereich der Parameter in jedem Kanal ist 8 Bits Positive Ganzzahl, also 0~255

Schließlich verstehen wir es anhand der Parameter, als Mat erstellt wurde:

//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); //通常用来表示彩色图,颜色值范围更广。

Zusammenfassend definiert CvType die Arten der Datenspeicherung in Mat.

definiert, wie viele Pixelwerte Mat speichert und wie groß der Bereich jedes Pixelwerts ist.

Weil verschiedene Algorithmen für Mat den Wert jedes Pixels verarbeiten. Um numerische Werte zu verarbeiten und Berechnungen durchzuführen, müssen Sie dem Algorithmus den Wertebereich jedes numerischen Werts mitteilen.

3. Andere

Wenn Mat von außen hereinkommt. Wie bestimmen wir die Anzahl der Mat-Kanäle und den Wertebereich jedes Werts?

CvType bietet verwandte Abfragemethoden, mit denen wir über den Typtyp in entsprechende Typwerte konvertieren können.

Beispiele sind wie folgt:

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

#🎜 🎜#Darüber hinaus können Sie auch die Anzahl der Kanäle abfragen.

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

3.1 Veraltet CV_USRTYPE1

Der Wert von CvType.CV_USRTYPE1​ entspricht bereits CV_16F​. Daher ist dieser Parameter auch mit der Annotation @deprecated gekennzeichnet. Stellt dar, dass es aufgegeben wurde

Es wird empfohlen, es nicht zu verwenden.

3.2 ELEM_SIZE-Methode

Andere Methoden in CvType sind relativ einfach zu verstehen. Schließlich gibt es eine öffentliche statische final int ELEM_SIZE(int type)-Methode

Diese Methode übergibt den Typwert. Das ist der sogenannte CvType.CV_8UC1 und andere Parameterwerte.

Dann wird eine int-Variable zurückgegeben.

Die von dieser Methode zurückgegebene Variable soll die Anzahl der Parameterbytes in jedem Kanal darstellen. 1 Byte repräsentiert 8 Bit, also 8 Bit.

Wenn wir also CV_8U, CV_8S sind, geben Sie einfach die Kanalnummer direkt zurück.

Wenn es sich um 16-Bit-Daten handelt, müssen 2*Kanäle zurückgegeben werden, 32-Bit benötigt 4*Kanäle und 64-Bit benötigt 8*Kanäle .

4. Zusammenfassung

Dies beendet die Einführung in CvType in OpenCV.

Wenn wir während der Verwendung einen Fehler bezüglich CvType haben. In den meisten Fällen liegt es also daran, dass wir mit CvType nicht vertraut sind.

Oder der Algorithmus, der Anforderungen an Kanal und Tiefe hat, wird verwendet, um Fehler zu verursachen.

Das obige ist der detaillierte Inhalt vonVerstehen Sie die Bedeutung verschiedener Parameter von CvType in OpenCV und verwandten Methoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen