Rumah  >  Artikel  >  Peranti teknologi  >  Fahami maksud pelbagai parameter CvType dalam OpenCV dan kaedah yang berkaitan

Fahami maksud pelbagai parameter CvType dalam OpenCV dan kaedah yang berkaitan

WBOY
WBOYke hadapan
2023-04-14 13:13:031636semak imbas

1. Prakata

Artikel ini berdasarkan persekitaran Java dan memperkenalkan parameter CvType yang diluluskan semasa mencipta objek Mat dalam OpenCV 4.6.0v.

Jika anda tidak begitu memahami peranan dan maksud parameter seperti CvType.CV_8UCX, CvType.CV_8SCX, CvType.CV_16UCX, CvType.CV_16SCX dsb.

.

Jadi, artikel ini boleh membantu anda memahami peranan saluran dalam OpenCV Mat.

Kandungan berikut adalah berdasarkan OpenCV SDK 4.6.0v

2 CvType

Jenis ini digunakan terutamanya untuk mentakrifkan jenis data dalam Mat. . Senario penggunaan biasa ialah mentakrifkannya semasa mencipta Mat.

Jadi apakah parameter yang ditentukan oleh jenis CvType? Secara ringkasnya, ia menentukan dua penunjuk asas data imej dalam Mat:

  1. Saluran: Iaitu, nilai yang dikembalikan oleh mat.channels() hanya boleh menjadi tiga parameter 1~4.
  2. Kedalaman kedalaman: Iaitu, julat nilai storan setiap parameter piksel dalam tikar. Nilai disimpan dalam tatasusunan bait[] dalam setiap saluran, dan julat nilai dalam setiap tatasusunan ditentukan oleh kedalaman.

Mengenai konsep saluran, saya memperkenalkannya dalam artikel sebelum ini https://zinyan.com/?p=493. Jika anda tidak tahu banyak tentang konsep saluran, anda boleh membaca artikel sebelumnya.

2.1 Kedalaman-kedalaman

Kita boleh lihat daripada kod sumber CvType bahawa OpenCV telah mentakrifkan 8 parameter kedalaman:

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;

Nombor di hadapan 8U, 8S, 16U, 16S, 32S, 64F, 16F, dsb. dalam nama di atas mewakili bilangan bit

Maksudnya: 8bite, 16bite,32bit,64bit. Digunakan untuk menentukan julat nilai, huruf U, S, F berikut mewakili simbol dan ketepatan.

  • U: int tidak bertanda, integer tidak bertanda, iaitu integer positif
  • S: int ditandatangani, integer bertanda, termasuk nombor negatif dan positif, tetapi semua integer
  • F: terapung, jenis titik terapung ketepatan tunggal, iaitu dengan titik perpuluhan. (PS: Jenis Float itu sendiri menyokong nombor negatif)

Jadi digabungkan dengan definisi yang kita boleh fahami:

  • CV_8U : Ia ialah integer positif 8-bit, mewakili julat nilai parameter 0~255
  • CV_8S: Ia ialah nombor positif dan negatif 8-bit, mewakili julat nilai parameter -128~ 127
  • CV_16U : Ia ialah integer positif 16-bit, mewakili julat nilai parameter 0~65535
  • CV_16S: Ia ialah nombor positif dan negatif 16-bit, mewakili nilai julat parameter -32768~32767
  • CV_16F : Ia ialah nombor titik terapung 16-bit, mewakili julat nilai parameter -65504 ~ 65504
  • CV_32S: Ia ialah 32- integer positif bit, mewakili julat nilai parameter 2147483648~2147483647
  • CV_32F: Ia ialah nombor titik terapung 32-bit, mewakili julat nilai parameter 1.18x10^-38^~3.40x
  • CV_64F: Ia ialah nombor titik terapung 64-bit, mewakili julat nilai parameter 2.23x10^- 308^~1.79x10^308^
PS: Berkenaan isu ketepatan dan julat nombor titik terapung, anda boleh mencari butiran lanjut. Julat parameter di atas diperoleh melalui ringkasan rangkaian.

2.2 Saluran

