因为经常习惯的用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。

天之苍苍,其正色邪?

其远而无所至极邪?

Dlib笔记二:matrix或array2d与cv::Mat的互转的更多相关文章

  1. OpenCV学习笔记(二) cv::Mat

    部分内容转自:OpenCV Tuturial,ggicci 在OpenCV Tuturial中可查看Mat的初始化与打印方法. Mat本质上是由两个数据部分组成的类: 矩阵头(包含矩阵尺寸,存储方法, ...

  2. Dlib笔记一:基本数据结构和基本操作

    编译了Dlib之后就开始想着怎么用起来,先从基本的数据类型说起吧,因为是图像,所以难免会跟OpenCV的数据类型比较.在Dlib中,图像是用二维阵列(array2d)或者矩阵(matrix)来表示的, ...

  3. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  4. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  5. Mastering Web Application Development with AngularJS 读书笔记(二)

    第一章笔记 (二) 一.scopes的层级和事件系统(the eventing system) 在层级中管理的scopes可以被用做事件总线.AngularJS 允许我们去传播已经命名的事件用一种有效 ...

  6. Python 学习笔记二

    笔记二 :print 以及基本文件操作 笔记一已取消置顶链接地址 http://www.cnblogs.com/dzzy/p/5140899.html 暑假只是快速过了一遍python ,现在起开始仔 ...

  7. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  8. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

  9. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

随机推荐

  1. python isinstance()判断数据类型

    举例: d = (1,2,3) print(isinstance(d,int)) #False print(isinstance(d,tuple)) #True print(isinstance(d, ...

  2. NoSql相关

    1  NoSQL, No Problem: An Intro to NoSQL Databases https://www.thoughtworks.com/insights/blog/nosql-n ...

  3. Codeforces 1111C Creative Snap分治+贪心

    Creative Snap C. Creative Snap time limit per test 1 second memory limit per test 256 megabytes inpu ...

  4. 云时代架构阅读笔记五——Java内存模型详解(一)

    什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致 ...

  5. spring-@ResponseBody返回时的编码处理

    下面是一个解决方案 @RequestMapping(value = "/queryall", method = GET, produces = "application/ ...

  6. Python 加载mnist、cifar数据

    import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read_data_sets("MNIST_ ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 指针

    每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. #include <iostream> using namesp ...

  8. Http协议Get与Post请求

    摘要:https://blog.csdn.net/kebi007/article/details/103059900 不就是get拼接url,post传body,get限制字符串长度吗! 请求缓存:G ...

  9. Mac安装vue产生错误

    npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/webpack/node_modules/_ ...

  10. 项目版本回退后出现java compiler level does not match the version of the installed java project facet错误的解决

    今天项目出问题了,采取了项目版本回退的方法解决了代码不能够下拉和上送的问题以后,出现如下错误,项目是微服务的,更新相关的依赖项目,仍得不到解决,检查mapper.xml文件亦没问题.然后在控制台那块发 ...