2016-09-07 55 views
1

我想創建一個矩陣只有一列從另一個矩陣,當然還有複製數據。調整大小的矩陣與複製數據opencv

void redim(Mat in , Mat &out) { 

    for (int l=0 ; l < in.rows*in.cols ; l++){ 
    for(int j=0; j< in.rows ; j++){ 
     for(int i=0 ; i < in.cols; i++){ 
     out.at <float> (l,0)= in.at <float> (j,i); 
     } 
    } 
    } 
} 
int main(){ 
Mat It3; 
It3 = (Mat_<double>(2,3) << 0,4,6,7,8,9); 
Mat S= Mat :: zeros (It3.rows* It3.cols , 1, CV_32FC1) ; 
redim(It3,S); 
waitKey(); 
} 

但我得到的結果矩陣S=[0;0;0;0;0;0]

回答

1
  1. 您正在混合floatdouble作爲數據類型。選一個!
  2. 您的for循環沒有任何意義。

您可以:

  • 糾正你for循環,如在使用toSingleColumn1
  • 一個for循環,但使用指標,如toSingleColumn2
  • 使用cv::reshape,這不正是這一點,因爲in toSingleColumn3

查看代碼下方。 b1,b2b3將等於:

#include <opencv2\opencv.hpp> 
using namespace cv; 

// Use two for loops, with coordinates 
void toSingleColumn1(const Mat1f& src, Mat1f& dst) 
{ 
    int N = src.rows * src.cols; 
    dst = Mat1f(N, 1); 
    int i=0; 
    for (int r = 0; r < src.rows; ++r) { 
     for (int c = 0; c < src.cols; ++c) { 
      dst(i++, 0) = src(r, c); 
     } 
    } 
} 

// Use a single for loop, with indices 
void toSingleColumn2(const Mat1f& src, Mat1f& dst) 
{ 
    int N = src.rows * src.cols; 
    dst = Mat1f(N, 1); 

    for (int i = 0; i < N; ++i) { 
     dst(i) = src(i); 
    } 
} 

// Use cv::reshape 
void toSingleColumn3(const Mat& src, Mat& dst) 
{ 
    // The 'clone()' is needed to deep copy the data 
    dst = src.reshape(src.channels(), src.rows*src.cols).clone(); 
} 

int main() 
{ 
    Mat1f a = (Mat1f(2,3) << 0.f, 4.f, 6.f, 7.f, 8.f, 9.f); 

    Mat1f b1, b2, b3; 
    toSingleColumn1(a, b1); 
    toSingleColumn2(a, b2); 
    toSingleColumn3(a, b3); 

    return 0; 
}