Dalam definisi OpenCV, bilangan maksimum saluran ialah 4 dan minimum ialah 1. Ini ditunjukkan dalam kod, iaitu, C1, C2 yang ditakrifkan dalam kelas CvType, C3, C4.

    C1: mewakili saluran tunggal
  • C2: mewakili saluran dwi
  • C3: mewakili tee kepada
  • C4: mewakili empat saluran
Dalam OpenCV, nilai warna piksel disimpan dalam tatasusunan titik terapung berketepatan dwi[] berganda.

Saluran mentakrifkan panjang tatasusunan berganda[] ini.

Sebagai contoh, jika gambar adalah gambar berwarna dalam format RGB, maka piksel dalam gambar perlu dicampur dengan tiga nilai R, G dan B untuk menentukan warna tertentu.

Kami memerlukan tatasusunan berganda[3] untuk merekodkan nilai R, G dan B di bawah piksel.

Jadi gambar ini menggunakan C3 tiga saluran.

Dan RGB biasanya merupakan integer dalam julat 0~255.

OpenCV menggunakan kedalaman yang kami perkenalkan di atas untuk mewakili julat nilai warna.

Gabungan kedua-duanya ialah:

CvType.CV_8UC3: mewakili tiga saluran Julat nilai parameter dalam setiap saluran ialah integer positif 8-bit. iaitu 0 ~255

Akhir sekali, kami memahaminya berdasarkan parameter semasa Mat dicipta:

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

Untuk meringkaskan, CvType mentakrifkan jenis storan data dalam Mat.

mentakrifkan berapa banyak nilai piksel yang disimpan Mat dan apakah julat setiap nilai piksel.

Kerana pelbagai algoritma untuk Mat memproses nilai setiap piksel. Untuk memproses nilai berangka dan melakukan pengiraan, anda perlu memberitahu algoritma apakah julat nilai setiap nilai berangka.

3. Lain-lain

Jika Mat dilalui dari luar. Bagaimanakah kita menentukan bilangan saluran Mat dan julat nilai setiap nilai?

CvType menyediakan kaedah pertanyaan yang berkaitan, yang membolehkan kami menukar kepada nilai jenis yang sepadan melalui jenis jenis.

Contoh adalah seperti berikut:

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

Selain itu, saluran juga boleh menjadi pertanyaan Nombor.

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

3.1 CV_USRTYPE1 ditamatkan

Nilai CvType.CV_USRTYPE1​ sudah bersamaan dengan CV_16F​. Jadi parameter ini juga ditandakan dengan anotasi @deprecated. Melambangkan bahawa ia telah ditinggalkan

Adalah disyorkan agar anda tidak menggunakannya.

Kaedah 3.2 ELEM_SIZE

Kaedah lain dalam CvType agak mudah difahami. Akhir sekali, terdapat kaedah public static final int ELEM_SIZE(int type)

Kaedah ini melepasi nilai jenis. Itulah yang dipanggil CvType.CV_8UC1 dan nilai parameter lain.

Kemudian apa yang dikembalikan ialah pembolehubah int.

Pembolehubah yang dikembalikan oleh kaedah ini adalah untuk mewakili bilangan bait parameter dalam setiap saluran. 1 bait mewakili 8 bit, iaitu 8 bit.

Jadi jika kami CV_8U, CV_8S, kami boleh kembalikan nombor saluran terus.

Jika ia adalah data 16-bit, ia perlu mengembalikan 2*saluran​, data 32-bit memerlukan 4*saluran​ dan data 64-bit memerlukan 8*saluran.

4. Ringkasan

Ini menyimpulkan pengenalan kepada CvType dalam OpenCV.

Jika kami menghadapi ralat yang berkaitan dengan CvType semasa penggunaan. Jadi dalam kebanyakan kes ia disebabkan oleh ketidakbiasaan kami dengan CvType.

Atau algoritma yang mempunyai keperluan untuk saluran dan kedalaman digunakan untuk menyebabkan ralat.

Atas ialah kandungan terperinci Fahami maksud pelbagai parameter CvType dalam OpenCV dan kaedah yang berkaitan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam