8

I'd like to write a template function to copy data referenced by pointer T* image to cv::Mat. I am confusing how to generalize T and cv_type matching.

template<typename T>
cv::Mat convert_mat(T *image, int rows, int cols) {
    // Here we need to match T to cv_types like CV_32F, CV_8U and etc.
    // The key point is how to connect these two
    cv::Mat mat(rows, cols, cv_types, image);
    return mat;
}

I am new to template programming, I am quite confused how to implement T-cv_types correspondence.

Anyone has any idea? Thank you!!!

2
  • 1
    I don't really understand the question - what logic do you use for mapping types to "cv_types" when you don't use templates? Commented Jan 11, 2018 at 13:10
  • you can probably try it with cv::Mat_<T> which does not require the cv_type since it is templated Commented Jan 11, 2018 at 13:10

1 Answer 1

17

Use cv::DataType<T>::type .

Here is an example.

// Create Mat from buffer 
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;


/*
//! First version
//! 2018.01.11 21:16:32 (+0800)
template <typename T>
Mat createMat(T* data, int rows, int cols) {
    // Create Mat from buffer
    Mat mat(rows, cols, cv::DataType<T>::type);
    memcpy(mat.data, data, rows*cols * sizeof(T));
    return mat;
}
*/

//! Second version 
//! 2018.09.03 16:00:01 (+0800) 
template <typename T>
cv::Mat createMat(T* data, int rows, int cols, int chs = 1) {
    // Create Mat from buffer 
    cv::Mat mat(rows, cols, CV_MAKETYPE(cv::DataType<T>::type, chs));
    memcpy(mat.data, data, rows*cols*chs * sizeof(T));
    return mat;
}

int main(){
    int    arr1[4] = {1,2,3,4};
    double arr2[4] = {1.1,2.2,3.3,4.4};

    Mat mat1 = createMat<int>(arr1, 2,2);
    Mat mat2 = createMat<double>(arr2, 2,2);
    cout << "Mat1:\n"<< mat1 <<endl;
    cout << "Mat2:\n"<< mat2 <<endl;
}

Result:

Mat1:
[1, 2;
 3, 4]
Mat2:
[1.1, 2.2;
 3.3, 4.4]
Sign up to request clarification or add additional context in comments.

1 Comment

Nice answer. I've bookmarked this. I've always wanted a streamlined way of doing this. Thank you!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.