码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++中OpenCV、Armadillo矩阵数据格式的转换方式


    合集 - C++知识(14)
    1.C++函数如何具有多个返回值?2023-10-212.在Linux Ubuntu系统中部署C++环境与Visual Studio Code软件01-263.安装Visual Studio的详细流程01-284.获取Visual Studio所用MSVC编译器版本:_MSC_VER数值01-295.Visual Studio部署C++矩阵库Armadillo的方法01-306.如何在Visual Studio新C++项目中调用之前配置过的库?01-317.在Visual Studio中部署GDAL库的C++版本(包括SQLite、PROJ等依赖)02-018.C++遴选出特定类型的文件或文件名符合要求的文件02-029.C++ GDAL提取多时相遥感影像中像素随时间变化的数值数组02-0310.创建大量栅格文件并分别写入像元数据:C++ GDAL代码实现02-0411.Visual Studio部署matplotlib绘图库的C++版本02-0712.C++ GDAL用CreateCopy()新建栅格并修改波段的个数02-2613.Visual Studio部署C++环境下OpenCV库03-06
    14.C++中OpenCV、Armadillo矩阵数据格式的转换方式03-08
    收起

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

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

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

    #include 
    #include 
    #include 
    
    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转为OpenCV的Mat、将Armadillo的mat转为OpenCV的Mat、将OpenCV的Mat转为Armadillo的mat、将OpenCV的Mat转为Armadillo的列向量vec或行向量rowvec等4个过程的代码。

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

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

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

    image

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

      至此,大功告成。

  • 相关阅读:
    信奥中的数学:斐波那契数列
    人工智能 PyTorch(一)
    2.5 贝叶斯分类器
    基于AM5708开发板——开箱初探+环境搭建、源码编译
    关于VC++运行库报错
    优秀硕士毕业生发言稿
    云原生Kubernetes:K8S配置资源管理
    建筑可视化中的 3D 纹理
    【服务器数据恢复】服务器Raid5阵列mdisk磁盘离线的数据恢复案例
    动态链接库Dll的编写与使用
  • 原文地址:https://www.cnblogs.com/fkxxgis/p/18060640
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号