2012-04-13 32 views
5

Tôi có đoạn mã sau đây, mà tôi đã tạo để thay đổi cường độ của pixel trong hình ảnh OpenCV (Cv :: Lớp Mat).C++: Làm cách nào để tạo kiểu mẫu động

Như bạn có thể thấy, tôi đang lặp trong cả hai trường hợp, nhưng với loại mẫu khác nhau.

Chức năng 'chuyển' có thể bị quá tải.

Câu hỏi của tôi là, do đó, làm thế nào tôi có thể tạo động kiểu mẫu để nó trông tốt hơn ..

Mat mat = _mat.clone() ; 
int channels = mat.channels(); 

switch(channels) 
{ 
case 1: 
    for (int i=0; i<mat.rows; i++) 
    { 
     for (int j=0; j<mat.cols; j++) 
     { 
      uchar src = mat.at<uchar>(i,j); 
      uchar dst = mat.at<uchar>(i,j); 

      t.transfer(src, dst); 
     } 
    } 
    break; 

case 3: 
    for (int i=0; i<mat.rows; i++) 
    { 
     for (int j=0; j<mat.cols; j++) 
     { 
      Vec3b src = mat.at<Vec3b>(i,j); 
      Vec3b dst = mat.at<Vec3b>(i,j); 

      t.transfer(src, dst); 
     } 
    } 
    break; 
} 

return mat ; 
+0

Điều này không liên quan đến câu trả lời, nhưng không phải là src và dst tương đương? 'Transfer()' làm gì? –

Trả lời

11

Làm thế nào về một cái gì đó như thế này:

template <typename U, typename T> 
void transfer_mat(Mat & mat, T & t) 
{ 
    for (int i = 0, r = mat.rows; i != r; ++j) 
    { 
     for (int j = 0, c = mat.cols; j != c; ++j) 
     { 
      U src = mat.at<U>(i, j); 
      U dst = mat.at<U>(i, j); 

      t.transfer(src, dst); 
     } 
    } 
} 

Sau đó, bạn có thể nói:

switch(channels) 
{ 
case 1: 
    transfer_mat<uchar>(mat, t); 
    break; 
case 2: 
    transfer_mat<Vec3b>(mat, t); 
    break; 
} 
2

Không rõ ràng về phạm vi mã của bạn (trông giống như chức năng thành viên) và loại t là, nhưng điều này sẽ giúp bạn bắt đầu:

template<typename AtT> 
Mat& transfer_impl(Mat& mat, T& t) 
{ 
    for (int i = 0; i < mat.rows; ++i) 
     for (int j = 0; j < mat.cols; ++j) 
      t.transfer(mat.at<AtT>(i, j), mat.at<AtT>(i, j)); 
    return mat; 
}; 

Mat transfer(Mat const& _mat, T& t) 
{ 
    Mat mat = _mat.clone(); 
    switch (mat.channels()) 
    { 
    case 1: return transfer_impl<uchar>(mat, t); 
    case 3: return transfer_impl<Vec3b>(mat, t); 
    default: throw std::runtime_error(/*...*/); 
    } 
} 
Các vấn đề liên quan