因为经常习惯的用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. 免杀PHP一句话一枚

    免杀PHP一句话shell,利用随机异或免杀D盾,免杀安全狗护卫神等 <?php class VONE { function HALB() { $rlf = 'B' ^ "\x23&q ...

  2. es678910语法糖

    傲娇: 新es是js的进步,是编程的进步,es6已经过去了5年了,兼容率达到了90%,还是有10%的手机不兼容,那到底应不应该去照顾那些跟不上的人,我觉得是不应该的,新es能5行写出来的功能,我为什么 ...

  3. 054、Java中使用for循环第二种写法实现1~100的累加

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  4. 03.Delphi通过接口实现多重继承的优化

    在上一篇02中,写到的sayhello函数,需要使用2个接口参数,很繁琐.可以使用as参数,把多重继承的子类对象变成需要的对象 uSayHello代码如下 unit uSayHello; interf ...

  5. CSS样式表——格式与选择器

    1.分类 1)内联(写在标签内部) style="样式" 控制精确,代码重用性差 2)内嵌(在<head></head>中) <style type= ...

  6. html5移动端主流适配方案

    1.流式布局(百分比布局)    案例:京东移动端 优点:简单方便,只需要固定高度,宽度自适应: 缺点:大屏幕手机实际显示的不协调. 2.响应式布局 优点:可以节约成本,不用再做专门的web app网 ...

  7. 关于http的两种上传方法

    http传输数据GET和POST的两种方法: 1.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示. 2.get方式传递的参数可以在URL上看见,安全性不高,反之post安全 ...

  8. Ubuntu安装Python版本管理工具pyenv

    gyf@gyf-VirtualBox:~$ git clone https://github.com/yyuu/pyenv.git ~/.pyenvCloning into '/home/gyf/.p ...

  9. LeetCode1029 两地调度(贪心+java自定义排序回顾)

    题目: 公司计划面试 2N 人.第 i 人飞往 A 市的费用为 costs[i][0],飞往 B 市的费用为 costs[i][1]. 返回将每个人都飞到某座城市的最低费用,要求每个城市都有 N 人抵 ...

  10. 099-PHP二维数组的元素输出二

    <?php $stu=array(array(76,87,68), array(65,89,95), array(90,80,66), array(90,95,65)); //定义一个二维数组 ...