Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换

简介: Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换

  本文介绍在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库的矩阵数据加以相互转换。

  至此,大功告成。

欢迎关注:疯狂学习GIS

相关文章
|
2月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
52 2
|
9月前
|
存储 编译器 数据库
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV核心类型 Mat
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV核心类型 Mat
|
24天前
|
存储 算法 API
OpenCV 3.1.0中的Mat对象使用
OpenCV 3.1.0中的Mat对象使用
12 2
|
2月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
45 0
|
24天前
|
存储 编解码 API
【图像文本化】Base64编解码OpenCV4中 Mat 对象
【图像文本化】Base64编解码OpenCV4中 Mat 对象
18 0
|
2月前
|
计算机视觉 索引
opencv读取MP4文件和摄像头数据
opencv读取MP4文件和摄像头数据
70 0
|
2月前
|
计算机视觉
OpenCV(四):Mat支持的运算
OpenCV(四):Mat支持的运算
46 0
|
2月前
|
存储 计算机视觉
OpenCV(三):Mat类数据的读取
OpenCV(三):Mat类数据的读取
112 0
|
2月前
|
存储 Android开发 计算机视觉
OpenCV(二):认识Mat容器
OpenCV(二):认识Mat容器
73 0
|
8月前
|
计算机视觉
openCV之单应性矩阵
单应性矩阵
75 1