2012-04-13 14 views
5

मेरे पास कोड का निम्न भाग है, जिसे मैंने ओपनसीवी छवि (सीवी :: मैट क्लास) में पिक्सेल की तीव्रता बदलने के लिए बनाया है।सी ++: मैं गतिशील टेम्पलेट प्रकार कैसे बना सकता हूं

जैसा कि आप देख सकते हैं, मैं दोनों मामलों में लूपिंग कर रहा हूं, लेकिन विभिन्न टेम्पलेट प्रकार के साथ।

'स्थानांतरण' फ़ंक्शन ओवरलोड हो सकता है।

मेरा प्रश्न है, इसलिए, मैं कैसे गतिशील टेम्पलेट प्रकार बना सकते हैं इतना है कि यह बेहतर .. लग रहा है

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

यह उत्तर से संबंधित नहीं है, लेकिन src और dst समकक्ष नहीं हैं? 'स्थानांतरण() 'क्या करता है? –

उत्तर

11

कैसे कुछ इस तरह के बारे में:

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); 
     } 
    } 
} 

तो फिर तुम कह सकते हैं:

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

यह आपके कोड के दायरे के रूप में अस्पष्ट है (सदस्य फ़ंक्शन की तरह दिखता है), और किस प्रकार t है, लेकिन यह आपको शुरू करना चाहिए:

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(/*...*/); 
    } 
} 
संबंधित मुद्दे