2012-06-08 11 views
23

ho notato che una nuova struttura dati cv :: MATX stato aggiunto alla nuova versione OpenCV, destinati piccole matrici di dimensioni note al momento della compilazione, per esempioVantaggi della cv :: MATX

cv::Matx31f // matrix 3x1 of float type 

Controllare il documentation Ho visto che la maggior parte delle operazioni con le matrici sono disponibili, ma ancora non vedo i vantaggi di usare questo nuovo tipo al posto del vecchio cv :: Mat.

Quando dovrei usare Matx invece di Mat?

+3

Senza guardare troppo strettamente nella documentazione, si può dire che conoscere le dimensioni in fase di compilazione ha sicuramente molti vantaggi, primo fra tutti la sostituzione di memoria allocata dinamicamente array fase di compilazione, che per tali piccole matrici chiaramente definiti è un'ovvia ottimizzazione. Detto questo, la tua domanda risponde abbastanza chiaramente: * "destinato a piccole matrici di dimensioni note" *. Pensa alle matrici di trasformazione utilizzate nelle trasformazioni di immagine o nella calibrazione della videocamera. –

+1

Ma questo può ancora essere fatto con il vecchio tipo Mat mettendo Mat (3,1, CV_32FC1) –

+1

Sure, quindi tutto il mio primo paragrafo sull'ovvia ottimizzazione dell'uso di array di tempo di compilazione rispetto all'allocazione dinamica della memoria. Ovviamente è solo un'ottimizzazione e nessuna funzionalità aggiuntiva, ma esattamente questo è il vantaggio che ottieni. Non si desidera realmente allocare dinamicamente memoria per una matrice 3x4 rigorosa. –

risposta

10

Riguarda la gestione della memoria e non spreca (in alcuni casi importante) la memoria o solo la prenotazione della memoria per un oggetto che userai in seguito.

Ecco come lo capisco - potrebbe essere qualcun altro può dare una spiegazione migliore.

6

Risposta breve: cv :: Mat utilizza l'heap per memorizzare i dati, mentre cv :: Matx utilizza lo stack.

Un cv :: Mat utilizza l'allocazione di memoria dinamica (nell'heap). Questo è appropriato per le grandi matrici (come le immagini) e consente di fare cose come le copie superficiali di una matrice, che è il comportamento predefinito di cv :: Mat.

Tuttavia, per le piccole matrici per cui cv :: Matx è progettato, l'allocazione dell'heap sarebbe molto costosa rispetto a fare la stessa cosa nello stack. Ho visto un blocco di matematica ridurre il tempo di elaborazione di oltre il 75% passando all'utilizzo di tipi allocati allo stack (ad esempio cv :: Point e cv :: Matx) invece di cv :: Mat.

+1

Credo che molte prestazioni siano ottenute anche dallo srotolamento del ciclo, che non può essere fatto per matrici di dimensioni dinamiche. – emu

7

Questa è una risposta tardiva, ma è comunque una domanda interessante!

La risposta di dom è abbastanza accurata e anche il riferimento heap/stack in user1460044 è interessante.

Da un punto di vista pratico, non usereiMatx (o Vec), a meno che non erano completamente necessario. I principali vantaggi di MATX sono

  1. Uso della pila (efficiente [1])
  2. inizializzazione.

Il problema è che alla fine si dovrà spostare i dati ad un MatxMat a fare la maggior parte delle cose, e così, si sarà di nuovo il mucchio di nuovo. D'altra parte, il "di inizializzazione cool" di un Matx può essere fatto in una stuoia normale:

// Matx initialization: 
Matx31f A(1.f,2.f,3.f); 
// Mat initialization: 
Mat B = (Mat_<float>(3,1) << 1.f, 2.f, 3.f); 

Inoltre, v'è una differenza di inizializzazione (al di là del/pila heap) roba. Se si tenta di inserire 5 valori in Matx31, si bloccherà (eccezione di runtime), mentre chiamando lo Mat_::operator<< con 5 valori verranno memorizzati solo i primi tre.

[1] Efficiente se il programma deve creare molte matrici con meno di ~ 10 elementi. In tal caso, utilizzare le matrici Matx.

3

Ci sono 2 altri motivi per cui preferisco Matx-Mat:

  1. Leggibilità: persone che leggono il codice può immediatamente vedere le dimensioni delle matrici, ad esempio:

    cv::Matx34d transform = ...; 
    

    E 'chiaro che questa è una matrice 3x4, quindi contiene una trasformazione 3D di tipo (R, t), in cui R è una matrice di rotazione (al contrario di quella dell'asse dell'asse). Analogamente, l'accesso a un elemento è più naturale con transform(i,j) rispetto a transform.at<double>(i,j).

  2. Debug facile. Poiché gli elementi per Matx vengono allocati nello stack in una matrice di lunghezza nota, gli IDE oi debugger possono visualizzare l'intero contenuto in modo appropriato quando si passa attraverso il codice.

Problemi correlati