2013-08-30 21 views
9

Ho a che fare con un codice in cui fare un sacco di moltiplicazioni di matrice 3x3 e anche una traduzione di punti 3d usando matrici di rotazione, ecc. Ho deciso di utilizzare le funzionalità di base di OpenCV per le operazioni matematiche. La possibilità di utilizzare il costruttore recente aggiunto alla classe cv::Mat per convertire un cv::Point3d direttamente in un 3x1 cv::Mat riduce e semplifica notevolmente il codice.Conversione di 3x1 o 1x3 cv :: Mat to cv :: Point3d?

Quello che mi chiedo ora è se esiste un modo semplice per convertire un 3x1 o 1x3 cv::Mat in un cv::Point3d? Ho sempre in grado di fare qualcosa di simile:

cv::Mat mat(3,1,CV_64FC1); 
cv::Point3d p (mat.at<double>(0,0), mat.at<double>(1,0), mat.at<double>(2,0)); 

o

cv::Mat mat(3,1,CV_64FC1); 
const double *data = mat.ptr<double>(0); 
cv::Point3d p (data[0], data[1], data[2]); 

Sono molto preoccupato per le prestazioni (evitare le 3 chiamate a at metodo).

risposta

10

cv::Point3d ha un costruttore, che permette la creazione diretta da cv::Mat:

cv::Mat mat(3,1,CV_64FC1); 
cv::Point3d p(mat); 

Un'altra possibilità potrebbe non avere considerato sta usando cv::Matx invece di cv::Mat per le operazioni matematiche. Trovo più facile da usare, e offre più funzionalità, come la moltiplicazione dei Point tipi senza bisogno di una conversione:

cv::Point3d p(1,2,3); 
cv::Matx33d m = cv::Matx33d::eye(); 
cv::Point3d p2 = m * p; 

cv::Matx è anche staticamente assegnato, piuttosto che in modo dinamico (come cv::Mat), nel caso in cui si davvero serve quel tocco in più di prestazioni. Tuttavia, come in tutti i consigli relativi alle prestazioni: assicurati che ciò che stai ottimizzando sia in realtà un collo di bottiglia per profilazione.

+0

Grande! Stavo guardando nell'opzione core.hpp opencv per un costruttore per la classe Point_ come: 'Punto_ (const Mat & sz);' Come non l'ho trovato ho pensato che non c'era modo di farlo. 't notare l'esistenza di 'Point_ (const Vec <_Tp, 2> & v);' l'utilizzo di mATX sembra essere molto utile per i miei scopi. Grazie mille! – piponazo

+1

per essere esatti, non v'è alcun costruttore per 'Point_ '/'Point3_ ' che accetta un 'cv :: Mat', piuttosto c'è un implicito [operatore cast] (https://github.com/Itseez/opencv/blob/2.4/modules/core/include/opencv2/core/ core.hpp # L1856) in 'cv :: Mat' che lo converte in altro f classi di dimensione ixed come 'Vec' o' Matx' ('Vec' è accettato dal costruttore di Point) – Amro

+0

Mi chiedo perché possiamo trasformare' cv :: Point' con matrix, ma non 'cv :: Vec'. In quest'ultimo caso abbiamo bisogno di convertire 'cv :: Vec' in' cv :: Point' prima. –