本文介绍在C++语言中,矩阵库Armadillomatvec格式数据与计算机视觉库OpenCVMat格式数据相互转换的方法。

  在C++语言的矩阵库Armadillo与计算机视觉库OpenCV中,都有矩阵格式的数据类型;而这两个库在运行能力方面各有千秋,因此实际应用过程中,难免会遇到需要将二者的矩阵格式数据类型加以相互转换的情况。本文就对其相互转换的具体方法加以介绍。

  首先,二者相互转换需要用到的代码如下。

#include <iostream>
#include <armadillo>
#include <opencv2/opencv.hpp> using namespace std; int main() {
// 将Armadillo的列向量vec转为OpenCV的Mat
arma::vec ar_vec = {1, 2, 3, 4};
cout << ar_vec << "\n" << endl;
cv::Mat cv_mat_1(ar_vec.n_rows, ar_vec.n_cols, CV_64FC1, ar_vec.memptr());
cout << cv_mat_1 << "\n" << endl; // 将Armadillo的mat转为OpenCV的Mat
arma::mat ar_mat = { {1, 2, 3}, {5, 6, 7} };
cout << ar_mat << "\n" << endl;
arma::mat ar_mat_t = ar_mat.t();
cv::Mat cv_mat_2(ar_mat.n_rows, ar_mat.n_cols, CV_64FC1, ar_mat_t.memptr());
cout << cv_mat_2 << "\n" << endl; // 将OpenCV的Mat转为Armadillo的mat
cv::Mat cv_mat = (cv::Mat_<double>(2, 3) << 1, 8, 9, 15, 22, 37);
cout << cv_mat << "\n" << endl;
arma::mat ar_mat_1_t(reinterpret_cast<double*>(cv_mat.data), cv_mat.cols, cv_mat.rows);
cout << ar_mat_1_t << "\n" << endl;
arma::mat ar_mat_1 = ar_mat_1_t.t();
cout << ar_mat_1 << "\n" << endl; // 将OpenCV的Mat转为Armadillo的列向量vec或行向量rowvec
cv::Mat cv_mat_3 = (cv::Mat_<double>(1, 4) << 1, 3, 7, 15);
cout << cv_mat_3 << "\n" << endl;
arma::vec ar_vec_1_t(reinterpret_cast<double*>(cv_mat_3.data), cv_mat_3.cols, cv_mat_3.rows);
cout << ar_vec_1_t << "\n" << endl;
arma::rowvec ar_vec_1 = ar_vec_1_t.t();
cout << ar_vec_1 << "\n" << endl; return 0;
}

  其中,主函数中共有4个部分,分别是将Armadillo的列向量vec转为OpenCVMat、将Armadillomat转为OpenCVMat、将OpenCVMat转为Armadillomat、将OpenCVMat转为Armadillo的列向量vec或行向量rowvec等4个过程的代码。

  转换的整体思路也非常简单。如果我们需要将Armadillo库的矩阵数据转换为OpenCV库的矩阵数据,那么就通过cv::Mat格式数据的构造函数,基于.memptr()函数将Armadillo库的矩阵数据元素分别提取出,放入OpenCV库的矩阵数据即可;反之,如果需要将OpenCV库的矩阵数据转换为Armadillo库的矩阵数据,则基于arma::mat格式数据的构造函数来实现即可。

  有一点需要注意的是,Armadillo库是以列优先的方式存储矩阵数据,而OpenCV库则是以行优先的方式存储矩阵数据;因此在上述二者相互转换的代码中,我们有时需要对转换的矩阵数据做一次转置操作,从而保证数据转换无误。

  为了方便对比,我们将上述代码运行所得结果加以展示;如下图所示。

  可以看到,上述三段代码可以成功地将Armadillo库、OpenCV库的矩阵数据加以相互转换。

  至此,大功告成。

