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
参考
chrislzy: 如有疑惑,错误或者建议,请在评论区留下您宝贵的文字; 转载请注明作者和出处,未经允许请勿用于商业用途!