OpenCV中Mat与Matlab中mxArray类型的转换II

本文介绍了一种简化的方法来实现OpenCV中的cv::Mat类型与Matlab中的mxArray类型的相互转换,并特别关注单通道Single型数据。文章强调了OpenCV与Matlab在数据存储方式上的区别及转换时需注意的事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   上一次在《OpenCV中MatMatlab中mxArray类型的转换代码中转换方法有些麻烦,后来使用了一种较为简洁的办法,如下:

 

     现在有一个cv::Mat 矩阵 m_GaborFea,它是单通道 Single型,转换为matlab数据类型,

    mxArray * pv;
    if (!m_GaborFea.empty())
    {
      m_GaborFea = m_GaborFea.t();
      pv = mxCreateNumericMatrix(m_GaborFea.cols,m_GaborFea.rows,mxSINGLE_CLASS, mxREAL);
      memcpy(mxGetPr(pv), m_GaborFea.data, mxGetNumberOfElements(pv)*sizeof(float));
    }
    else
    {
      printf("GaborFeais empty! \n");
      return false;
    }


       这样就将cv::Mat转为 mxArray 类型了,同理,mxArray转为cv::Mat只需要将memcpy中的前两个参数互换下位置。这里需要注意的是:OpenCV 中数据存储的方式是按行存储,而matlab 是按列存储,这点需要在转换中注意。

      各位还有什么问题,欢迎讨论。

### 使用OpenCVMATLAB集成的方法 为了在 MATLAB 中利用 OpenCV 的功能,通常有两种主要方式来实现两者的集成。一种是通过 MEX 文件调用 C++ 编写的 OpenCV 函数;另一种则是借助于 MATLAB 自身支持 Python 脚本的能力间接访问 OpenCV 库。 #### 方法一:MEX 接口连接 C++ 和 MATLAB 创建 MEX 文件允许直接从 MATLAB 环境内部执行由 C 或 C++ 开发的功能模块。这使得能够高效地将复杂的计算机视觉算法移植到 MATLAB 平台之上。具体操作如下: 1. **安装必要的工具链** - 安装 MinGW-w64 (对于 Windows 用户),Xcode Command Line Tools (macOS) 或者 GCC/Clang 工具链 (Linux)[^2]。 2. **配置编译器路径** - 设置好相应的编译选项以便 MATLAB 可识别外部库的位置以及头文件所在目录[^2]。 3. **编写封装函数** - 利用 CMakeLists.txt 来管理依赖关系,并定义入口点以供 MATLAB 调用。 ```cpp // example.cpp #include <opencv2/core.hpp> #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { cv::Mat img = ...; // 加载图片或其他初始化工作 } ``` 4. **编译生成 MEX 文件** - 运行 `mex` 命令完成最终可执行体的构建过程。 #### 方法二:Python API 结合 MATLAB Engine API 随着近年来对跨平台兼容性的重视程度不断提高,MathWorks 提供了一个名为 “MATLAB Engine for Python” 的接口层,它让开发者可以在 Python 程序里无缝调用 MATLAB 功能的同时也反过来实现了相反方向上的互访能力。因此如果已经熟悉了基于 Python 版本的 OpenCV,则可以考虑采用这种方式来进行快速原型验证或是实验性质的研究活动。 - 需要先确保已正确设置了 Python 解释器环境变量 PATH 项指向 Anaconda 或其他发行版根目录下的 Scripts 子文件夹位置; - 下载并按照官方指南安装最新稳定版本的 NumPy、SciPy 和 Matplotlib 科学计算包集合; - 导入所需软件包并通过 PyCall 执行任意合法语句串作为输入参数传递给 eval() 函数对象实例化后的 handle 属性成员方法 call()。 ```python import matlab.engine as mateng from matplotlib import pyplot as plt import numpy as np import cv2 def show_image(image_path): eng = mateng.start_matlab() image_data = cv2.imread(image_path) fig_handle = eng.figure() # 将图像转换成适合显示的形式 rgb_img = cv2.cvtColor(image_data,cv2.COLOR_BGR2RGB) # 显示图像 eng.imshow(matlab.uint8(rgb_img.tolist())) plt.show(block=True) ``` 上述两种途径各有优劣之处,在实际应用过程中可根据个人喜好和技术背景灵活选用最合适的方案。值得注意的是,尽管存在这些桥梁机制帮助我们跨越不同编程生态之间的鸿沟,但在某些情况下仍需付出额外努力去解决可能出现的各种兼容性和性能瓶颈等问题。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值