Eigen 与 OpenCV 数据转换

本文最后更新于:2023年1月17日 晚上

OpenCV 支持与 Eigen 之间的数据转化,本文记录方法。

数据转换

OpenCV 算子

示例

  • 转换代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <Eigen/Core>
#include <unsupported/Eigen/CXX11/Tensor>
#include <opencv2/core/eigen.hpp>
#include <opencv2/opencv.hpp>

using namespace Eigen;
using namespace std;
using namespace cv;


int main()
{
Mat img = imread("test.jpg");
Mat img2;
Eigen::Tensor<uint8_t, 3> a_tensor;
cv2eigen(img, a_tensor);
a_tensor.slice(Eigen::array<size_t, 3> {500, 500, 0}, Eigen::array<size_t, 3> {200, 400, 3}).setZero();
eigen2cv(a_tensor, img2);
}
  • 效果示例,可以看到 Tensor 按照预定想法处理了图像

  • Eigen 转 OpenCV 时需要 Tensor 为 3 维矩阵,不然会报错:

    如果是二维 Tensor 需要升维

1
2
3
4
5
Eigen::array<int, 3> three_dims{ {H, W, 1} };
Tensor<float, 3> result_map_3d = result_map_tmp_2d.reshape(three_dims);

Mat res;
eigen2cv(result_map_3d, res);
  • 与 OpenCV 官网示例代码有所出入,建议不加 Eigen::RowMajor

说明:这里说明一下,OpenCV 官网文档建议这样建立 Tensor 对象:Eigen::Tensor<uint8_t, 3, Eigen::RowMajor> a_tensor;

但是这样建立对象后简单的操作就会报错,建议不加 Eigen::RowMajor,截至目前我在代码中没发现删除这句话的弊端。

参考资料


Eigen 与 OpenCV 数据转换
https://www.zywvvd.com/notes/coding/cpp/eigen/eigen-opencv/
作者
Yiwei Zhang
发布于
2023年1月13日
许可协议