C++中OpenCV、Armadillo矩阵数据格式的转换方式的更多相关文章

  1. FFMPEG内存操作(二)从内存中读取数及数据格式的转换

    相关博客列表: FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 在雷神 ...

  2. Java中Map和Object的互相转换方式

    一.使用Apache中的BeanUtils类,导入commons-beanutils包. Jar包Maven下载地址:https://mvnrepository.com/artifact/common ...

  3. 完善GDAL与OpenCV间的数据格式转换与影像分块读写

    本博客为原创内容,未经博主允许禁止转载,商用,谢谢. 一.前言 关于GDAL与openCV间的数据格式转换,在我之前的博客中已有简要说明,这里,由于最近工作上经常用到openCV里的函数进行图像处理, ...

  4. OpenCV在矩阵上的卷积

    转载请注明出处!!!http://blog.csdn.net/zhonghuan1992 OpenCV在矩阵上的卷积 在openCV官网上说是戴面具,事实上就是又一次计算一下矩阵中的每个value,那 ...

  5. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)

    理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...

  6. (原)关于MEPG-2中的TS流数据格式学习

    关于MEPG-2中的TS流数据格式学习 Author:lihaiping1603 原创:http://www.cnblogs.com/lihaiping/p/8572997.html 本文主要记录了, ...

  7. ArcGIS 10 影像、栅格数据格式批量转换

    转自原文 ArcGIS 10 影像.栅格数据格式批量转换 在做三维场景的时候,经常会涉及多种不同格式DEM数据或者影像的转换,如ASCII.GRID.IMG.TIFF等等,遇到大数据量时,我们就需要批 ...

  8. SQL中CONVERT日期不同格式的转换用法

    SQL中CONVERT日期不同格式的转换用法 格式: CONVERT(data_type,expression[,style]) 说明:此样式一般在时间类型(datetime,smalldatetim ...

  9. [转]JS中对象与字符串的互相转换

    原文地址:http://www.cnblogs.com/luminji/p/3617160.html 在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: thr ...

  10. JS中对象与字符串的互相转换

    在使用 JSON2.JS 文件的 JSON.parse(data) 方法时候,碰到了问题: throw new SyntaxError('JSON.parse'); 查询资料,大概意思如下: JSON ...

随机推荐

  1. 每日一道面试题:Java中序列化与反序列化

    写在开头 哈喽大家好,在高铁上码字的感觉是真不爽啊,小桌板又拥挤,旁边的小朋友也比较的吵闹,影响思绪,但这丝毫不影响咱学习的劲头!哈哈哈,在这喧哗的车厢中,思考着这样的一个问题,Java中的对象是如何 ...

  2. Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

    Prompt-"设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务" 通过设计提示(prompt)模板,实现使用更少量的数据在预训练模型 ...

  3. 神经网络优化篇:将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a neural network)

    将 Batch Norm 拟合进神经网络 假设有一个这样的神经网络,之前说过,可以认为每个单元负责计算两件事.第一,它先计算z,然后应用其到激活函数中再计算a,所以可以认为,每个圆圈代表着两步的计算过 ...

  4. 内存池是什么原理?|内存池简易模拟实现|为学习高并发内存池tcmalloc做准备

    前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.ne ...

  5. P5047 [Ynoi2019 模拟赛] Yuno loves sqrt technology II 题解

    题目链接:Yuno loves sqrt technology II 很早以前觉得还挺难的一题.本质就是莫队二次离线,可以参考我这篇文章的讲述莫队二次离线 P5501 [LnOI2019] 来者不拒, ...

  6. 洛谷P1045 麦森数。 快速幂算法以及固定位数的高精度乘法的优化

    P1045 [NOIP2003 普及组] 麦森数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 想法很简单,我们要做的就是两件事,求2^P-1的位数,求出2^P-1的最后500位数 ...

  7. 十八张图带你入门实时监控系统HertzBeat

    我们经常讲:研发人员有两只眼睛,一只是监控平台,另一只是日志平台.在对性能和高可用讲究的场景里,监控平台的重要性再怎么强调也不过分. 这篇文章,我们聊聊开源实时监控告警系统 HertzBeat 赫兹跳 ...

  8. .NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记

    13 | 配置绑定:使用强类型对象承载配置数据 要点: 1.支持将配置值绑定到已有对象 2.支持将配置值绑定到私有属性上 继续使用上一节代码 首先定义一个类作为接收配置的实例 class Config ...

  9. HBase-宽表和高表的对比

    一.宽表和高表定义 HBase 中的表可以设计为高表(tall-narrow table) 和 宽表(flat-wide table): (1) 宽表是指很多列较少行,即列多行少的表,一行中的数据量较 ...

  10. 初次尝试GPU Driver —— 大范围植被渲染之着色

    初次尝试GPU Driver -- 大范围植被渲染之着色 在<初次尝试GPU Driven -- 大范围植被渲染>中实现了草地分布,本文实现草的着色. 本文分四个部分: 生成网格 随机调整 ...