2013-08-27 2 views
0

Я пытаюсь сохранить 4 матрицы внутри матрицы. Но я не был уверен, можем ли мы это сделать. Так что я преобразовал 4matrix в 4 вектора. Теперь я хочу вставить 4 вектора в матрицу. Мой код:Сохранение векторов в Mat opencv

 Mat hist_TL = Mat::zeros(20,1, CV_32F); 
     Mat hist_TR = Mat::zeros(20,1, CV_32F); 
     Mat hist_BL = Mat::zeros(20,1, CV_32F); 
     Mat hist_BR = Mat::zeros(20,1, CV_32F); 
     for(int i=1;i<=21;i++) 
     { 
      for(int k=0;k<TL_k_stats.rows;k++) 
      { 
      if((angl_TL<=bins[i]) && (angl_TL>bins[i-1])) 
      { 
       hist_TL.at<float>(i-1,0)+=TL_k_stats.at<float>(k,4); 
      } 
      if((angl_TR<=bins[i]) && (angl_TR>bins[i-1])) 
       { 
       hist_TR.at<float>(i-1,0)+=TR_k_stats.at<float>(k,4); 
       } 

      if((angl_BL<=bins[i]) && (angl_BL>bins[i-1])) 
       { 
       hist_BL.at<float>(i-1,0)+=BL_k_stats.at<float>(k,4); 
       } 

      if((angl_BR<=bins[i]) && (angl_BR>bins[i-1])) 
       { 
       hist_BR.at<float>(i-1,0)+=BR_k_stats.at<float>(k,4); 
       } 
      } 
     hist_TL=hist_TL.inv(); 
     hist_TR=hist_TR.inv(); 
     hist_BL=hist_BL.inv(); 
     hist_BR=hist_BR.inv(); 
     std::vector<float> vhist_TL; 
     std::vector<float> vhist_TR; 
     std::vector<float> vhist_BL; 
     std::vector<float> vhist_BR; 

     hist_TL.copyTo(vhist_TL); 
     hist_TR.copyTo(vhist_TR); 
     hist_BL.copyTo(vhist_BL); 
     hist_BR.copyTo(vhist_BR); 

Поэтому я хочу скопировать 4 вектора в одну матрицу. Если есть какой-нибудь способ я могу сделать это без преобразования матрицы к vector.Please позвольте мне know.In MatLab мы можем непосредственно хранить его в массив и возвращает его как этот

features[] = {hist_TL', hist_TR', hist_BL', hist_BR'}; 

Так как я могу добиться этого в opencv ??

ответ

0

Вы можете использовать методы «Col», которые позволяют присваивать значения столбцов индивидуально:

Mat hist_TL = Mat::zeros(20,1, CV_32F)+1; 
    Mat hist_TR = Mat::zeros(20,1, CV_32F)+2; 
    Mat hist_BL = Mat::zeros(20,1, CV_32F)+3; 
    Mat hist_BR = Mat::zeros(20,1, CV_32F)+4; 

    Mat result = Mat::zeros(20,4,CV_32F); 

    hist_TL.col(0).copyTo(result.col(0)); 
    hist_TR.col(0).copyTo(result.col(1)); 
    hist_BL.col(0).copyTo(result.col(2)); 
    hist_BR.col(0).copyTo(result.col(3)); 

UPDATE:

Если вы не хотите, чтобы заменить целые столбцы, а просто их части, вы можете использовать методы «Диапазон»:

Mat result = Mat::zeros(20*4,1,CV_32F); 

    hist_TL.copyTo(result.rowRange(Range(20*0,20*1))); 
    hist_TR.copyTo(result.rowRange(Range(20*1,20*2))); 
    hist_BL.copyTo(result.rowRange(Range(20*2,20*3))); 
    hist_BR.copyTo(result.rowRange(Range(20*3,20*4))); 
+0

Но я должен транспонировать Mat hist_TL и другие перед сохранением it.So, что она будет иметь один ряд с munltiple столбцов – user1583647

0

Вы можете скопировать 4 матрицы в большую, это:

Mat TL(rows, cols, type); 
    Mat TR(rows, cols, type); 
    Mat BL(rows, cols, type); 
    Mat BR(rows, cols, type); 
    Mat dst(rows * 2, cols *2, type); 
    TL.copyTo(dst(Rect(0, 0, cols, rows))); 
    TR.copyTo(dst(Rect(cols, 0, cols, rows))); 
    BL.copyTo(dst(Rect(0, rows, cols, rows))); 
    BR.copyTo(dst(Rect(cols, rows, cols, rows))); 

Документы:

http://docs.opencv.org/modules/core/doc/basic_structures.html#rect http://docs.opencv.org/modules/core/doc/basic_structures.html?highlight=copyto#mat-copyto