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).
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
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
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. –