C++中OpenCV、Armadillo矩阵数据格式的转换方式

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

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

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

cpp 复制代码
#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库的矩阵数据加以相互转换。

至此,大功告成。

相关推荐
咩咩大主教17 分钟前
C++基于select和epoll的TCP服务器
linux·服务器·c语言·开发语言·c++·tcp/ip·io多路复用
Ylucius2 小时前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
是店小二呀2 小时前
【C++】C++ STL探索:Priority Queue与仿函数的深入解析
开发语言·c++·后端
ephemerals__2 小时前
【c++】动态内存管理
开发语言·c++
CVer儿2 小时前
条件编译代码记录
开发语言·c++
程序猿练习生3 小时前
C++速通LeetCode简单第18题-杨辉三角(全网唯一递归法)
c++·算法·leetcode
汉字萌萌哒3 小时前
【2022 CCF 非专业级别软件能力认证第一轮(CSP-J1)入门级 C++语言试题及解析】
数据结构·c++·算法
th新港3 小时前
CCF201909_1
数据结构·c++·算法·ccf
意如流水任东西3 小时前
[C++]类和对象(上)
开发语言·c++
孤寂大仙v3 小时前
【C++】STL----stack和queue常见用法
开发语言·c++