0
votes

I creating program using CNN where I need insert a matrix of 192 channels. This matrix (width: 32, height: 240, channels: 192, type: uchar) is stored in Mat (OpenCV). How convert Mat to dlib matrix?

std::vector<dlib::matrix<?>> training_data;
std::vector<unsigned long> training_labels;
...
Mat mat = loader.getMat();
? convert ?
training_data.push_back(dlib_matrix);
...
trainer.train(training_data, training_labels);
1

1 Answers

1
votes

You can use cv_image to convert from Mat to dlib image and dlib::toMat to convert from dlib to Mat.

//Mat to dlib image
cv_image<bgr_pixel> dlib_img(mat);

Edit:

As far I know, for n channel Mats you've to provide custom pixel_traits. For example, for a 5 channel Mat image you can do:

namespace dlib{
struct custom_pixel
    {
        custom_pixel (
        ) {}

        custom_pixel (
            unsigned char c1_,
            unsigned char c2_,
            unsigned char c3_,
            unsigned char c4_,
            unsigned char c5_
        ) : c1(c1_), c2(c2_), c3(c3_), c4(c4_), c5(c5_) {}

        unsigned char c1;
        unsigned char c2;
        unsigned char c3;
        unsigned char c4;
        unsigned char c5;
    };

template <>
    struct pixel_traits<custom_pixel>
    {
        constexpr static bool rgb  = false;
        constexpr static bool rgb_alpha  = false;
        constexpr static bool grayscale = false;
        constexpr static bool hsi = false;
        constexpr static bool lab = false;
        enum { num = 5};// provide number of channels here
        typedef unsigned char basic_pixel_type; //provide channel depth here
        static basic_pixel_type min() { return 0;}
        static basic_pixel_type max() { return 255;}
        constexpr static bool is_unsigned = true;
        constexpr static bool has_alpha = false;
    };
}

Then to convert from Mat to dlib and vice versa:

int main(int argc, char** argv)
{
    // from opencv to dlib
    Mat mat_img = Mat::zeros(3, 3, CV_8UC(5));
    cv_image<custom_pixel> dlib_img(mat_img);

    //from dlib to opencv
    Mat mat_img_new = dlib::toMat(dlib_img);
}