2013-01-12 3 views
1

2d STL 벡터를 OpenCV Mat로 변환하는 함수를 몇 줄 작성했습니다. OpenCV는 Mat (벡터)를 사용하여 벡터에서 매트 초기화를 지원합니다. 그러나 이번에는 2D 벡터를 시도했지만 성공하지 못했습니다.벡터에서 벡터화 된 opencv Mat의 템플릿 초기화

함수는 간단 같다 :

template <class NumType> 
Mat Vect2Mat(vector<vector<NumType>> vect) 
{ 
    Mat mtx = Mat(vect.size(), vect[0].size(), CV_64F, 0); // don't need to init?? 
    //Mat mtx; 

    // copy data 
    for (int i=0; i<vect.size(); i++) 
     for (int j=0; j<vect[i].size(); j++) 
     { 
      mtx.at<NumType>(i,j) = vect[i][j]; 
      //cout << vect[i][j] << " "; 
     } 

    return mtx; 
} 

그래서 NumType에 따라서 매트 MTX를 initalize하는 방법은 무엇? 구문은 항상 CV_32F, CV_64F, ...로 고정되어 있으므로 매우 제한적입니다.

감사합니다!

답변

2

OpenCV 설명서에서 제공하는 답변을 찾은 것 같습니다. 이들은 DataType 클래스를 사용하여 "Class Trait"기술을 호출합니다.

이 같은있다 : 예를 들어

Mat mtx = Mat::zeros(vect.size(), vect[0].size(), DataType<NumType>::type); 

: 위대한 답변

template <class NumType> 
cv::Mat Vect2Mat(std::vector<std::vector<NumType>> vect) 
{ 
    cv::Mat mtx = cv::Mat::zeros(vect.size(), vect[0].size(), cv::DataType<NumType>::type); 
    //Mat mtx; 

    // copy data 
    for (int i=0; i<vect.size(); i++) 
     for (int j=0; j<vect[i].size(); j++) 
     { 
      mtx.at<NumType>(i,j) = vect[i][j]; 
      //cout << vect[i][j] << " "; 
     } 

     return mtx; 
} 
+0

1. 예를 들자면 도움이 될 것입니다. 교체 할 부품을 찾는 데 약간의 어려움이있었습니다. Mat mtx = Mat :: zeros (vect.size(), vect [0] .size(), DataType :: type); – qwerty9967