OpenCV – IplImage

Cos’è IplImage in OpenCV ? Puoi semplicemente spiegare cosa si intende da esso come un tipo? Quando dovremmo usarlo?

Grazie.

In base al tag ‘c ++’ che hai nella tua domanda: non dovresti usarlo, dovresti usare cv :: Mat. Ogni IplImage è un cv :: Mat internamente.

IplImage viene utilizzato solo nell’API C. È un tipo di CvMat e contiene dati di immagine. Il suo nome deriva dalle radici di OpenCV (Intel IPL).

Non è più rilevante se si utilizza l’API C ++ di OpenCV.

IplImage e cv :: Mat sono diversi tipi di intestazione per dati matrice / immagine. Sono fondamentalmente compatibili tra loro, ma IplImage viene utilizzato nell’API C di OpenCV, mentre cv :: Mat viene utilizzato nella nuova API C ++.

Quando decidi di utilizzare l’API C di OpenCV, utilizzerai principalmente IplImages. Altrimenti userai principalmente cv :: Mats.

Naturalmente, puoi convertire IplImages e cv :: Mats tra loro, ad es

 cv::Mat mat(myIplImage); 

In questo caso, condividono gli stessi dati sottostanti, cioè le modifiche apportate attraverso l’intestazione saranno visibili indipendentemente dall’intestazione che stai utilizzando per accedere ai dati.

Deep-copy (non solo l’intestazione è “trasformata” / copiata, ma anche i dati sottostanti) è ansible con

 cv::Mat mat(myIplImage, true) 

Si noti che più IplImages possono anche puntare agli stessi dati sottostanti, come possono più cv :: Mats.


Quando si lavora con OpenCV e librerie simili è importante notare che cv :: Mats e IplImages sono solo “intestazioni” per i dati effettivi. Si potrebbe dire che cv :: Mats e IplImages sono fondamentalmente dei puntatori più importanti meta informazioni come il numero di righe, colonne, canali e il tipo di dati usato per le singole celle / pixel della matrice / immagine. E, come i veri puntatori, possono fare riferimento / puntare agli stessi dati reali .

Ad esempio, guarda la definizione di IplImage: http://opencv.willowgarage.com/documentation/basic_structures.html#iplimage

Il membro più importante è char *imageData; . Questo puntatore fa riferimento ai dati reali dell’immagine. Tuttavia, l’IplImage nel suo insieme contiene meta informazioni sull’immagine, come il numero di righe e colonne.

La struttura IplImage è stata ereditata dalla libreria Intel Image Processing, in cui il formato è nativo. OpenCV supporta solo un sottoinsieme di possibili formati di IplImage, come delineato nell’elenco dei parametri sopra.

Se si usa il C ++ non si utilizza IplImage perché ciò viene utilizzato solo in un programma C, (IplImage è in C API). Inoltre, se si usa C, è necessario inviare Cv prima dei nomi delle variabili: “CvMat *” “CvPoint ” “IplImage ” ecc. È meglio usare il codice C ++, non si usa Cv: “Mat * ” ecc. ma non è ansible utilizzare il tipo IplImage, invece di IplImage si utilizza un tipo Mat, ad esempio nella funzione findchessboardcorner.