You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cv::cv2eigen转换cv::Mat至Eigen::Matrix时编译报错

OpenCV cv::Mat转Eigen::Matrix编译错误解决方法

问题背景

需要将cv::Mat转换为Eigen::Matrix以使用Eigen库功能,采用OpenCV提供的cv::cv2eigen函数(位于opencv2/core/eigen.hpp),但编译时出现以下错误:

  • ‘Eigen does not name a type’
  • 函数重定义错误
    使用版本为OpenCV 4.2.0。

错误原因

核心问题是头文件包含顺序错误:opencv2/core/eigen.hpp内部直接依赖Eigen的类型定义,若先包含该OpenCV头文件,编译器尚未识别Eigen命名空间,就会触发类型未定义错误;同时顺序不当可能引发宏定义冲突,导致函数重定义问题。

解决步骤

1. 调整头文件包含顺序

必须先包含Eigen的核心头文件,再包含OpenCV的Eigen适配头文件:

#include <iostream>
// 先包含Eigen头文件
#include <Eigen/Core>
// 再包含OpenCV核心及Eigen适配头文件
#include <opencv2/core.hpp>
#include <opencv2/core/eigen.hpp>

2. 确保编译时正确引入Eigen依赖

  • 使用g++直接编译:需指定Eigen和OpenCV的头文件与库路径,示例命令:
    g++ -o mat2eigen mat2eigen.cpp pkg-config --cflags --libs opencv4 eigen3``
  • 使用CMake构建:在CMakeLists.txt中正确查找并链接依赖:
    cmake_minimum_required(VERSION 3.10)
    project(mat2eigen)
    
    find_package(OpenCV 4.2 REQUIRED)
    find_package(Eigen3 REQUIRED)
    
    add_executable(mat2eigen mat2eigen.cpp)
    target_link_libraries(mat2eigen ${OpenCV_LIBS} Eigen3::Eigen)
    

3. 验证OpenCV编译时启用Eigen支持(可选)

若为自行编译的OpenCV,需确认编译时开启了WITH_EIGEN选项(OpenCV 4.2默认已启用该选项,通常无需额外操作)。

修正后完整示例代码

#include <iostream>
#include <Eigen/Core>
#include <opencv2/core.hpp>
#include <opencv2/core/eigen.hpp>

int main(int argc, char const *argv[]) {
    cv::Mat cv_mat = cv::Mat::eye(3, 3, CV_64FC1);
    std::cout << "cv::Mat:\n" << cv_mat << std::endl;
    
    Eigen::Matrix3d eigen_mat;
    cv::cv2eigen(cv_mat, eigen_mat);
    std::cout << "\nEigen::Matrix3d:\n" << eigen_mat << std::endl;
    
    return 0;
}

内容的提问来源于stack exchange,提问作者Milan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:01:01