zoukankan      html  css  js  c++  java
  • Dlib笔记二:matrix或array2d与cv::Mat的互转

    因为经常习惯的用OpenCV来做图像处理,所以难免希望将其他库的图像数据与OpenCV互转,所以今天就记录下这种互转的方法。

    1、dlib::matrix/dlib::array2d转cv::Mat

    前面说了,定义好一个matrix或者array2d的变量后,是可以通过nr()和nc()函数来获取图像的高度和宽度(行数和列数),然后我们可以通过image_data()来获取数据指针,这个时候要注意,image_data()返回的是void*类型的指针,所以要注意在使用的时候要转为相应的数据类型。然后再构造cv::Mat的时候就调用cv::Mat的构造函数来构造即可。cv::Mat的有一个构造函数是:

    inline Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
        : flags(MAGIC_VAL + (_type & TYPE_MASK)), 
          dims(2), 
          rows(_rows), 
          cols(_cols),
          data((uchar*)_data), 
          datastart((uchar*)_data), 
          dataend(0), 
          datalimit(0),
          allocator(0), 
          u(0), 
          size(&rows)

    对于三通道的matrix或者array2d,要转成cv::Mat的时候要考虑是不是bgr_pixel,如果是,那就直接转,如果不是,要先转为bgr_pixel然后再转;如果是灰度图,那就可以直接转换了。以matrix为例子,array2d是一样的操作,代码大致是这样的:

    // rgb_pixel/hsi_pixel/lab_pixel
    matrix<rgb_pixel> dMat;
    load_image(dMat, img_path);
    matrix<bgr_pixel> dMat_;
    assign_image(dMat_, dMat);
    uchar *ptrMat = (uchar *)image_data(dMat_);
    cv::Mat cMat = cv::Mat(dMat_.nr(), dMat_.nc(), CV_8UC3, ptrMat);
    
    // bgr_pixel
    matrix<bgr_pixel> dMat;
    load_image(dMat, img_path);
    uchar *ptrMat = (uchar *)image_data(dMat);
    cv::Mat cMat = cv::Mat(dMat.nr(), dMat.nc(), CV_8UC3, ptrMat);
    
    // unsigned char
    matrix<unsigned char> dMat;
    load_image(dMat, img_path);
    uchar *ptrMat = (uchar *)image_data(dMat);
    // cv::Mat cMat = cv::Mat(dMat.nr(), dMat.nc(), CV_8UC1, ptrMat);
    // 或者:
    cv::Mat cMat = cv::Mat(dMat.nr(), dMat.nc(), CV_8U, ptrMat);
    
    //rgb_alpha_pixel

    但是要注意有一种情况,rgb_alpha_pixel四通道矩阵,这一种没有提供bgr_alpha_pixel,所以直接转为CV_8UC4的时候红蓝通道是错误的,这个时候可能就要取舍,去掉alpha通道,改为bgr_pixel后转为CV_8UC3;也可以转为CV_8UC4后对红蓝通道做调整即可。

    2、cv::Mat转matrix或array2d

    cv::Mat转为dlib::matrix和dlib::array2d的时候要先转为cv_image,然后再通过assign_image转为matrix或array2d,dlib提供了几种OpenCV支持的数据格式,其接口如下:

    cv_image (const cv::Mat img)
    cv_image (const IplImage img)
    cv_image (const IplImage* img)

    所以在转之前,要先把cv::Mat转为cv_image。

    代码如下:

    //CV_8U/CV_8UC1 ==>> unsigned char
    array2d<unsigned char> dMat_;
    assign_image(dMat_, cv_image<unsigned char>(cMat));
    
    //CV_8UC3 ==>> bgr_pixel
    array2d<bgr_pixel> dMat_;
    assign_image(dMat_, cv_image<bgr_pixel>(cMat));

    同样,如果8UC4要转为rgb_alpha_pixel的时候,还是要先对红蓝通道调整,再转为rgb_alpha_pixel,或者就转为bgr_pixel后再转rgb_alpha_pixel。

    天之苍苍,其正色邪?

    其远而无所至极邪?

    上善若水,为而不争。
  • 相关阅读:
    【题解】【LOJ2102】「TJOI2015」弦论
    【学习笔记】后缀自动机复习
    【博客介绍】笔者的自我介绍/博客简介
    【题解】【CodeForces653F】Ants on a Circle
    带修莫队
    [BZOJ3832]Rally(线段树+拓扑排序)
    [CTSC2010]星际旅行(带反悔的贪心)
    [TJOI2011]书架
    CF1204E Natasha, Sasha and the Prefix Sums
    [CSP校内集训]ginkgo(树上启发式合并/逆序对)
  • 原文地址:https://www.cnblogs.com/Bearoom/p/11721787.html
Copyright © 2011-2022 走看看