本文介绍在
C++
语言中,矩阵库
Armadillo

mat

vec
格式数据与计算机视觉库
OpenCV

Mat
格式数据相互转换的方法。


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
转为
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
库的矩阵数据加以相互转换。

至此,大功告成。

标签: none

添加新评论