2015-09-22 2 views
0

est concaténation Voici le code Matlab je suis en train de se reproduire dans OpenCV 2.4.11
OpenCV vs matrice Matlab

A = [1 1; 1 1]; 
B = [2 2; 2 2]; 
C = [3 3; 3 3]; 
D = cat(3, A, B,C) 
D= imresize(D, [100 50], 'nearest'); 

C'est ce que je l'ai essayé jusqu'à présent. mais pour autant que je comprenne que ce n'est pas la même matrice 3 D, openCV ajoute juste les matrices l'une à côté de l'autre.

cv::Mat a(2,2,CV_64F); 
cv::Mat b(2,2,CV_64F); 
cv::Mat c(2,2,CV_64F); 
for (int i = 0; i < 4; i++) 
{ 
    a.at<double>(i) = 1; 
    b.at<double>(i) = 2; 
    c.at<double>(i) = 3; 
} 

cv::Mat d; 
std::vector<cv::Mat>tempVec; 
tempVec.push_back(a); 
tempVec.push_back(b); 
tempVec.push_back(c); 

cv::hconcat(tempVec,d); 

J'ai aussi essayé

cv::Mat d = cv::Mat::zeros(2,2,CV_64FC3); 
for (int w = 0; w < 2; w++) 
{ 
    for (int h = 0; h < 2; h++) 
    { 
     d.at<cv::Vec3d>(w,h)[0] = a.at<double>(w,h); 
     d.at<cv::Vec3d>(w,h)[1] = b.at<double>(w,h); 
     d.at<cv::Vec3d>(w,h)[2] = c.at<double>(w,h); 
    } 
}  

peut vous aider s'il vous plaît? s'il vous plaît voir que je dois utiliser imresize dans la ligne suivante de matlab, donc la solution devrait être cv :: Mat

va cv :: Mat avec cv :: Vec3f faire l'affaire? ou existe-t-il un meilleur moyen de concaténer 3 matrices en une matrice 3D?

mise à jour: j'ai changé cv::hconcat(tempVec,d); dans cv::merge(tempVec, d);

et ajoutez cette impression dans un fichier

ofstream myfile; 
myfile.open("C:\\Users\\gdarmon\\Desktop\\OpenCV_TNR.txt"); 
myfile << d; 
myfile.close(); 

ici est ma sortie

[1, 2, 3, 1, 2, 3; 
    1, 2, 3, 1, 2, 3] 

Répondre

1

Vous êtes assez proche. J'utiliserais cv::merge. En fait, son but est de fusionner des matrices monocanal (2D) en une matrice multi-canal (3D).

En tant que tel, au lieu de cv::hconcat, essayez:

cv::merge(tempVec, d); 
+0

s'il vous plaît regarder ma mise à jour. Je n'ai toujours pas les mêmes résultats que matlab – Gilad

+0

Oups. Pardon. J'ai besoin de réparer ça. Je ne déclare pas ma matrice de sortie correctement. Tenez – rayryeng

+0

Je n'ai aucune idée ... 'cv :: merge' est supposé fonctionner ... J'ai même utilisé ceci comme référence: http://stackoverflow.com/questions/14582082/merging-channels-in-opencv – rayryeng