opencv之cv::Mat和Eigen矩阵比较

转换

#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

参考

原文链接: https://www.cnblogs.com/chrislzy/p/14934850.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    opencv之cv::Mat和Eigen矩阵比较

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/211688

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午12:55
下一篇 2023年2月13日 上午12:55

相关推荐