2014-01-07 144 views
3

我想轉換墊矢量和矢量墊在opencv。轉換墊到矢量<float>和矢量<float>墊在opencv

我的代碼:

 void mat_to_vector(Mat in,vector<float> &out){ 

     for (int i=0; i < in.rows; i++) { 
      for (int j =0; j < in.cols; j++){ 
       //unsigned char temp; 

       //file << Dst.at<float>(i,j) << endl; 
       out.push_back(in.at<float>(i,j)); 
      } 
     } 

    } 
void vector_to_mat(vector<float> in, Mat out,int cols , int rows){ 
    for (int i=rows-1; i >=0; i--) { 
      for (int j =cols -1; j >=0; j--){ 

       out.at<float>(i,j) = in.back(); 
       in.pop_back(); 
       //file << Dst.at<float>(i,j) << endl; 
       // dst_temp.push_back(Dst.at<float>(i,j)); 
      } 
     } 
} 

上面的代碼是緩慢的。 有更快的解決方案嗎?

回答

6

我覺得我的代碼將是對您有用:

// Generate some test data 
int r=3; 
int c=3; 
Mat M(r,c,CV_32FC1); 
for(int i=0;i<r*c;++i) 
{ 
    M.at<float>(i)=i; 
} 
// print out matrix 
cout << M << endl; 

// Create vector from matrix data (data with data copying) 
vector<float> V; 
V.assign((float*)M.datastart, (float*)M.dataend); 

// print out vector 
cout << "Vector" << endl; 
for(int i=0;i<r*c;++i) 
{ 
    cout << V[i] << endl; 
} 

// Create matrix from vector 

// Without copying data (only pointer assigned) 
//Mat M2=Mat(r,c,CV_32FC1,(float*)V.data()); 

// With copying data 
Mat M2=Mat(r,c,CV_32FC1); 
memcpy(M2.data,V.data(),V.size()*sizeof(float)); 


// Print out matrix created from vector 
cout << "Second matrix" << endl; 
cout << M2 <<endl; 
// wait for a key 
getchar(); 
+0

安德烈Smorodov:感謝 – user3088563

+0

是否有其它解決方案vector_to_mat(在,MAT出,整數COLS,INT行矢量)??? – user3088563

+0

你可以使用這個構造函數:template explicit Mat :: Mat(const Vec &vec,bool copyData = true) –

1

這是我要做的事。第一個功能受https://stackoverflow.com/a/26685567的啓發。 VectorToMat的輸出在CV _8U中。

void MatToVector(const Mat& in, vector<float>& out) 
// Convert a 1-channel Mat<float> object to a vector. 
{ 
if (in.isContinuous()) { out.assign((float*)in.datastart, (float*)in.dataend); } 
       else { 
       for (int i = 0; i < in.rows; ++i) 
       { out.insert(out.end(), in.ptr<float>(i), in.ptr<float>(i) + in.cols); } 
       }  return; 
} 


void VectorToMat(const vector<float>& in, Mat& out)  
{ 
vector<float>::const_iterator it = in.begin(); 
MatIterator_<uchar> jt, end; 
jt = out.begin<uchar>(); 
for (; it != in.end(); ++it) { *jt++ = (uchar)(*it * 255); } 
} 
相關問題