Esiste un modo reversibile per convertire un oggetto OpenCV cv::Mat
in un Eigen::Matrix
?OpenCV CV :: Mat ed Eigen :: Matrix
per esempio, un certo senso di fare:
cv::Mat cvMat;
Eigen::Matrix eigMat;
camera->retrieve(cvMat);
// magic to convert cvMat to eigMat
// work on eigMat
// convert eigMat back to cvMat
imshow("Image", cvMat);
Ho provato con cv2eigen
e eigen2cv
, ma la risultante cvMat
è completamente maciullato e io non sono esattamente sicuro perché. Le dimensioni sono corrette, ma la grafica è totalmente tratteggiata, quindi probabilmente un problema di byte per pixel o di dati?
Perfetto, è praticamente esattamente quello che stavo cercando. Quando si utilizza un'immagine multicanale (RGB, YUV o qualsiasi altra combinazione di canali), come si converte meglio? Una matrice separata per canale? In una matrice 3D di widthXheightXchannels? O semplicemente espandilo per larghezza (larghezza * 3) * altezza? – Yeraze
Le immagini del canale Mulit vengono generalmente memorizzate come array interfogliati (ad esempio RGBRGBRGB ...).A seconda di ciò che si vorrebbe fare con essi, si potrebbe considerare di mappare ogni singolo canale su un diverso Eigen :: Map che sfrutta il parametro passo: 'cv :: Mat cvT (4,4, CV_32FC3); // a 3 canali float matrix Eigen :: Map> red (cvT.data); Eigen :: Map > green (cvT.data +1); Eigen :: Map > blue (cvT.data +2); ' –
Pierluigi
L'utilizzo di cvT.data() non funziona per me, fornisce un errore del compilatore. Ho postato una risposta su come lo faccio qui sotto, comprese le informazioni su come farlo per matrici di dimensioni arbitrarie e con la conversione inversa da Eigen a OpenCV. – Ela782