惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
F
Fortinet All Blogs
J
Java Code Geeks
Y
Y Combinator Blog
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
M
MIT News - Artificial intelligence
腾讯CDC
Last Week in AI
Last Week in AI
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
博客园 - 叶小钗
Recent Announcements
Recent Announcements
T
Tailwind CSS Blog
Engineering at Meta
Engineering at Meta
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
人人都是产品经理
人人都是产品经理
L
LangChain Blog
博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
Eigen 与 OpenCV 数据转换
Yiwei Zhang · 2023-01-13 · via 又见苍岚

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,截至目前我在代码中没发现删除这句话的弊端。

参考资料

文章链接:
https://www.zywvvd.com/notes/coding/cpp/eigen/eigen-opencv/