opencv之cv::Mat和Eigen矩陣比較
阿新 • • 發佈:2021-06-26
目錄
轉換
#include <Eigen/Core> #include <opencv2/core/eigen.hpp> void cv::eigen2cv(const Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& src, Mat& dst) void cv::cv2eigen(const Mat& src, Eigen::Matrix<_Tp, _rows, _cols, _options, _maxRows, _maxCols>& dst)
注: 在opencv中矩陣都是使用cv::Mat表示,但是在pcl中是使用Eigen::Matrix4d表示的
注: Eigen/Core
需要在opencv2/core/eigen.hpp
標頭檔案前面, 不然會提示找不到eigen.
效率比較
#include <chrono> #include <opencv2/opencv.hpp> #include <Eigen/Dense> int main(int argc, char** argv) { // opencv cv::Mat m1 = (cv::Mat_<float>(3, 3) << 1., 0., 3., 0., 5., 6., 7., 8., 0.); cv::Mat m2 = (cv::Mat_<float>(3, 3) << 0., 2., 1., 4., 5., 6., 7., 1., 0.); cv::Mat m3 = cv::Mat::zeros(3, 3, CV_32F); // eigen Eigen::Matrix3f eM1, eM2, eM3; eM1 << 1., 0., 3., 0., 5., 6., 7., 8., 0.; eM2 << 0., 2., 1., 4., 5., 6., 7., 1., 0.; eM3 << Eigen::Matrix3f::Zero(); // opencv multiple auto start_1 = std::chrono::system_clock::now(); for (size_t i = 0; i < 10000; ++i) { m3 += m1 * m2; } auto end_1 = std::chrono::system_clock::now(); auto duration_1 = 1.e-6 * std::chrono::duration_cast<std::chrono::microseconds>(end_1 - start_1).count(); std::cout << "Opencv Multiple Cost time: " << double(duration_1) << " seconds" << std::endl; // eigen multiple auto start_2 = std::chrono::system_clock::now(); for (size_t i = 0; i < 10000; ++i) { eM3 += eM1 * eM2; } auto end_2 = std::chrono::system_clock::now(); auto duration_2 = 1.e-6 * std::chrono::duration_cast<std::chrono::microseconds>(end_2 - start_2).count(); std::cout << "Eigen Multiple Cost time: " << double(duration_2) << " seconds" << std::endl; // opencv add auto start_3 = std::chrono::system_clock::now(); for (size_t i = 0; i < 10000; ++i) { m3 += m1 + m2; } auto end_3 = std::chrono::system_clock::now(); auto duration_3 = 1.e-6 * std::chrono::duration_cast<std::chrono::microseconds>(end_3 - start_3).count(); std::cout << "Opencv Add Cost time: " << double(duration_3) << " seconds" << std::endl; // eigen multiple auto start_4 = std::chrono::system_clock::now(); for (size_t i = 0; i < 10000; ++i) { eM3 += eM1 + eM2; } auto end_4 = std::chrono::system_clock::now(); auto duration_4 = 1.e-6 * std::chrono::duration_cast<std::chrono::microseconds>(end_4 - start_4).count(); std::cout << "Eigen Add Cost time: " << double(duration_4) << " seconds" << std::endl; return 0; }
結果
- 未release下
Opencv Multiple Cost time: 0.010322 seconds
Eigen Multiple Cost time: 0.074143 seconds
Opencv Add Cost time: 0.008985 seconds
Eigen Add Cost time: 0.004841 seconds
- release下
set(CMAKE_BUILD_TYPE Release)
Opencv Multiple Cost time: 0.008564 seconds Eigen Multiple Cost time: 2.7e-05 seconds Opencv Add Cost time: 0.007636 seconds Eigen Add Cost time: 2.7e-05 seconds