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。

    天之苍苍,其正色邪?

    其远而无所至极邪?

    上善若水,为而不争。
  • 相关阅读:
    GTK+ 3.6.2 发布,小的 bug 修复版本
    RunJS 新增 Echo Ajax 测试功能
    Mozilla 发布 Popcorn Maker,在线创作视频
    Sina微博OAuth2框架解密
    Mina状态机State Machine
    Mozilla 发布 Shumway —— 纯JS的SWF解析器
    Code Browser 4.5 发布,代码浏览器
    ROSA 2012 "Enterprise Linux Server" 发布
    ltrace 0.7.0 发布,程序调试工具
    Artifactory 2.6.5 发布,Maven 扩展工具
  • 原文地址:https://www.cnblogs.com/Bearoom/p/11721787.html
Copyright © 2011-2022 走看看