C++中OpenCV、Armadillo矩陣資料格式的轉換方式

疯狂学习GIS發表於2024-03-08

  本文介紹在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庫則是以行優先的方式儲存矩陣資料;因此在上述二者相互轉換的程式碼中,我們有時需要對轉換的矩陣資料做一次轉置操作,從而保證資料轉換無誤。

  為了方便對比,我們將上述程式碼執行所得結果加以展示;如下圖所示。

image

  可以看到,上述三段程式碼可以成功地將Armadillo庫、OpenCV庫的矩陣資料加以相互轉換。

  至此,大功告成。

相關文章